Python: Zugreifen auf YAML-Werte unter Verwendung der Punktnotation
Ich verwende eine YAML-Konfigurationsdatei. Das ist also der Code, um meine Konfiguration in Python zu laden:
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
Dieser Code erstellt tatsächlich ein Wörterbuch. Jetzt ist das Problem, dass ich Tonnen von Klammern verwenden muss, um auf die Werte zuzugreifen.
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']) # <--
Ich würde so etwas vorziehen (Punktnotation):
config('mysql.user.pass')
So ist meine Idee, die PyStache render () Schnittstelle zu verwenden.
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)
Wäre das eine "gute" Lösung? Wenn nicht, was wäre eine bessere Alternative?
Zusätzliche Frage [Gelöst]
Ich habe mich für die Lösung von Ilja Everilä entschieden. Aber jetzt habe ich eine zusätzliche Frage: Wie würden Sie eine Wrapper-Konfigurationsklasse um DotConf erstellen?
Der folgende Code funktioniert nicht, aber ich hoffe, Sie haben eine Vorstellung davon, was ich versuche:
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__'
Lösun
Sie müssen nur @ übergebself
an den Konstruktor der Superklasse.
DotDict.__init__(self, yaml.safe_load(file))
Sogar bessere Lösung (Ilja Everilä)
super().__init__(yaml.safe_load(file))