NotImplementedError को बढ़ाने के बजाय NotImplemented को वापस क्यों करें


281

पायथन में एक सिंगलटन है NotImplemented

कोई व्यक्ति अपवाद NotImplementedको बढ़ाने के बजाय कभी क्यों लौटना चाहेगा NotImplementedError? क्या यह सिर्फ कीड़े खोजने के लिए कठिन नहीं होगा, जैसे कि कोड जो अमान्य तरीकों को निष्पादित करता है?

जवाबों:


280

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

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

उस लिंक को संक्षेप में प्रस्तुत करने के लिए:

" NotImplementedरनटाइम को संकेत देता है कि उसे ऑपरेशन को संतुष्ट करने के लिए किसी और से पूछना चाहिए। अभिव्यक्ति में a == b, यदि a.__eq__(b)रिटर्न देता है NotImplemented, तो पायथन कोशिश करता है b.__eq__(a)। यदि bवह लौटने के लिए पर्याप्त जानता है Trueया False, तो अभिव्यक्ति सफल हो सकती है। यदि यह नहीं होता है, तो रनटाइम होगा। बिल्ट-इन व्यवहार (जो पहचान के लिए ==और !=) पर आधारित है, पर वापस जाएं । "


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

16
जब पायथन दुभाषिया जाँच करता है कि क्या a.__eq__(b)NotImplemented लौटा है, तो क्या वह आसानी से NotImplementedError को नहीं पकड़ सकता है (और कॉल करें b.__eq__(a)या फिर जो भी हो)?
वेकी जूल

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

3
पहले बिंदु के लिए, यहां तक ​​कि तेज़ समाधान स्वचालित रूप से लेफ्ट को संश्लेषित जीईटी के रूप में संश्लेषित करना होगा, इसके बजाय हमेशा कुछ ऐसा कॉल करना जो NotImplemented लौटेगा - और पायथन ऐसा नहीं करता है। मुझे नहीं लगता कि गति यहाँ का कारण है। और दूसरे के लिए, मुझे समझ में नहीं आ रहा है कि आप क्या कह रहे हैं: वापसी के लिए बस उतनी ही उथल-पुथल से उबरने की आवश्यकता होगी जितनी कि उठानी होगी। वास्तव में, आप एक विशेष रिटर्न अपवाद को बढ़ाने के रूप में वापसी की कल्पना कर सकते हैं, जो हमेशा कॉलिंग स्कोप में पकड़ा जाता है।
वेकी जूल

2
>> "सूची के आकार द्वारा आवर्धित किया गया" कम से कम, जब तक कि आपके पास एक ओ (एन) न हो जिस तरह से दुनिया को जानना चाहिए।
जोनाथन हार्टले

106

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

डॉक्स को उद्धृत करना (पायथन 3.6):

कार्यान्वित नहीं

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

अपवाद NotImplementedError

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

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


13

एक कारण प्रदर्शन है। समृद्ध तुलना जैसी स्थिति में, जहां आप कम समय में बहुत सारे ऑपरेशन कर सकते हैं, बहुत सारे अपवादों को सेट करना और उन्हें संभालना बस एक NotImplementedमूल्य वापस करने से बहुत अधिक समय ले सकता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.