最近在用python的cPickle和Pickle模塊來序列化,如果對序列化不了解,可以點擊這里,序列化的時候遇到一個問題
TypeError: can't pickle instancemethod objects
在谷歌百度上查了很多,但是終究沒有答案,我突然想,一般如果類比較簡單,不能是不被pickle的,所以我想,一定是初始化一個實例的時候實例的屬性某些屬性導致不能被pickle,那么如果判斷哪些屬性是不能被pickle的呢?這里可以通過寫一個函數來實現
- 首先在類中定義__getstate__()函數
-
def __getstate__(self): return self.__dict__
- 然后你可以定義
get_pickling_errors()函數
-
1 import pickle 2 def get_pickling_errors(obj,seen=None): 3 if seen == None: 4 seen = [] 5 try: 6 state = obj.__getstate__() 7 except AttributeError: 8 return 9 if state == None: 10 return 11 if isinstance(state,tuple): 12 if not isinstance(state[0],dict): 13 state=state[1] 14 else: 15 state=state[0].update(state[1]) 16 result = {} 17 for i in state: 18 try: 19 pickle.dumps(state[i],protocol=2) 20 except pickle.PicklingError: 21 if not state[i] in seen: 22 seen.append(state[i]) 23 result[i]=get_pickling_errors(state[i],seen) 24 return result
- 那如何使用呢?
-
>>> my_instance = My_Class() >>> get_pickling_errors(my_instance) {'_gen': {}, '_base': {'_gens': None}}
這說明類My_Class的實例my_instance的屬性_gen以及其父類的_gen是不能被pickle的
通過上面的方法,我找到了不能被pickle的實例的屬性.成功解決了我的問題.