2009-05-18 23 views
171

पाइथन को एक सिंगलटन है जिसे NotImplemented कहा जाता है।क्यों नहीं आया IIforplementedError

क्यों किसी को कभी NotImplemented वापस जाने के लिए बजाय NotImplementedError अपवाद को ऊपर उठाने चाहेगा? क्या यह केवल अजीब तरीकों को निष्पादित करने वाले कोड जैसे बग खोजने में कठिन नहीं होगा?

उत्तर

184

ऐसा इसलिए है क्योंकि __lt__() और संबंधित तुलना विधियां आमतौर पर सूची प्रकारों पर अप्रत्यक्ष रूप से उपयोग की जाती हैं। कभी-कभी एल्गोरिदम किसी अन्य तरीके से प्रयास करने या डिफ़ॉल्ट विजेता चुनने का विकल्प चुनता है। एक अपवाद उठाना जब तक पकड़ा नहीं जाता है, जबकि NotImplemented उठाया नहीं जाता है और आगे के परीक्षणों में इसका उपयोग किया जा सकता है।

http://jcalderone.livejournal.com/32837.html

उस लिंक को संक्षेप में प्रस्तुत करने के लिए:। क्रम है कि यह किसी और से पूछने आपरेशन को पूरा करने के लिए करना चाहिए

"NotImplemented संकेतों अभिव्यक्ति a == b में, यदि a.__eq__(b) रिटर्न NotImplemented, तो अजगर की कोशिश करता b.__eq__(a)bTrue या False वापस करने के लिए पर्याप्त जानता है, तो अभिव्यक्ति सफल हो सकती है। यदि ऐसा नहीं होता है, तो रनटाइम अंतर्निहित व्यवहार में वापस आ जाएगा (जो iden पर आधारित है == और != के लिए tity)। "

+4

मैं इसका उपयोग करके सावधान रहूंगा, क्योंकि यह लिंक दस्तावेज़ के अंत के पास बताता है। –

+8

जब पाइथन दुभाषिया जांचता है कि 'a .__ eq __ (बी)' वापस नहीं आया है, तो क्या यह आसानी से नहीं आया है, इसके बजाय NotImplementedError (और 'b .__ eq __ (ए) 'या फिर जो भी हो)? – Veky

+11

@ वेकी। एक अपवाद उठाने के लिए शायद एक उच्च ओवरहेड है। एक तरह के ऑपरेशन में किसी भी ओवरहेड को सूची के आकार से बड़ा किया जाएगा, भले ही अंतर बहुत छोटा था, फिर भी यह तेजी से कार्यान्वयन को समझने के लिए समझ में आता है। आप भी अपने लूप से बाहर नहीं निकलना चाहते हैं और उनको पुन: पेश करना नहीं चाहते हैं जो एक प्रयास/पकड़ कार्यान्वयन की आवश्यकता होगी। – SpliFF

9

एक कारण प्रदर्शन है। समृद्ध तुलना की स्थिति में, जहां आप थोड़े समय में बहुत से परिचालन कर रहे थे, कई अपवादों को स्थापित करने और संभालने में NotImplemented मान वापस करने से काफी लंबा समय लग सकता है।

-4

ऐसे कार्य हैं जो अपवाद और कार्यों को बढ़ाते हैं जो return NotImplemented बाद के लिए हो सकते हैं .... यह वास्तव में प्रोग्रामर/डिज़ाइन पर निर्भर करता है। यही कारण है कि वे दोनों उपयोग के लिए हैं।

+14

कृपया पायथन के जेन की समीक्षा करें ('>> इसे आयात करें)। लाइन 13 पर विशेष ध्यान दें: "एक होना चाहिए - और अधिमानतः इसे करने का एकमात्र तरीका।" पायथन रूबी या पर्ल या कोई अन्य भाषा नहीं है जहां कुछ करने के समान रूप से वैध तरीके हैं। जवाब कभी नहीं है कि यह प्रोग्रामर स्वाद के लिए है। – ArtOfWarfare

18

क्योंकि उनके पास अलग-अलग उपयोग के मामले हैं।

का हवाला देते हुए डॉक्स (अजगर 3.6):

NotImplemented

द्विआधारी विशेष तरीके से किया जाना चाहिये (जैसे __eq__(), __lt__(), __add__(), __rsub__(), आदि) से संकेत मिलता है कि ऑपरेशन अन्य प्रकार

के संबंध में लागू नहीं किया गया है

exception NotImplementedError

[...] उपयोगकर्ता परिभाषित आधार कक्षाओं में, सार तरीकों इस अपवाद जब वे व्युत्पन्न वर्ग की आवश्यकता होती है विधि ओवरराइड करने के लिए, या, जबकि कक्षा इंगित करने के लिए विकसित किया जा रहा उठाना चाहिए कि वास्तविक कार्यान्वयन को अभी भी जोड़ने के लिए की आवश्यकता है।

विवरण के लिए लिंक देखें।

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