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'))
Đoạn mã trên báo cáo một đặc điểm năng động. Mọi thứ hoạt động như mong đợi trong mã này. Tuy nhiên, sử dụng một mới quá trình python và cách làm như sau:đặc điểm động không tồn tẩy
>>> from traits_pickle_problem import Person, Client
>>> p=cPickle.load(open('testTraits.pkl','rb'))
>>> p.client.data.append(1000)
nguyên nhân không có báo cáo danh sách append. Tuy nhiên, hãy thiết lập lại người nghe riêng biệt như sau:
>>> p.client.on_trait_event(p.report,'data_items')
>>> p.client.data.append(1000)
client added-- [1000]
làm cho nó hoạt động trở lại.
Tôi có thiếu thứ gì đó hay bộ xử lý cần phải được thiết lập lại trong __setstate__
trong quá trình bỏ ghim.
Bất kỳ trợ giúp nào được đánh giá cao. Điều này là dành cho Python 2.7 (32-bit) trên các cửa sổ với các đặc điểm phiên bản 4.30.
Tôi nhìn vào hastraits souce, và không thể tìm thấy bất cứ điều gì hữu ích về cách nó lưu trữ các trình xử lý gọi lại. Tôi đã quá thiếu kiên nhẫn. Dù sao, vấn đề dường như không nằm trong mã của bạn, nhưng trong các đặc điểm. Tôi tìm thấy nó hacky, nhưng tôi nghĩ rằng setstate là con đường để đi. Chỉ cần nhớ rằng __setstate__ nhận dụ dict là một đối số, mà bạn phải gán cho self .__ dict__ trước khi thiết lập lại trình xử lý. – Kenny