それは醜くはありません。ドット表記は、別のカスタム クラスのオブジェクト内におそらく何らかのカスタム クラスのオブジェクトがあることを意味します。より実現可能な方法は、辞書 (ブラケット表記を使用する) を使用することです。
しかし、あなたが主張するなら、おそらく次のようにコードを翻訳することができます:
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'
編集: Sven MarnachConfig('config.ini')
は、カスタム クラスのインスタンスであると指摘しました。これはディクショナリではなく、非常に便利なカスタム メソッドがいくつかありますが、一部の構成オプションにアクセスできなくなる可能性があります (名前の競合がある場合)。したがって、推奨されるアプローチは、前述のソリューションを使用するのではなく、ブラケット表記を使用して構成オプションにアクセスすることです。