आप तय है और इसके क्रियान्वयन कैसे किसी भी पूर्व-unpicklable प्रकार मसालेदार हो जाता है और unpickled कर सकते हैं: देखने के मानक पुस्तकालय मॉड्यूल copy_reg (पायथन 3. * में copyreg
नाम दिया)।
अनिवार्य रूप से, आपको एक फ़ंक्शन प्रदान करने की आवश्यकता है, जिसने टाइप का उदाहरण दिया है, इसे एक ट्यूपल में कम कर देता है - उसी प्रोटोकॉल के साथ reduce विशेष विधि (सिवाय इसके कि विशेष विधि को कम करने के लिए कोई तर्क नहीं होता है, तब से बशर्ते वह वस्तु पर सीधे कहा जाता है, जबकि समारोह उपलब्ध कराने केवल तर्क के रूप में वस्तु ले जाएगा)। एक प्रतिदेय, और तर्कों की किसी टपल इसे करने के लिए पारित करने के लिए:
आमतौर पर, टपल तुम वापस 2 आइटम नहीं है। प्रतिदेय एक "सुरक्षित निर्माता" के रूप में पंजीकृत होना जरूरी है या समतुल्य एक सही मूल्य के साथ एक विशेषता __safe_for_unpickling__
है। उन वस्तुओं मसालेदार किया जाएगा, और unpickling समय में प्रतिदेय दिए गए तर्कों के साथ बुलाया जाएगा और बिखरा हुआ वस्तु लौट जाना चाहिए।
उदाहरण के लिए
, मान लीजिए कि आप, नाम से सिर्फ अचार मॉड्यूल करना चाहते हैं ताकि उन्हें unpickling अर्थ केवल यह है पुनः आयात करने के लिए उन्हें (यानी सादगी है कि आप के बारे में गतिशील रूप से संशोधित मॉड्यूल, नेस्ट संकुल, आदि परवाह नहीं है के लिए लगता है, बस सादा शीर्ष-स्तरीय मॉड्यूल)।तब:
>>> import sys, pickle, copy_reg
>>> def savemodule(module):
... return __import__, (module.__name__,)
...
>>> copy_reg.pickle(type(sys), savemodule)
>>> s = pickle.dumps(sys)
>>> s
"c__builtin__\n__import__\np0\n(S'sys'\np1\ntp2\nRp3\n."
>>> z = pickle.loads(s)
>>> z
<module 'sys' (built-in)>
मैं अचार के पुराने ढंग का ASCII प्रपत्र का उपयोग कर रहा है, ताकि s
, स्ट्रिंग अचार युक्त, आसान जांच करने के लिए है: यह कॉल करने के लिए unpickling निर्देश देता में निर्मित आयात समारोह, के साथ स्ट्रिंग sys
अपने एकमात्र तर्क के रूप में। और z
दिखाता है कि यह वास्तव में वांछित के रूप में, अनपिकलिंग के परिणामस्वरूप अंतर्निहित sys
मॉड्यूल को वापस देता है।
अब, आपको __import__
की तुलना में चीजों को थोड़ा अधिक जटिल बनाना होगा (आपको गतिशील परिवर्तनों को सहेजने और पुनर्स्थापित करने, घोंसला वाले नामस्थान आदि को नेविगेट करने, और इस प्रकार आपको भी करना होगा) copy_reg.constructor
पर कॉल करें (मॉड्यूल-सेविंग फ़ंक्शन जो आपके अन्य फ़ंक्शन को लौटाता है (और, यदि एक अलग रन में भी है, तो आप उन फ़ंक्शंस को अनपिक करने से पहले जो फ़ंक्शन का उपयोग करके बनाते हैं) से पहले कॉल करें। लेकिन मुझे उम्मीद है कि यह साधारण मामलों यह दिखाने में मदद करता है कि इसमें वास्तव में कुछ भी नहीं है जो कि "आंतरिक रूप से जटिल" है! -
जावा बीन्स .. पायथन पिकल्स .. मैं इसके साथ आने वाले नरों को थ्रॉटल करना चाहता हूं cutesy stuff –