1

我一直想通过从一个简单的文本文件中读取它们来定义 Python 中的变量。因此,我对 ConfigParser、ConfigObj、PyYaml 和 JSON 做了一些阅读。目前我对 ConfigObj 和 PyYaml 特别感兴趣。但是,我还没有设法以干净的方式做我想做的事情。

使用 ConfigObj 和 PyYaml,我可以将外部文本文件中定义的所有内容加载到字典中。我想通过提取所有键值对并将它们作为单独的变量存储到我的交互式工作区中来继续使用这本字典。

这是迄今为止我一直在使用的 PyYaml 方式:

import yaml

config_file = open('myFile', 'r')
config = yaml.read(config_file)

keys = config.keys()
values = config.values()

for i in range(len(keys)):
    string = keys[i] + '=' + str(values[i])
    eval(string)

eval由于可能允许各种恶意事情发生,使用有时会令人不悦。因此,我想知道 PyYaml 和/或 ConfigObj 是否具有实现上述功能的内置功能?

4

2 回答 2

2

假设我正确理解了您的问题,以下内容应该可以满足您的要求。

注意:我在覆盖之前检查密钥是否存在,否则将其放在稍微不同的名称下。

import yaml

config_file = open('myFile', 'r')
config = yaml.read(config_file)

keys = config.keys()
values = config.values()

for key,val in zip(keys,values):
    if key not in locals():
        locals()[key] = val
    else:
        locals()[key+"_yaml"] = val

虽然这可行,但我实际上建议您坚持使用包含您的值的字典。如果局部变量不存在,仅引用字典有什么问题?

于 2013-07-26T05:30:35.893 回答
1

如果你

import __main__

那么你也能

__main__.__dict__[keys[i]] = values[i]

甚至

__main__.__dict__.update(config)

这是否明智在很大程度上取决于当您的全局函数被 yaml 条目覆盖时,您对惊讶的重视程度。

于 2013-07-26T05:14:57.347 回答