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'))
위의 코드는 동적 특성을보고을 산세 생존하지 않습니다. 이 코드에서는 모든 것이 예상대로 작동합니다. 그러나, 새로운 파이썬 프로세스를 사용하여 다음을 수행 :동적 특성은
>>> from traits_pickle_problem import Person, Client
>>> p=cPickle.load(open('testTraits.pkl','rb'))
>>> p.client.data.append(1000)
원인 목록 APPEND없이 보고서을. 그러나 청취자를 다음과 같이 별도로 다시 설정하십시오.
>>> p.client.on_trait_event(p.report,'data_items')
>>> p.client.data.append(1000)
client added-- [1000]
이 다시 작동합니다.
내가 누락되었거나 처리기가 unpickling 프로세스 중에 __setstate__
에 다시 설정되어야합니까?
도움을 주시면 감사하겠습니다. 이 기능은 버전 4.30의 특징이있는 창에서 Python 2.7 (32 비트) 용입니다.
...
213: c GLOBAL 'traits.trait_handlers TraitListObject'
...
을하지만이 report
방법에 배선하는 방법에 대한 더 이상의 정보가 없습니다 : pickletools.dis(cPickle.dumps(p))
실행
나는 hastraits souce를보고 콜백 핸들러를 저장하는 방법에 대해 유용한 것을 찾을 수 없었다. 나는 너무 참을성이 없었다. 어쨌든, 문제는 코드에있는 것이 아니라 특성에 있습니다. 나는 그것을 해키라고 생각하지만, 나는 setstate가 갈 길이라고 생각한다. __setst____은 인스턴스 dict를 인수로 받음을 기억하십시오. 핸들러를 재설정하기 전에 self .__ dict__에 지정해야합니다. – Kenny