2017-10-20 50 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

您的回答很有幫助!我也會檢查你的包裝。感謝您的回覆:) –