Как я могу активировать уведомление о статическом событии Traits в списке?

Я работаю над презентацией черт из PyCon 2010 . Примерно в 2:30:45 докладчик начинает рассылать уведомления о событиях свойств , которые позволяют (среди прочего) автоматически вызывать подпрограмму при изменении свойства .

Я запускаю модифицированную копию примера, который он привел ... В этом испытании я пытаюсь проверить, могу ли я запускать статическое событие всякий раз, когда я делаю изменения в томе или входы .

from traits.api import HasTraits, Range, List, Float
import traits
class Amplifier(HasTraits):
    """
    Define an Amplifier (a la Spinal Tap) with Enthought's traits.  Use traits  
    to enforce values boundaries on the Amplifier's objects.  Use events to 
    notify via the console when the volume trait is changed and when new volume 
    traits are added to inputs.
    """
    volume = Range(value=5.0, trait=Float, low=0.0, high=11.0)
    inputs = List(volume)    # I want to fire a static trait event notification
                             # when another volume element is added

    def __init__(self, volume=5.0):
        super(Amplifier, self).__init__()
        self.volume = volume
        self.inputs.append(volume)

    def _volume_changed(self, old, new):
        # static event listener for self.volume
        if not (new in self.inputs):
            self.inputs.append(self.volume)
        if new == 11.0:
            print "This one goes to eleven... so far, we have seen", self.inputs

    def _inputs_changed(self, old, new):
        # static event listener for self.inputs
        print "Check it out!!"

if __name__=='__main__':
    spinal_tap = Amplifier()
    spinal_tap.volume = 11.0
    print "DIRECTLY adding a new volume input..."
    spinal_tap.inputs.append(4.0)
    try:
        print "NEGATIVE Test... adding 12.0"
        spinal_tap.inputs.append(12.0)
    except  traits.trait_errors.TraitError:
        print "Test passed"

Когда я запускаю этот скрипт, я вижу Этот идет до одиннадцати ... пока что мы видели [5.0, 11.0] в выводе консоли, поэтому я знаю, что _volume_changed () запускается, когда я назначаю 11.0 spinal_tap.volume .

Однако я никогда не вижу событий из _inputs_changed () . Независимо от того, какой пример я приготовил, я не могу получить список List для запуска события.

Это результат, который я вижу ... обратите внимание, что нет никаких свидетельств того, что _inputs_changed () когда-либо срабатывает.

[mpenning@Bucksnort ~]$ python spinaltap.py
This one goes to eleven... so far, we have seen [5.0, 11.0]
DIRECTLY adding a new volume input...
NEGATIVE Test... adding 12.0
Test passed
[mpenning@Bucksnort ~]$

Я запускал это как под Python2.6 / Cygwin / Windows 7, так и под Python 2.5 / Linux (все с использованием трейтов версии 4.0.0, которые я easy_install непосредственно отключил ] Сайт Enthought ). Результаты одинаковы, что бы я ни пробовал до сих пор.

Должен ли список Список вызывать статическое событие при использовании трейтов? Если да, то что я делаю не так?

6
задан Mike Pennington 4 December 2011 в 08:07
поделиться