如何在Python中检测嵌套对象的修改?

时间:2015-05-13 14:10:34

标签: python object magic-methods

说我有类似的东西(未经测试):

class Foo(object):
    def __init__(self):
        self.store = {}

    def __setitem__(self, key, value):
        self.store[key] = value
        print('Detected set')

    def __getitem__(self, key):
        return self.store[key]
仅当对象本身发生更改时才会调用

__setitem__

 foo = Foo()
 foo['bar'] = 'baz'

但是,例如,在以下情况下不会调用它:

 foo['bar'] = {}
 foo['bar']['baz'] = 'not detected inside dict'

我怎样才能发现这种情况,还是有其他方法可以做到这一点?我的目标是拥有一个类似于字典的对象,它总是与磁盘上的文件同步。

1 个答案:

答案 0 :(得分:1)

我建议使用shelve。我提供了一个持久的字典。 使用writeback=True打开文件强制与文件同步:

db = shelve.open('test.db', writeback=True)

就像dict一样对待它:

>>> db['a'] = {}
>>> db['a']['x'] = 10
>>> dict(db)
{'a': {'x': 10}}

关闭重新开启:

>>> db.close()
>>> db = shelve.open('test.db', writeback=True)
>>> dict(db)
{'a': {'x': 10}}

数据仍在那里。