構成ファイルがあり、さまざまなセクションの属性と構成ファイルの値を持つ Config クラスを作成したいと考えています。
たとえば、次のように設定された yaml ファイルがあります (ただし、json でも問題ありません)。
section1:
key1: value1
key2: value2
section2:
key1: value1
次のようにクラスを呼び出して属性を取得できるようにしたいと思います: Config.section1.key1
将来、このファイルに追加する必要があるかもしれないので、yaml ファイルの追加要素で Config クラスを更新できるようにしたいと考えています。
次のようにして、セクション名をインスタンス化されたオブジェクトに正常に割り当てることができます。
class Config(object):
def __init__(self):
with open("config.yml", 'r') as ymlfile:
cfg = yaml.load(ymlfile)
for section in cfg.items():
setattr(self, section[0], section[1])
これにより、次のことがうまく機能します。
config = Config()
print(config.section1)
しかし、Config クラス自体に対して同じことを行うことはできません。
また、ネストされた属性を格納する方法もわかりません。私はこれを試しました:
for section in cfg.items():
setattr(self, section[0], section[1])
for key in section[1]:
setattr(section, key, section[1][key])
ただし、次のエラーが返されるだけです。
Traceback (most recent call last):
File "config_so.py", line 13, in <module>
config = Config()
File "config_so.py", line 12, in __init__
setattr(section, key, section[1][key])
AttributeError: 'tuple' object has no attribute 'server'