Python Traits-在父级别调用函数,在List中修改项目时

时间:2015-06-01 19:22:57

标签: python events enthought traits

我正在尝试使用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时才会出现这种情况。有没有办法在测试的一个成分被修改时触发?

1 个答案:

答案 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()。