2009-12-26 13 views
10

मान लीजिए कि आपके पास एक नियमित दिन है जो तीन नामित पैरामीटर (जैसे ** तर्क) स्वीकार करता है, लेकिन इन तीनों में से कोई भी दो भरा होना चाहिए। अगर केवल एक भरा हुआ है, तो यह एक त्रुटि है। यदि तीनों हैं, तो यह एक त्रुटि है। आप किस तरह की त्रुटि उठाएंगे? RuntimeError, एक विशेष रूप से बनाया अपवाद, या अन्य?यदि तर्कों की गलत संख्या ** तर्कों में गुजरती है तो उठाने का क्या अपवाद है?

उत्तर

13

याद रखें कि आप पाइथन के अंतर्निहित अपवाद वर्गों को उपclass कर सकते हैं (और TypeError निश्चित रूप से यहां बढ़ने के लिए सही अंतर्निहित अपवाद वर्ग होगा - यही वह है जो पाइथन उठाता है यदि तर्क की संख्या सामान्य रूप से हस्ताक्षर से मेल नहीं खाती है हस्ताक्षर में *a या **k के बिना मामले)। मैं हर पैकेज को परिभाषित की जरूरत के रूप में अपने स्वयं के class Error(Exception), और फिर विशिष्ट अपवाद के रूप में उपयुक्त वारिस गुणा कर सकते हैं, उदा .:

class WrongNumberOfArguments(thispackage.Error, TypeError): 

फिर, मैं raise WrongNumberOfArguments चाहते जब मैं ऐसी समस्या स्थिति का पता लगाने के लिए होने पसंद है।

इस तरह, किसी भी कॉलर जो इस पैकेज से अवगत है उसे thispackage.Error पकड़ सकता है, अगर उन्हें पैकेज के लिए विशिष्ट त्रुटि से निपटने की ज़रूरत है, जबकि अन्य कॉलर्स (संभावित रूप से कॉल चेन में उच्चतर) कॉल अभी भी अधिक सामान्य TypeError पकड़ लेते हैं किसी भी त्रुटि से निपटने के लिए "फ़ंक्शन कॉल में उपयोग किए गए तर्कों की गलत संख्या"।

+0

यह कई विरासत का उपयोग करने का एक सुंदर उदाहरण है। धन्यवाद। –

3

मैं एक विशिष्ट बनाउंगा। आप इसे पकड़ने और है कि विशिष्ट अपवाद के साथ सौदा कर सकते हैं क्योंकि यह एक विशेष परिस्थिति है कि आप :)

4

बनाया है (जैसा कि आप टिप्पणियों में से एक में कहते हैं) है कि यह एक प्रोग्रामर त्रुटि है, तो आप AssertionError बढ़ा सकते हैं है:

def two(**kwargs): 
    assert len(kwargs) == 2, "Please only provide two args" 

बीटीडब्ल्यू, यदि आपके पास केवल तीन नामांकित तर्क हैं, ** kwargs ऐसा करने का एक अजीब तरीका प्रतीत होता है। अधिक प्राकृतिक हो सकता है:

def two(a=None, b=None, c=None): 
    pass 
0

मैं एक ValueError, या उसके एक उपवर्ग का प्रयोग करेंगे: "उठाया जब एक अंतर्निहित ऑपरेशन या समारोह एक तर्क सही प्रकार लेकिन एक अनुचित मूल्य होता है प्राप्त करता है, और स्थिति है इंडेक्स एरर जैसे अधिक सटीक अपवाद द्वारा वर्णित नहीं है। "

वास्तव में 2 की आवश्यकता होने पर 3 या 1 मान पास करना तकनीकी रूप से एक अनुचित मूल्य होगा यदि आप सभी तर्कों को एक ही टुपल मानते हैं ... कम से कम मेरी राय में! :)

11

क्यों नहीं पाइथन करता है?

>>> abs(1, 2, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: abs() takes exactly one argument (3 given) 
0

मैं एक कस्टम अपवाद की अनुशंसा करता हूं। इस तरह:

class NeedExactlyTwo(ValueError): 
    pass 

फिर आप अपने कोड में raise NeedExactlyTwo कर सकते हैं।

इसे अपने फ़ंक्शन के लिए डॉकस्ट्रिंग में दस्तावेज़ित करना सुनिश्चित करें।

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