基本上,我尝试腌制和恢复一个包含对象列表的 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 上设置腌制数据,再次触发事件。
关于如何避免这种情况的任何想法,即 cPickle.load(file) 时的第一个事件?