我正在使用抽象基类MutableMapping
实现配置文件(json)的包装器。代码如下所示:
import collections
import json
class ConfigWrapper(collections.MutableMapping):
def __init__(self, file_path):
self._data = None
self.file_path = file_path
self._read()
def __getitem__(self, key):
return self._data[key]
def __setitem__(self, key, value):
if self._data[key] != value:
self._data[key] = value
self._commit()
def __delitem__(self, key):
del(self._data[key])
def __iter__(self):
return iter(self._data)
def __len__(self):
return len(self._data)
def _read(self):
with open(self.file_path) as file:
self._data = json.load(file)
def _commit(self):
with open(self.file_path, "w") as file:
json.dump(self._data, file, indent=4)
如果调用__setitem__
,我希望我的包装器自动保存对配置文件的更改:
config = ConfigWrapper("afile.json")
config["key"] = "value" # first case
config["section"]["key"] = "value" # second case
第一种情况正常。但是,第二种情况不会触发_commit()
,因为使用了标准字典__setitem__
的{{1}}方法。
json文件可能包含深度未知的嵌套dicts。
问题:即使想要提交_data
更改,我如何解决这个问题?
提前致谢。