我正在尝试使用Traits来监视和执行List上的一些聚合/统计功能。为了简化问题,假设我有一个“TestScore”对象,它由名称,分数和四分位数组成。然后我有一个“TestBundle”,它包含一个TestScore列表。如果为其中一个TestScore对象更新了分数,我想调用一些功能来重新计算列表中所有TestScore对象的四分位数。我尝试过以下方法:
from traits.api import \
Float, List, HasTraits, Str, on_trait_change
class TestResult(HasTraits):
name = Str
score = Float
quartile = Float
class TestBundle(HasTraits):
tests = List(TestResult)
@on_trait_change('tests[]')
def update_quartiles(self):
# Code to go over all tests and update the quartile based
# on score
print "Updating Quartiles"
然而,只有在TestBundle.tests列表中添加或删除TestScore时才会出现这种情况。有没有办法在测试的一个成分被修改时触发?
答案 0 :(得分:1)
我偶然发现了答案。您可以扩展名称以包括需要监视的子参数名称。这在我的情况下实际上是理想的,因为我只想解雇" update_quartiles"当分数值改变时。可以这样做:
from traits.api import \
Float, List, HasTraits, Str, on_trait_change
class TestResult(HasTraits):
name = Str
score = Float
quartile = Float
class TestBundle(HasTraits):
tests = List(TestResult)
@on_trait_change('tests.score')
def update_quartiles(self):
# Code to go over all tests and update the quartile based
# on score
print "Updating Quartiles"
然后,如果更改了任何分数,或添加了新的TestResults,则执行TestBundle.update_quartiles()。