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

标签 python configuration syntax

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

str='home'
val=2
flt=7.0

我想在类初始化期间像这样调用它。目标之一是在文件中也定义变量类型。我知道 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()

这有可能吗?

最佳答案

好吧,有几种方法可以做到这一点。最简单的方法是使用 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)

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

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

您可以阅读以下主题,了解有关解析库的一些建议或其他比 eval() 更安全的替代方法: Python: make eval safe

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

关于python - 如何使用 python 文件中的数据初始化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5875902/

相关文章:

python - 在数组中导入数据集时,谷歌 Colab 中的 ram 用完了

c# - 包含来自类库的配置文件

使用 SharedPreferences 的 Android 小部件配置

css - ul,ul li 从 less 到 CSS

python - 如何为空集提供类型注释?

python - 如何将范围集合减少到最小范围集

ruby-on-rails - 如何从应用程序 Controller 中读取 ruby​​ on rails 配置值

mysql - before update 触发器生成哈希的语法

c - C 中返回函数指针的函数指针的语法

python - 使用 pySmartDL 并行下载 - python 多进程