जब से हम कोड है कि त्रुटि पैदा करता है की जरूरत नहीं है, मैं यह तब होता है जब आप एक व्यक्ति वस्तु अचार करने की कोशिश मान।
आपकी समस्या विशेष रूप से बढ़ावा के उपयोग से संबंधित नहीं है। यह सीपीकल मॉड्यूल में निहित है। इसमें नेस्टेड कक्षाओं के साथ समस्या पिकलिंग ऑब्जेक्ट है। स्पष्टीकरण के लिए यह answer देखें। यहाँ एक सरल कोड उदाहरण है कि त्रुटि पैदा करता है:
import cPickle
class MyOuterClass(object):
class MyInnerClass(object):
pass
def __init__(self):
self.my_inner_class = self.MyInnerClass()
def pickle_error():
print "Pickling ..."
my_outer_class = MyOuterClass()
print cPickle.dumps(my_outer_class)
if __name__ == "__main__":
pickle_error()
चल रहा है यह इस उत्पादन का उत्पादन:
Pickling ...
Traceback (most recent call last):
File "pickle.py", line 18, in <module>
pickle_error()
File "pickle.py", line 15, in pickle_error
print cPickle.dumps(my_outer_class)
cPickle.PicklingError: Can't pickle <class '__main__.MyInnerClass'>:
attribute lookup __main__.MyInnerClass failed
जुड़ा हुआ जवाब में उल्लेख किया है, जब cPickle यह रिटर्न '__main__.MyInnerClass'
जैसा कि इसके नाम के लिए भीतरी वर्ग पूछता है। हालांकि, यह नाम मॉड्यूल के नामस्थान में नहीं पाया जा सकता है, इसलिए आपको अपवाद मिलता है।
अब आप इस अनुभव क्योंकि के बाद से वहाँ अजगर में एक enum प्रकार के समान किसी चीज़ नहीं है, को बढ़ावा देने के लिए यह प्रतिनिधित्व करने के लिए एक वस्तु बना सकते हैं। Enum_ निर्माण वर्तमान दायरे में एक वर्ग की घोषणा करता है। कक्षा के दायरे को पकड़कर, आप व्यक्ति के भीतर एक घोंसला वर्ग बनाते हैं और आपको ऊपर वर्णित अचार त्रुटि मिलती है।
आपकी समस्या के कुछ समाधान हैं।
सबसे आसान व्यक्ति के दायरे के बाहर enum घोषित करना होगा। आप कोड संगठन के लिए इसके अलावा किसी व्यक्ति के संबंधित enum का पर्दाफाश नहीं करना चाहेंगे। इसके बाद आप एक उप मॉड्यूल में व्यक्ति वर्ग घोषित कर सकते हैं ताकि आपका enum कुछ भी सार्वजनिक रूप से बिना आपकी कक्षा के करीब घोषित किया जा सके।
आप boost's pickle support पर भी एक नज़र डाल सकते हैं। हालांकि मैंने कोशिश नहीं की है।
एक ऑब्जेक्ट आपके ऑब्जेक्ट को स्टोर करने के लिए अचार की तुलना में कुछ और उपयोग करने के लिए हो सकता है।
enums के अचार के साथ कुछ अजीबता है। यहां देखें: http://stackoverflow.com/questions/3214969/ –