如何使用 python 文件中的数据初始化类

fod*_*don 5 python syntax configuration

我想从调用脚本时指定的简单 python 文件中存储的数据来初始化一个类。名为myconfig.py的配置文件是:

str='home'
val=2
flt=7.0
Run Code Online (Sandbox Code Playgroud)

我想在课堂初始化期间这样称呼它。目标之一是在文件中定义变量类型。我知道 configparser,但如果可以使其工作,此方法就不那么冗长了。

class ClassInit(object):
    def __init__(self, configFile):
        fp, path, des = imp.find_module('',configFile)
        imp.load_module(configFile, fp, path, des)
        self.__dict__ = configFile.__dict__
        fp.close()

    def printVal(self):
        print '%s %0.2f'%(self.str, self.val)

if __name__ == '__main__':
    srcDir = 'src/'
    config = osp.join(srcDir, argv[0]) # config for current run 
    ci = ClassInit(config)
    ci.printVal()
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?

Boa*_*niv 2

嗯,有几种方法可以做到这一点。最简单的方法是在类范围内使用eval()exec评估此代码。但这也是最危险的方式,特别是如果这些文件可以由您以外的其他人创建。在这种情况下,创建者可以编写几乎可以做任何事情的恶意代码。您可以覆盖__builtins__全局字典的键,但我不确定这是否使 eval/exec 完全安全。例如:

class ClassInit(object):
    def __init__(self, configFile):
        f = open(configFile)
        config = f.read()
        f.close()
        config_dic = { '__builtins__': None}
        exec 'a = 4' in config_dic
        for key, value in config_dic.iteritems():
            if key != '__builtins__':
                setattr(self, key, value)
Run Code Online (Sandbox Code Playgroud)

此方法杀死了不安全的“ builtins ”对象,但它仍然不太安全。例如,该文件可能能够定义一个函数,该函数会使用恶意代码覆盖类的函数之一。所以我真的不推荐它,除非你绝对控制这些 .py 文件。

更安全但更复杂的方法是创建一个自定义解释器来解释此文件但不允许运行任何自定义代码。

您可以阅读以下线程,查看一些有关解析库的建议或其他更安全的替代方案eval()Python:使 eval 安全

此外,如果您只需要 config.py 文件以一种好的方式初始化一些变量,并且您不需要能够从其中调用花哨的 python 函数,那么您应该考虑使用 JSON。Python 2.6 及更高版本包含 simplejson,您可以使用它从文件初始化对象。语法是 Javascript,而不是 Python,但对于初始化变量来说,几乎没有什么区别。