而不是保存字典的副本并比较旧的和新的,就像这样:
dict = { "apple":10, "pear":20 }
if ( dict_old != dict ):
do something
dict_old = dict
如何检测字典的任何元素何时发生变化?
最佳答案
您可以子类化 dict
并包含一些自定义的 __setitem__
行为:
class MyDict(dict):
def __setitem__(self, item, value):
print "You are changing the value of %s to %s!!"%(item, value)
super(MyDict, self).__setitem__(item, value)
示例用法:
In [58]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:class MyDict(dict):
: def __setitem__(self, item, value):
: print "You are changing the value of %s to %s!!"%(item, value)
: super(MyDict, self).__setitem__(item, value)
:--
In [59]: d = MyDict({"apple":10, "pear":20})
In [60]: d
Out[60]: {'apple': 10, 'pear': 20}
In [61]: d["pear"] = 15
You are changing the value of pear to 15!!
In [62]: d
Out[62]: {'apple': 10, 'pear': 15}
您只需将 print
语句更改为包含您在修改时需要执行的任何检查。
如果您问的是如何检查特定变量名称是否被修改,这是一个更棘手的问题,尤其是如果修改不是在对象上下文或可以专门监视它的上下文管理器中发生的。
在这种情况下,您可以尝试修改globals
或locals
指向的dict
(取决于在你希望它发生的范围内)并将其切换出去,例如上面的 MyDict
之类的实例,除了您自定义创建的 __setitem__
可以只检查正在更新的项目是否与您要检查的变量名称匹配。那么就像您有一个后台“观察者”一样,它会密切关注该变量名称的变化。
不过,这是一件非常糟糕的事情。其一,这将涉及对 locals
和 globals
进行一些严重的破坏,这通常不是很安全。但也许更重要的是,通过创建一些容器类并在其中创建自定义更新/检测代码,实现起来要容易得多。
关于python - 如何检测字典中的任何元素是否发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26189090/