Python dict para objetar

Os objetos Python são, na verdade, dicts, portanto, é bastante simples representar uma estrutura dict como um objeto. Acho isso útil quando tenho estruturas semelhantes a uma configuração com vários níveis de aninhamento. É muito mais fácil usar essa estrutura do config.x.y.zque config['x']['y']['z'].

O código ficaria assim:

class DictToObject(object):

def __init__(self, dictionary):
def _traverse(key, element):
if isinstance(element, dict):
return key, DictToObject(element)
else:
return key, element

objd
= dict(_traverse(k, v) for k, v in dictionary.iteritems())
self
.__dict__.update(objd)

self.__dict__.updateatualizará a representação de dict interno do objeto com a nova estrutura fornecida e a chamada recursiva de DictToObjectin _traversecuidará de quaisquer dicts aninhados.

Exemplo de uso:

# let's pretend that you have loaded a json, yaml or other file
config_dict
= {
'group1': {
'server1': {
'apps': ('nginx', 'mysql'),
'cpus': 4
},
'maintenance': True
},
'firewall_version': '1.2.3',
'python2.7': True
}

config
= DictToObject(config_dict)
assert config.group1.server1.apps == ('nginx', 'mysql')
assert config.group1.maintenance
assert config.firewall_version == '1.2.3'
assert config.__dict__['python2.7'] # or use
assert config.__getattribute__('python2.7')

A versão completa do código pode ser encontrada nesta essência: Python dict to object