Это не уродливо, это лучше - точечная запись означает, что, возможно, существует некоторый пользовательский класс «объект внутри другого пользовательского класса».Более выполнимый способ - использовать словари (использующие скобочные обозначения).
Но если вы настаиваете, вы, вероятно, можете перевести код следующим образом:
def config2object(config):
"""
Convert dictionary into instance allowing access to dictionary keys using
dot notation (attributes).
"""
class ConfigObject(dict):
"""
Represents configuration options' group, works like a dict
"""
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
def __getattr__(self, name):
return self[name]
def __setattr__(self, name, val):
self[name] = val
if isinstance(config, dict):
result = ConfigObject()
for key in config:
result[key] = config2object(config[key])
return result
else:
return config
И тесты показывают ожидаемоерезультаты:
>>> c1 = {
'conf1': {
'key1': 'aaa',
'key2': 12321,
'key3': False,
},
'conf2': 'bbbb',
}
>>> c1
{'conf2': 'bbbb', 'conf1': {'key3': False, 'key2': 12321, 'key1': 'aaa'}}
>>> c2 = config2object(c1)
>>> c2.conf1
{'key3': False, 'key2': 12321, 'key1': 'aaa'}
>>> c2.conf1.key1
'aaa'
>>> c2.conf1.key3
False
>>> c2.conf2
'bbbb'
РЕДАКТИРОВАТЬ : Свен Марнах отметил, что Config('config.ini')
- это некоторый пользовательский экземпляр класса.Это не словарь, у него есть некоторые пользовательские методы, которые могут быть весьма полезны, но могут сделать некоторые параметры конфигурации недоступными (при конфликте имен).Поэтому предпочтительный подход состоит не в том, чтобы использовать решение, которое я упомянул, а в использовании скобочной записи для доступа к параметрам конфигурации.