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

Traitlets List won't run callback if the list is modified in-place

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

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 特征成员更改的回调?

我最近一直在玩小部件,traitlets does not seem to be able to observe such changes, there is the same problem with dictionnaries (see https://github.com/ipython/traitlets/issues/496了解更多详情)。

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