python - 如何检测字典中的任何元素是否发生变化?

标签 python dictionary

而不是保存字典的副本并比较旧的和新的,就像这样:

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 语句更改为包含您在修改时需要执行的任何检查。

如果您问的是如何检查特定变量名称是否被修改,这是一个更棘手的问题,尤其是如果修改不是在对象上下文或可以专门监视它的上下文管理器中发生的。

在这种情况下,您可以尝试修改globalslocals 指向的dict(取决于在你希望它发生的范围内)并将其切换出去,例如上面的 MyDict 之类的实例,除了您自定义创建的 __setitem__ 可以只检查正在更新的项目是否与您要检查的变量名称匹配。那么就像您有一个后台“观察者”一样,它会密切关注该变量名称的变化。

不过,这是一件非常糟糕的事情。其一,这将涉及对 localsglobals 进行一些严重的破坏,这通常不是很安全。但也许更重要的是,通过创建一些容器类并在其中创建自定义更新/检测代码,实现起来要容易得多。

关于python - 如何检测字典中的任何元素是否发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26189090/

相关文章:

ios - updateValue 不适用于字典

dictionary - 如何在 F# 中使用 StructuralComparison & Equality 制作 .NET Mutable Dictionary<T, T>

python - 使用字典列表值选择 pandas 数据框的列

python - Collection.loadTable : not found in GEE

python - Django 休息 : serializer field that isn't a model field

python - 在python中按特定年份分组数据

python - 将通过 pandas/pytables 编写的大型 hdf5 数据集转换为 vaex

ms-access - 无法将字典作为参数传递给 VBA 函数

java - 如何优雅地从 Map 中获取唯一元素

python - 如何使用python将列表列表拆分为列表中的每个列表到一个字典