क्या उन तरीकों के लिए NotImplementedError को उठाना पारंपरिक है, जिनका कार्यान्वयन लंबित है, लेकिन अमूर्त होने की योजना नहीं है?


34

मैं ऐसी NotImplementedErrorकिसी भी विधि के लिए जुटना पसंद करता हूं जिसे मैं लागू करना चाहता हूं, लेकिन जहां मैंने इसे अभी तक करने के लिए आस-पास नहीं किया है। मेरे पास पहले से ही एक आंशिक कार्यान्वयन हो सकता है, लेकिन इसे पहले से बता दें raise NotImplementedError()क्योंकि मुझे यह अभी तक पसंद नहीं है। दूसरी ओर, मैं भी सम्मेलनों से चिपके रहना पसंद करता हूं, क्योंकि इससे अन्य लोगों को अपना कोड बनाए रखने में आसानी होगी, और एक अच्छे कारण के लिए सम्मेलन हो सकते हैं।

हालांकि NotImplementedError राज्यों के लिए पायथन दस्तावेज़ :

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

यह मेरे वर्णन की तुलना में बहुत अधिक विशिष्ट, औपचारिक उपयोग का मामला है। क्या यह NotImplementedErrorइंगित करने के लिए कि यह एपीआई का एक हिस्सा है, प्रगति के लिए बस एक अच्छा, पारंपरिक शैली है ? यदि नहीं, तो क्या यह इंगित करने का एक अलग मानकीकृत तरीका है?


"उपयुक्त" से आपका क्या तात्पर्य है?
रॉबर्ट हार्वे

1
@RobertHarvey मुझे लगता है कि मैं पारंपरिक, सामान्य उपयोग के बाद मतलब है। मैंने अब अपने प्रश्न को पुनःप्रकाशित किया है।
गेरिट

1
हम मुख्य रूप से C # का उपयोग करते हैं, लेकिन इस तरह का अपवाद फेंकना यहाँ मुहावरा है, और मैं अन्यत्र अपेक्षा करूँगा। जल्दी तोड़ो और ज़ोर से तोड़ो जल्दी से संभावित मुद्दों की पहचान करने के लिए एक अच्छा दिशानिर्देश है (पढ़ें: सस्ते में)।
तेलस्टिन

आम तौर पर अगर मैं एक वर्ग बना रहा हूं तो मैं TODO टिप्पणियों को बिना कार्यान्वित किए गए तरीकों में डाल देता हूं जब तक कि मैं कार्यक्षमता को लागू करने के लिए चारों ओर नहीं पहुंच जाता। यदि ऐसा होने से पहले कक्षा को उत्पादन के लिए जारी किया जा रहा था, तो मैं अपवादों को फेंकने पर विचार करूंगा।

5
जब यह लायक होता है, तो यह Microsoft Visual Studio डिफ़ॉल्ट रूप से करता है जब आप IDE का उपयोग "इंटरफ़ेस लागू करने के लिए" करते हैं। रॉबर्ट हार्वे कहते हैं, परिणाम अच्छी तरह से समझा जाता है।
कैटफ़ूड

जवाबों:


34

यह ध्यान देने योग्य है कि, जबकि पायथन डॉक्यूमेंटेशन इस अपवाद के लिए एक उपयोग का मामला (और शायद विहित एक) प्रदान करता है, यह विशेष रूप से अन्य परिदृश्यों में इसके उपयोग को बाहर नहीं करता है।

यदि आप अभी तक बेस क्लास में एक विधि को ओवरराइड नहीं किया है ("इंटरफ़ेस" को पूरा करने के लिए) तो मैंने NotImplementedError अपवाद को उठाना उचित समझा।

Google पर एक सरसरी जाँच से पता चलता है कि लोग इस बात को समझेंगे कि यदि आप इस फैशन में अपवाद का उपयोग करते हैं तो आपका क्या मतलब है । इसके कोई दुष्प्रभाव या अनपेक्षित परिणाम नहीं हैं जो मुझे पता है; विधि बस एक अपवाद को फेंक देगी यदि इसे कहा जाता है, और यह एक अपवाद को फेंक देगा जो सभी द्वारा अच्छी तरह से समझा जाता है।


प्रलेखन अजगर 3 के लिए इस सटीक उपयोग को दर्शाता है:

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


+1, लेकिन मैं यह भी जोड़ूंगा कि इस तरह के अधिवेशन के लिए, थोड़ा दस्तावेज़ीकरण एक लंबा रास्ता तय कर सकता है। एक देव विकी में एक-लाइन नोट की तरह, रेपो रीडमे, या स्टाइल गाइडलाइन - कुछ इस तरह - यह समझाते हुए कि आप इस अपवाद का क्या उपयोग करते हैं।
बेन ली

8

यह समझा जाएगा, चाहे आप इसे करें या नहीं, स्थानीय (टीम या कंपनी) सम्मेलनों पर निर्भर होना चाहिए। ध्यान दें कि यह टीडीडी के संदर्भ में कम समझ में आता है क्योंकि परीक्षण ऐसा होना चाहिए जो यह निर्धारित करता है कि विधि लागू नहीं है।

संक्षिप्त संस्करण है: यदि आप और आपकी टीम इसे उपयुक्त मानते हैं तो उपयोग करें।


5
एफडब्ल्यूआईडब्ल्यू, परीक्षण को विफल करने के लिए अपवाद को फेंकने का एक अच्छा तरीका होना चाहिए, अगर किसी कारण से आपको उस व्यवहार को मजबूर करने की आवश्यकता होती है। (उदाहरण के लिए, यह विधि-परिभाषा intellisense स्टब के भाग के रूप में उपयोगी होगा।)
डग

1

ऐसा लगता है कि NotImplementedErrorआमतौर पर पायथन फ़ीचर के विकास के लिए खुद को उठाया जा रहा है, निम्न की तरह:

@classmethod
def fromkeys(cls, iterable, v=None):
    # There is no equivalent method for counters because setting v=1
    # means that no element can have a count greater than one.
    raise NotImplementedError(
        'Counter.fromkeys() is undefined.  Use Counter(iterable) instead.')

Documetation

fromkeys (iterable)

यह क्लास विधि काउंटर ऑब्जेक्ट्स के लिए लागू नहीं है।

स्रोत

Collections.Counter.fromkeys

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