2017-10-20 112 views
1

我已经提供了下面的代码。我只是想知道,如果有更好的,更简洁,方式加载整个索引变量,而不是手动指定每一个...自动导入YAML变量?

Python代码

script_dir = os.path.dirname(__file__) 
file_path = os.path.join(script_dir, 'config.yaml') 

with open(file_path, 'r') as stream: 
    index = 'two' 
    load = yaml.load(stream) 
    USER = load[index]['USER'] 
    PASS = load[index]['PASS'] 
    HOST = load[index]['HOST'] 
    PORT = load[index]['PORT'] 
    ... 

YAML配置

one: 
    USER: "john" 
    PASS: "qwerty" 
    HOST: "127.0.0.1" 
    PORT: "20" 
two: 
    USER: "jane" 
    PASS: "qwerty" 
    HOST: "196.162.0.1" 
    PORT: "80" 
+1

的可能的复制[解析在Python YAML文件,以及访问该数据?](https://stackoverflow.com/questions/8127686/parsing-a-yaml-file-in-python-and-访问数据) –

+0

尝试使用https://pyyaml.org/wiki/PYYAMLDocumentation – thatrockbottomprogrammer

+0

这提供了一个当前如何设置我的代码的示例。换句话说,我希望程序自动导入所有变量。 –

回答

0

Assing到globals()

import yaml 
import os 

script_dir = os.path.dirname(__file__) 
file_path = os.path.join(script_dir, 'config.yaml') 

index = 'two' 

with open(file_path, 'r') as stream: 
    load = yaml.safe_load(stream) 

for key in load[index]: 
    globals()[str(key)] = load[index][key] 

print(USER) 
print(PORT) 

这给:

jane 
80 

的几个注意事项:

  • 使用全局变量通常被认为是不好的做法
  • 正如评论注意到a p,这可能会导致问题如带有影子内置的键
  • 如果您必须使用PyYAML,则应使用safe_load()
  • 您应该考虑使用ruamel.yaml(免责声明:我是包的作者),在那里你可以得到相同的结果:

    import ruamel.yaml 
    yaml = ruamel.yaml.YAML(typ='safe') 
    

    ,然后再次使用load = yaml.load(stream)(这是安全的)。

+1

请注意,这可能会造成问题,因为它会影响内建结果以及True和False等内容。 –

+0

您的回答很有帮助!我也会检查你的包装。感谢您的回复:) –