1

基本的に、オブジェクトのリストを含む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)中の最初のイベントについて何か考えはありますか?

4

0 に答える 0