Импортировать переменные 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 Config
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 ответ
Решение
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)
(что безопасно).