基本的に、オブジェクトのリストを含むTraitsオブジェクトをピクルスにして復元しようとします。復元中に、リストの変更に関するイベント通知が2回発生します。
from enthought.traits.api import Int, HasTraits, List, on_trait_change
import cPickle
class Foo(HasTraits):
a = Int(1)
class Bar(HasTraits):
l = List(Foo)
@on_trait_change('l[]')
def _l_changed(self):
for x in self.l:
print x.a
def store(self):
file = open('test_state.pyd', 'w')
cPickle.dump(self.__getstate__(), file)
file.close()
def restore(self):
file = open('test_state.pyd')
self.__setstate__(cPickle.load(file))
file.close()
b = Bar(l=[Foo()])
b.store()
print 'restoring...'
b.restore()
復元につながります...11
問題は、pickleがオブジェクトbの属性だけでなく、オブジェクトb自体も(リストのために)pickle化することだと思います。この問題は、 https: //mail.enthought.com/pipermail/enthought-dev/2006-December/003707.htmlでも指摘されていますが、未回答です。次に、cPickle.load(file)を呼び出すと、すでにBarオブジェクトが作成され、イベントが発生します。次に、setstateメソッドは、現在のオブジェクトbにピクルス化されたデータを設定し、イベントを再度発生させます。
これをどのように回避できるか、つまりcPickle.load(file)中の最初のイベントについて何か考えはありますか?