[英]How to pickle an class that inherits from collections.deque?
示例很清楚,我有一個繼承到deque的類和一個模塊'collections'的方法,有時我使用defaultdict,有些則不然。
>>> from collections import deque, defaultdict
>>> import pickle
>>> class lista(deque):
... def __init__(self):
... deque.__init__(self)
... self.lib = defaultdict(dict)
...
>>> p = lista()
>>> p.append("a")
>>> p.append("b")
>>> p.lib['t']=0
>>> p.__reduce__()
(<class '__main__.lista'>, (['a', 'b'], None), {'lib': defaultdict(<type 'dict'>, {'t': 0})})
>>> pik = pickle.dumps(p)
>>> unpik = pickle.loads(pik)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1382, in loads
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 858, in load
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1133, in load_reduce
TypeError: __init__() takes exactly 1 argument (3 given)
>>>
最后一個問題,如何序列化這個對象?
Deque 初始化最多3個args :
class collections.deque([iterable[, maxlen]])
在進行unpickling時,會提供所有三個(包括self),而__init__
則不接受它們。 例如更改為
class lista(deque):
def __init__(self, iterable=(), maxlen=None):
deque.__init__(self, iterable, maxlen)
self.lib = defaultdict(dict)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.