Python Traits:对象的pickle列表,item设置两次

时间:2012-08-10 15:25:21

标签: python pickle traits

基本上,我尝试挑选和恢复包含对象列表的Traits对象。 在恢复时,列表更改的事件通知会被触发两次:

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()

将导致恢复... 1 1

我认为问题在于,pickle不仅会腌制对象b的属性,还会扼杀对象b本身(因为列表)。 这里也指出了这个问题https://mail.enthought.com/pipermail/enthought-dev/2006-December/003707.html,尽管没有答案。 然后调用cPickle.load(file),它就会创建一个Bar对象,触发事件。 然后, setstate 方法将在当前对象b上设置pickle数据,再次触发该事件。

有关如何避免这种情况的想法,即cPickle.load(文件)时的第一个事件?

0 个答案:

没有答案