python - 如果列表被就地修改,则 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 特征成员更改的回调?
解决方案
我最近一直在玩这些小部件,而traitlets似乎无法观察到这样的变化,字典也存在同样的问题(参见https://github.com/ipython/traitlets/issues/496更多细节)。
在我的项目中,我必须用几个键检测字典值的变化。我在字典中添加了一个计数器键,每次更新时我都重新创建了字典……但复制似乎是目前唯一的方法。
推荐阅读
- excel - 关闭用户窗体时需要关闭 Excel
- maven - 在 Maven 中执行依赖项中定义的构建插件
- php - 如何修复 laravel 中 ixudra/curl 中的错误且响应不正确
- typescript - Loopback 4 控制器 省略
- c# - 事件 KeyDown/KeyPress/KeyUp 如何获取按下按钮的名称?
- amazon-web-services - AWS CodeBuild 服务的 CIDR 范围是多少?
- python - 如何从 conda 中删除 env 目录?
- android - 如何在静态方法中正确使用静态布尔值
- sql - 从多列中选择字符串
- docker - 无法在 nginx 中将文件挂载为卷