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

Другие вопросы по тегам