में डिफ़ॉल्ट मान वापस करने का प्रयास करते समय पाइथन अचार दुर्घटना मेरे पास कक्षा की तरह एक शब्दकोश है जिसका उपयोग मैं कुछ मानों को गुणों के रूप में संग्रहीत करने के लिए करता हूं। मैंने हाल ही में कुछ तर्क (__getattr__
) को वापस करने के लिए जोड़ा है यदि कोई विशेषता मौजूद नहीं है। जैसे ही मैंने यह अचार दुर्घटनाग्रस्त कर दिया, और मैं कुछ अंतर्दृष्टि क्यों चाहता था?__getattr__
टेस्ट कोड:
import cPickle
class DictionaryLike(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __iter__(self):
return iter(self.__dict__)
def __getitem__(self, key):
if(self.__dict__.has_key(key)):
return self.__dict__[key]
else:
return None
''' This is the culprit...'''
def __getattr__(self, key):
print 'Retreiving Value ' , key
return self.__getitem__(key)
class SomeClass(object):
def __init__(self, kwargs={}):
self.args = DictionaryLike(**kwargs)
someClass = SomeClass()
content = cPickle.dumps(someClass,-1)
print content
परिणाम:
Retreiving Value __getnewargs__
Traceback (most recent call last):
File <<file>> line 29, in <module>
content = cPickle.dumps(someClass,-1)
TypeError: 'NoneType' object is not callable`
मैं कुछ बेवकूफ क्या किया? मैंने एक पोस्ट पढ़ा था कि अगर कोई कुंजी मौजूद नहीं है तो मुझे एक अपवाद फेंकने की आवश्यकता हो सकती है? अगर ऐसा कोई मामला है तो अपवाद फेंकने के बिना मैं जो हासिल करना चाहता हूं उसे हासिल करने का कोई आसान तरीका है?
अंत परिणाम यह हुआ कि कुछ कॉल
someClass.args.i_dont_exist
मैं चाहता हूँ अगर यह कोई नहीं लौटने के लिए है।
def __getattr__(self, key):
i = self.__getitem__(key)
if i == None:
raise AttributeError
return self.__getitem__(key)
मुझे लगता है कि इस व्यवहार के लिए आवश्यक है जा रहा हूँ:
मुझे लगता है कि यह मेरे मामले के लिए सबसे अच्छा हो सकता है, क्योंकि _ और \ _ \ _ कभी भी विशेषता नाम नहीं होंगे। – Nix
यह वास्तव में चालाक है मैंने कभी ऐसा नहीं सोचा – GWW
दोस्त आपने मुझे इतना बचाया – Greg