これは醜いわけではありません。ドット表記は、おそらくカスタムクラス '別のカスタムクラス'オブジェクト内のオブジェクトがあることを意味します。より実現可能な方法は、辞書(ブラケット記法を使用する)を使用することです。
しかし、あなたが主張する場合、あなたはおそらくそのようなコード変換することができます。
>>> 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'
EDIT:スヴェンMarnachはConfig('config.ini')
であることに留意
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
そしてテストが期待される結果を表示しますいくつかのカスタムクラスインスタンス。これは辞書ではなく、かなり便利なカスタムメソッドがいくつかありますが、(名前の競合がある場合)いくつかの設定オプションにアクセスできなくなる可能性があります。したがって、私が言及した解決策を使用するのではなく、ブラケット表記を使用して構成オプションにアクセスすることが好ましい方法です。
どのように 'ConfigParser'のすべての通常の属性にアクセスするのでしょうか? 'options'、' read'、 'get'、' write'などのような名前がかなりあります。これらの属性の名前空間を設定ファイルの名前空間と混在させるのは悪い考えです。とにかくこれをやりたいと思ったら、どうやって紛争を解決したいのかを詳述してください。私はあなたにそれをする方法を教えてくれるかもしれません - それほど難しいことではありません。 –
[変数名のデータを保持してください](http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html) – katrielalex
@SvenMarnach:あなたは属性について完全に正しいので、私はそれらを忘れて解決策を投稿しました。したがって、属性を使用していくつかの構成オプションにアクセスできないようにする可能性のある名前の競合も問題です。 – Tadeck