2016-02-23 5 views

उत्तर

11

hasattr की को Python2 कार्यान्वयन काफी अनुभवहीन है, यह सिर्फ उस विशेषता का उपयोग करना और देखना है कि क्या यह एक अपवाद है या नहीं उठाती है की कोशिश करता है।

दुर्भाग्य से, इसका मतलब है कि गुणों के अंदर किसी भी अनचाहे अपवाद निगल जाएंगे, और उस कोड में त्रुटियां खो सकती हैं। चोट के अपमान को जोड़ने के लिए, जब हैट्टर अपवाद खाता है, तो यह एक गलत जवाब भी देगा (यहां विशेषता a.foo मौजूद है, इसलिए परिणाम True कुछ भी लौटा देना चाहिए था)।

python3.2 + में, व्यवहार सही किया गया है:

hasattr(object, name)

तर्क एक वस्तु और एक स्ट्रिंग है। परिणाम True है यदि स्ट्रिंग ऑब्जेक्ट के गुणों में से एक का नाम है, False यदि नहीं है। (यह getattr(object, name) बुला और क्या यह एक AttributeError या नहीं उठाती देखकर कार्यान्वित किया जाता है।)

ठीक here है, लेकिन दुर्भाग्य है कि परिवर्तन backport नहीं किया।

यदि python2 व्यवहार आपके लिए परेशानी का कारण बनता है, तो hasattr का उपयोग करने से बचने के लिए विचार करें; इसके बजाय आप getattr को छोड़कर कोशिश कर सकते हैं, केवल AttributeError अपवाद को पकड़कर और किसी अन्य को अनचाहे उठाने दें।

+4

पायथन डॉक्स के उद्धरण के बावजूद, 'हैट्टर' व्यवहार अभी भी अजीब माना जा सकता है। यह सच है कि किसी संपत्ति के भीतर मनमाने ढंग से अपवादों का कारण अब अनुपस्थिति को अनुपस्थित नहीं माना जाता है (बल्कि कॉलर के चेहरे में सही उठाया जाता है), लेकिन अगर 'एट्रिब्यूट एरर' संपत्ति के भीतर कहीं से निकलता है, तो 'हैशर' का नतीजा अभी भी होगा 'झूठा' हो। यह जानबूझकर नहीं हो सकता है। (या ऐसा हो सकता है, इसलिए कोई संपत्ति स्वयं निर्धारित कर सकती है कि वह "वहां" होना चाहता है।) किसी भी मामले में, संपत्ति को निष्पादित करना साइड इफेक्ट्स आदि पर विचार करते हुए मुझे पहले गलत लगता है। –

+0

वास्तव में एक सीधा तरीका नहीं है यह निर्धारित करने के लिए कि क्या 'विशेषता Error' विशेषता-मशीनरी प्राप्त करने, या किसी संपत्ति में कोड द्वारा उठाया गया था। – kindall

संबंधित मुद्दे