首页 > 解决方案 > 如果列表被就地修改,则 Traitlets 列表将不会运行回调

问题描述

我有一个具有列表特征的类,我想在修改列表时使用它来调用函数。

class MyClass(traitlets.HasTraits):
    MyTrait = traitlets.List([0]*8, minlen=8, maxlen=8)


Foo = MyClass()


def Bar(change):
    print(change['new'])


Foo.observe(Bar, names='MyTrait')

我遇到的问题是,如果我执行以下操作,Bar则不会被调用:

Foo.MyTrait[0] = 5

如果我想Bar被叫,我必须做这样的事情:

MyTraitCopy = Foo.MyTrait.copy()
MyTraitCopy[0] = 5
Foo.MyTrait = MyTraitCopy

这似乎不是正确的方法。有没有更好的方法来注册对 List 特征成员更改的回调?

标签: pythonjupyter-notebookjupyteripywidgets

解决方案


我最近一直在玩这些小部件,而traitlets似乎无法观察到这样的变化,字典也存在同样的问题(参见https://github.com/ipython/traitlets/issues/496更多细节)。

在我的项目中,我必须用几个键检测字典值的变化。我在字典中添加了一个计数器键,每次更新时我都重新创建了字典……但复制似乎是目前唯一的方法。


推荐阅读