如果就地修改列表,则Traitlets列表将不会运行回调

时间:2018-07-23 15:40:07

标签: python jupyter-notebook jupyter ipywidgets

我有一个具有列表特征的类,只要列表被修改,我就想使用它来调用函数。

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特质的成员中的更改注册回调?

1 个答案:

答案 0 :(得分:1)

我最近一直在使用小部件,traitlets似乎无法观察到这种变化,字典也存在相同的问题(有关更多详细信息,请参见https://github.com/ipython/traitlets/issues/496

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