traits_pickle_problem.py
from traits.api import HasTraits, List
import cPickle
class Client(HasTraits):
data = List
class Person(object):
def __init__(self):
self.client = Client()
# dynamic handler
self.client.on_trait_event(self.report,'data_items')
def report(self,obj,name,old,new):
print 'client added-- ' , new.added
if __name__ == '__main__':
p = Person()
p.client.data = [1,2,3]
p.client.data.append(10)
cPickle.dump(p,open('testTraits.pkl','wb'))
Powyższy kod informuje dynamiczną cechę. Wszystko działa zgodnie z oczekiwaniami w tym kodzie. Jednak stosując nowy proces Python i wykonując następujące czynności:dynamiczne cechy nie przetrwać trawieniu
>>> from traits_pickle_problem import Person, Client
>>> p=cPickle.load(open('testTraits.pkl','rb'))
>>> p.client.data.append(1000)
przyczyn Nie Zgłoś z listy dopisywania. Jednak ponowne ustanowienie słuchacza osobno:
>>> p.client.on_trait_event(p.report,'data_items')
>>> p.client.data.append(1000)
client added-- [1000]
sprawia, że działa ponownie.
Czy czegoś brakuje lub czy należy ponownie ustanowić przewodnik w __setstate__
podczas procesu rozpylania.
Każda pomoc doceniona. Dotyczy to wersji Python 2.7 (32-bit) w oknach o cechach wersji 4.30.
Spojrzałem na sakiewkę hastraits i nie mogłem znaleźć nic użytecznego o tym, jak przechowuje ona procedury obsługi wywołań zwrotnych. Byłem zbyt niecierpliwy. W każdym razie problem nie leży w twoim kodzie, ale w cechach. Uważam, że jest to odjazdowe, ale myślę, że droga na szczyt to droga. Pamiętaj tylko, że __setstate__ odbiera dict instancji jako argument, który musisz przypisać do self .__ dict__ przed przywróceniem obsługi. – Kenny