動的オブジェクトを作成して、構成をその場で検証し、結果をオブジェクトとして提示しようとしました。私はそのようなクラスを作成することでこれを達成しようとしました:
class SubConfig(object):
def __init__(self, config, key_types):
self.__config = config
self.__values = {}
self.__key_types = key_types
def __getattr__(self, item):
if item in self.__key_types:
return self.__values[item] or None
else:
raise ValueError("No such item to get from config")
def __setattr__(self, item, value):
if self.__config._blocked:
raise ValueError("Can't change values after service has started")
if item in self.__key_types:
if type(value) in self.__key_types[item]:
self.__values[item] = value
else:
raise ValueError("Can't assing value in different type then declared!")
else:
raise ValueError("No such item to set in config")
SubConfig は、構成ファイル内のセクションのラッパーです。構成には、プログラムの開始後に値を変更する可能性を殺すためのスイッチがあります (値は初期化時にのみ変更できます)。
問題は、getattr の無限ループで値を設定するときです。私が読ん__getattr__
だように、そのように振る舞うべきではありません(最初に既存の attr を取得してから を呼び出します__getattr__
)。コードを利用可能な例と比較していましたが、何も得られません。
すべての問題がコンストラクターによって生成されることに気付きました。