Python: доступ к значениям YAML с использованием «точечной нотации»
Я использую файл конфигурации YAML. Так вот код для загрузки моей конфигурации в Python:
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
Этот код фактически создает словарь. Теперь проблема в том, что для доступа к значениям мне нужно использовать множество скобок.
YAML:
mysql:
user:
pass: secret
Python:
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
print(config['mysql']['user']['pass']) # <--
Я бы предпочел что-то подобное (точечная запись):
config('mysql.user.pass')
Итак, моя идея - использовать интерфейс рендеринга PyStache ().
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
import pystache
def get_config_value( yml_path, config ):
return pystache.render('{{' + yml_path + '}}', config)
get_config_value('mysql.user.pass', config)
Это было бы "хорошим" решением? Если нет, что было бы лучшей альтернативой?
Дополнительный вопрос [решено]
Я решил использовать решение Ильи Эверила. Но теперь у меня есть дополнительный вопрос: как бы вы создали класс-оболочку Config вокруг DotConf?
Следующий код не работает, но я надеюсь, вы поняли, что я пытаюсь сделать:
class Config( DotDict ):
def __init__( self ):
with open('./config.yml') as file:
DotDict.__init__(yaml.safe_load(file))
config = Config()
print(config.django.admin.user)
Ошибка:
AttributeError: 'super' object has no attribute '__getattr__'
Решение
Вам просто нужно пройтиself
конструктору суперкласса.
DotDict.__init__(self, yaml.safe_load(file))
Еще лучшее решение (Илья Эвериля)
super().__init__(yaml.safe_load(file))