Python: Acceso a valores YAML usando "notación de puntos"
Estoy usando un archivo de configuración YAML. Entonces este es el código para cargar mi configuración en Python:
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
Este código en realidad crea un diccionario. Ahora el problema es que para acceder a los valores necesito usar toneladas de corchetes.
Ñame:
mysql:
user:
pass: secret
Pitón:
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
print(config['mysql']['user']['pass']) # <--
Prefiero algo como eso (notación de puntos):
config('mysql.user.pass')
Entonces, mi idea es utilizar la interfaz 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)
¿Sería esa una "buena" solución? Si no, ¿cuál sería una mejor alternativa?
Pregunta adicional [Resuelto]
He decidido usar la solución de Ilja Everilä. Pero ahora tengo una pregunta adicional: ¿cómo crearía una clase de configuración de envoltura alrededor de DotConf?
El siguiente código no funciona, pero espero que te hagas una idea de lo que estoy tratando de hacer:
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)
Error:
AttributeError: 'super' object has no attribute '__getattr__'
Solución
Solo necesitas pasarself
al constructor de la superclase.
DotDict.__init__(self, yaml.safe_load(file))
Mejor solución (Ilja Everilä)
super().__init__(yaml.safe_load(file))