私はPyCon 2010 のプレゼンテーションに取り組んでいます。約 2:30:45 で、プレゼンターはtrait event notificationsの説明を開始します。これにより、(とりわけ) aが変更されたときはいつでもサブルーチンを自動的に呼び出すことができます。traits
trait
彼が与えた例の変更されたコピーを実行しています...この試行では、volume
またはに変更を加えるたびに静的イベントを起動できるかどうかを確認しようとしていますinputs
。
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"
このスクリプトを実行すると、コンソール出力で確認できるので、 に割り当てるとが起動されるThis one goes to eleven... so far, we have seen [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 の両方で実行しました (すべて、Enthought のサイトから直接入手しtraits
たバージョン 4.0.0 を使用しています)。これまでに何を試しても結果は同じです。easy_install
List
特性を使用するときに静的イベントを発生できるようにする必要がありますか? もしそうなら、私は何か間違ったことをしていますか?