将一些类变量保存和恢复的纯文本Python语法文件?

12 浏览
0 Comments

将一些类变量保存和恢复的纯文本Python语法文件?

在我的情况下,我想在文件中保存和恢复一些“常规”变量(即int、字符串),这些变量最终将成为类属性。这个例子是我最接近的,通过使用import

a.py

b = 134
a = "hello"

mytest.py

import inspect
class Teost:
  from a import *
  def __init__(self):
    self.c = 12
    print(inspect.getmembers(self)) # has a and b
    print(self.__dict__)            # no a and b
    print(self.a)                   # prints "hello"
xx = Teost()

因此,在这里a.py充当存储变量值(ab)的文件,而类内部的from a import *将它们作为类属性(self.aself.b)获取,这几乎是我想要的。

不幸的是,在类中使用星号的import语法是不被赞成的:

$ python mytest.py
mytest.py:3: SyntaxWarning: import * only allowed at module level
  class Teost:
[('__doc__', None), ('__init__', >), ('__module__', '__main__'), ('a', 'hello'), ('b', 134), ('c', 12)]
{'c': 12}
hello

... 因此,我得到了一个不好看的“SyntaxWarning:import * only allowed at module level”,我无法摆脱它(除非我禁用警告,但我不想这样做)

因此,我还有其他选择,可以使用写成a.py的文件(即采用纯文本、Python语法),并将其中的变量最终成为一些类属性吗?

(我看到了一个链接How do I save and restore multiple variables in python?,但我不感兴趣pickleshelve,因为它们都不会在Python语法的纯文本文件中写入)

admin 更改状态以发布 2023年5月22日
0
0 Comments

我的意思是,你可以做一些超级 hacky 的事情:

import inspect
import a
class A:
  def __init__(self):
    self.c = 12
    print(('a', 'hello')  in inspect.getmembers(self)) # has a and b
    print(('b', 134) in inspect.getmembers(self))
    print('a' in self.__dict__)            # no a and b
    print('b' in self.__dict__)
    print(self.a)                   # prints "hello"
for name in dir(a):
    if not name.startswith('__'): # very brittle here
        val = vars(a)[name]
        setattr(A, name, val)
x = A()

你可能想要将上述逻辑封装到一个元类中。

也许只是使用 exec 更简洁。如果你信任 a.py 的来源,那应该不会有太大问题。

0
0 Comments

你可以像这样将模块导入到你的类中:

代码:

class Teost:
    import a as _a_py_attrs
    def __init__(self):
        for name in dir(Teost._a_py_attrs):
            if not name.startswith('__'):
                setattr(self, name, getattr(Teost._a_py_attrs, name))

测试代码:

xx = Teost()
print(xx.__dict__)
print(xx.a)

结果:

{'a': 'hello', 'b': 134}
hello

作为类属性:

如果将它们作为类属性而不是实例属性更可取,可以这样做:

class Teost:
    """ My Test Class """
import a as _a_py_attrs
for name in dir(_a_py_attrs):
    if not name.startswith('__'):
        setattr(Teost, name, getattr(_a_py_attrs, name))

测试代码:

xx = Teost()
print(xx.__dict__)
print(xx.a)

结果:

{}
hello

0