प्रकार परिभाषित करते हैं कि तरीकों के एक या अधिक (काफी बड़े) सेट को परिभाषित करके इसका उदाहरण कैसे उठाया जाता है। प्रत्येक का अपना सूक्ष्म व्यवहार होता है। the docs on the pickle protocol देखें।
>>> l = collections.defaultdict(list)
>>> l.__reduce__()
(<type 'collections.defaultdict'>, (<type 'list'>,), None, None, <dictionary-itemiterator object at 0x7f031fb3c470>)
टपल में पहला आइटम वहाँ प्रकार है, और दूसरे मद जब यह instantiating प्रकार के पारित करने के लिए तर्क की टपल है: collections.defaultdict
के मामले में, यह __reduce__
विधि का उपयोग करता। यदि आप __reduce__
ओवरराइड नहीं करते हैं, तो पहला आइटम सही ढंग से आपके प्रकार में बदल जाएगा, लेकिन दूसरा आइटम नहीं होगा। यह आपको दिखाई देने वाली त्रुटि का कारण बनता है। आप इसे कैसे ठीक कर सकता है की एक कच्चे उदाहरण:
>>> import collections
>>> import pickle
>>> class C(collections.defaultdict):
... def __init__(self):
... collections.defaultdict.__init__(self, list)
... def __reduce__(self):
... t = collections.defaultdict.__reduce__(self)
... return (t[0],()) + t[2:]
...
>>> c = C()
>>> c[1].append(2)
>>> c[2].append(3)
>>> c2 = pickle.loads(pickle.dumps(c))
>>> c2 == c
True
यह केवल एक कच्चे उदाहरण है अचार (__reduce_ex__
की तरह) के लिए और अधिक और यह सब काफी जटिल है, क्योंकि है। इस मामले में, __getinitargs__
का उपयोग करना अधिक सुविधाजनक हो सकता है।
वैकल्पिक रूप से, आप कर सकते हैं अपने वर्ग के __init__
विधि एक वैकल्पिक प्रतिदेय ले, list
को दोषी, या तुम सिर्फ एक वर्ग के बजाय एक समारोह इस्तेमाल कर सकते हैं:
def listdict():
return collections.defaultdict(list)
स्रोत
2010-10-04 13:24:18
आप pickle' या उपयोग कर रहे हैं '' cpickle'? – aaronasterling
मैं 'cpickle' का उपयोग कर रहा हूं। –