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

questionAnswers(4)

yourAnswerToTheQuestion