检测具有未知深度的自定义MutableMapping类中的值更改

时间:2016-07-03 00:19:11

标签: python wrapper

我正在使用抽象基类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更改,我如何解决这个问题?

提前致谢。

0 个答案:

没有答案