使用 class 实例加载本地 python 模块的聪明方法?

Smart way to load a local python module with a class instance?

用 python class 实例加载本地 python 文件的聪明方法是什么,这样 python 文件中定义的所有变量都会添加到class的属性?

文件 vars.py 包含:

x = 2
y = 'fish'
for i in range(4):
    x = x * 3

然后以两种方式将 xy 加载到 class 中:

使用__import__()

注意:这会将模块中的所有全局变量填充到 class 中。很多垃圾。此外,导入的名称必须是一个包,而不仅仅是一个文件。

class DangerZone:
    def load_attrs(self, fn):
        _vars = __import__(fn)
        for attr_name, attr_val in _vars.items():
            self.__dict__[attr_name] = attr_val

使用exec()

好的,这很危险(从外部使用 exec() 到 运行 任意代码),但这里是。

class DangerZone:
    def load_attrs(self, fn):
        _globals = {}
        _locals = {}
        exec(open(fn).read(), _globals, _locals)
        for attr_name, attr_val in _locals.items():
            self.__dict__[attr_name] = attr_val

结果:

dz = DangerZone()
dz.load_attrs('vars.py')
print(dz.x, dz.y)

打印:

162 fish