我想从yaml文件导入设置,但在当前上下文中将它们作为常规变量使用。
例如我可能有一个文件:
param1: 12345
param2: test11
param3:
a: 4
b: 7
c: 9
我希望在我的代码中包含变量param1
,param2
,param3
。
我可能希望从任何函数中使用它,并且不希望它们全局可用。
我听说过locals()
和globals()
功能,但没有得到如何使用它们。
答案 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文件包含open
或print
密钥,该怎么办?它们将覆盖python的函数,因此示例中的print(param1)
将引发TypeError
异常。