当Array元素发生更改时,在Python traits包中触发事件



我正在使用Python的traits包,并试图找出使用traits.trait_numeric.Array类的正确方法。编写一个带有数组特征的traits.api.HasTraits的子类很简单,这样当数组发生变化时,就会触发一个on_ttrait_change,但当数组的元素被修改到位时,我不知道如何触发任何类型的事件。这里有一个最小的例子:

from traits.api import HasTraits
from traits.trait_numeric import Array
import numpy as np
class C(HasTraits):
    x = Array
    def __init__(self):
        self.on_trait_event(self.do_something, 'x')
    def do_something(self):
        print 'Doing something'
c = C()
# This line calls do_something()
c.x = np.linspace(0,1,10)
# This one doesn't, and I wish it did
c.x[3] = 100
# Same with this one
c.x[:] = np.ones(c.x.shape)

我希望traits.trait_numeric.Array有一些我不知道的内置功能,因为检测阵列的一部分何时发生变化似乎是一件非常标准的事情。

除此之外,我认为这个问题可能可以通过创建一个同样继承numpy.array的自定义特征类来解决,然后更改[]运算符,使其显式触发正确类型的特征事件。但希望这是一个我不必打开的蠕虫罐头。

恐怕这真的不可能。numpy数组查看原始内存。任何事情都可以在不经过numpy数组对象本身的情况下更改内存。我们通常使用的模式是在完成切片/索引分配后重新分配整个数组。

import numpy as np
from traits.api import Array, HasTraits, NO_COMPARE

class C(HasTraits):
    x = Array(comparison_mode=NO_COMPARE)
    def _x_changed(self):
        print 'Doing something'

c = C()
c.x = np.linspace(0, 1, 10)
# This does not trigger:
c.x[3] = 100
# This does:
c.x = c.x

最新更新