Я использую конфигурационный файл YAML. Так что это код для загрузки моей конфигурации в Python:Python: Доступ к значениям YAML с использованием «точечной нотации»
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 render().
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)
Будет ли это «хорошим» решением? Если нет, что было бы лучшей альтернативой?
Дополнительный вопрос [Решено]
Я решил использовать решение пользователя Ilya Everilä в. Но теперь у меня есть дополнительный вопрос: как бы вы создали оболочку класса 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__'
Решение
You просто нужно передать self
конструктору суперкласса.
DotDict.__init__(self, yaml.safe_load(file))
Еще лучше soltution (Ilja Everilä)
super().__init__(yaml.safe_load(file))
Использование механизма шаблонов для этого - действительно ужасный взлом. Пожалуйста, не делайте этого в каком-либо реальном приложении! – ThiefMaster
http://stackoverflow.com/questions/11049117/how-to-load-a-pyyaml-file-and-access-it-using-attributes-instead-of-using-the-di кажется связанным или даже duplicate – ThiefMaster