Python: acessando valores YAML usando "notação de ponto"
Estou usando um arquivo de configuração YAML. Portanto, este é o código para carregar minha configuração no Python:
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
Esse código, na verdade, cria um dicionário. Agora, o problema é que, para acessar os valores, preciso usar toneladas de colchetes.
YAML:
mysql:
user:
pass: secret
Pitão:
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
print(config['mysql']['user']['pass']) # <--
Eu preferiria algo assim (notação de ponto):
config('mysql.user.pass')
Então, minha ideia é utilizar a interface 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)
Essa seria uma solução "boa"? Caso contrário, qual seria uma alternativa melhor?
Pergunta adicional [Resolvido]
Eu decidi usar a solução de Ilja Everilä. Mas agora eu tenho uma pergunta adicional: como você criaria uma classe Config do wrapper em torno do DotConf?
O código a seguir não funciona, mas espero que você entenda o que estou tentando fazer:
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)
Erro:
AttributeError: 'super' object has no attribute '__getattr__'
Solução
Você só precisa passarself
para o construtor da superclasse.
DotDict.__init__(self, yaml.safe_load(file))
Solução ainda melhor (Ilja Everilä)
super().__init__(yaml.safe_load(file))