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))

Antworten auf die Frage(8)

Ihre Antwort auf die Frage