从文件导入设置

时间:2016-10-15 13:55:07

标签: python yaml

我想从yaml文件导入设置,但在当前上下文中将它们作为常规变量使用。

例如我可能有一个文件:

param1: 12345

param2: test11

param3:
    a: 4
    b: 7
    c: 9

我希望在我的代码中包含变量param1param2param3

我可能希望从任何函数中使用它,并且不希望它们全局可用。

我听说过locals()globals()功能,但没有得到如何使用它们。

2 个答案:

答案 0 :(得分:0)

您可以使用locals()['newvarname'] = 12345创建新变量。 您只需阅读文件并按照自己的意愿填写此结构。

您可以编写一个函数来调用它并导入设置:

import sys
import yaml


def get_settings(filename):
    flocals = sys._getframe().f_back.f_locals  # get locals() from caller
    with open(filename, 'r') as ysfile:
        ydata = yaml.load(ysfile.read())
    for pname in ydata:
        # assume the yaml file contains dict
        flocals[pname] = ydata[pname]  # merge caller's locals with new vars

答案 1 :(得分:0)

即使在@ baldr的答案中这个技巧很棒,我建议将变量赋值移出函数以获得更好的可读性。让函数改变其调用者的上下文似乎很难记住和维护。所以,

import yaml

def get_settings(filename):
    with open(filename, 'r') as yf:
        return yaml.load(yf.read())

def somewhere():
    locals().update(get_settings('foo.yaml'))
    print(param1)

即便如此,我强烈建议只使用字典。否则,你冒着非常奇怪的错误。例如,如果您的yaml文件包含openprint密钥,该怎么办?它们将覆盖python的函数,因此示例中的print(param1)将引发TypeError异常。