2012-11-16 12 views
24

एक तरीका यह सुनिश्चित करना है कि एक विधि एक विशेष kwarg साथ कहा जाता है की तरह होगा:पायथन: आवश्यक kwarg, जो उठाने के लिए अपवाद?

def mymethod(self, *args, **kwargs): 
    assert "required_field" in kwargs 

स्थापना एक AssertionError करने के लिए सबसे उपयुक्त बात की तरह प्रतीत नहीं होता। क्या एक अच्छा त्रुटि संदेश के साथ इसे संभालने के लिए अंतर्निहित अपवाद पर कोई सहमति है?

अधिक जानकारी: तीसरे पक्ष के सबक्लासिंग मुद्दे हैं जहां * args और ** kwargs kinda 'को पारित करने की आवश्यकता है इसलिए "आवश्यक_फील्ड" एक स्थितित्मक तर्क वास्तव में एक अच्छा विकल्प नहीं है।

+5

मुझे लगता है कि मानक बात यह है कि इसे 'डिफ़ॉल्ट तर्क' न बनाएं। – mgilson

+0

पहले से ही स्थितित्मक तर्क हैं जिन्हें मैं गड़बड़ नहीं करना चाहता हूं। –

+0

अधिक आम तौर पर, ऐसे मामले भी होते हैं, जो कि कई महत्वपूर्ण कुंजी तर्कों की उपस्थिति या मूल्यों के संबंध में विशिष्ट स्थितियों को पूरा करते हैं, केवल कुछ आवश्यक होने के साथ कई चाबियां स्वीकार कर सकती हैं। –

उत्तर

27
>>> def foo(bar): pass 
... 
>>> foo() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: foo() missing 1 required positional argument: 'bar' 

मैं सिर्फ लेखन त्रुटि के साथ जाना चाहते हैं ..

13

मानक पुस्तकालय जब यह तर्कों की गलत संख्या हो जाता है TypeError उठाना चाहते लगता है। यह अनिवार्य रूप से आपकी समस्या है, इसलिए मैं इसे उठाऊंगा।

उस ने कहा, **kwargs अनिवार्य रूप से अधिकांश समय के लिए डिफ़ॉल्ट तर्कों के लिए भरें, इसलिए एक आवश्यक डिफ़ॉल्ट तर्क होने से थोड़ा आश्चर्यजनक/भ्रमित लगता है।

नोट अजगर खुशी से आपको कीवर्ड से स्थितीय तर्क फोन देंगे:

>>> def foo(a, b): 
...  print a, b 
... 
>>> foo(a=1, b=2) 
1 2 
>>> foo(b=1, a=2) 
2 1 

लेकिन मुझे लगता है कि फिर वे सभी कीवर्ड (foo(2, a=2) काम नहीं करता है) द्वारा संदर्भित किया जाना है जो आप नहीं हो सकता चाहते हैं।

+0

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

0

आप इसे की जरूरत है एक आवश्यक कीवर्ड हो सकता है, की तरह कुछ कार्य करें:

def mymethod(self,myrequired=None): 
    if myrequired==None: 
     #raise error 
    #do other stuff down here 

आप वास्तव में नहीं करनी चाहिए kwargs से खींचने के लिए की जरूरत है।

+0

बस '* args, ** kwargs' जोड़ें :) –

0

मुझे लगता है कि KeyError सबसे उपयुक्त होगा, क्योंकि **kwargs एक dict है।

>>> def foo(**kwargs): 
... print kwargs['abc'] 
... 
>>> foo() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo 
KeyError: 'abc' 

तो क्षेत्र वास्तव में आवश्यक है, आप जांच कर सकता है के लिए यह

try: 
    kwargs['required'] 
except KeyError: 
    raise KeyError('required is a Required Argument')  
+1

' KeyError' आमतौर पर डेटा संरचना पर लागू होता है, जबकि ओपी फ़ंक्शन हस्ताक्षर के दुरुपयोग को सूचित करना चाहता है। – jdi

11

लेखन त्रुटि के लिए +1। यह अजगर 3 आवश्यक केवल कीवर्ड वाला तर्क के लिए क्या उठाती है:

>>> def foo(*, x): 
...  pass 
... 
>>> foo() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: foo() needs keyword-only argument x 
>>> foo(2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: foo() takes exactly 0 positional arguments (1 given) 
>>> foo(x=2) 

(लेखन त्रुटि सुझाव पहले से ही दिया गया था (और स्वीकार किए जाते हैं); मैं इस अजगर 3 सुविधा का उल्लेख करने के लिए इस सवाल का जवाब लिखा था)।

+1

पायथन 3 कीवर्ड-केवल तर्कों का उल्लेख करना बेहद सहायक है; लोग इस सवाल पर आ रहे हैं कि वे खुद को संभालने के अपवाद को स्वयं करते हैं, जब भाषा स्वयं आवश्यक कीवर्ड तर्कों का समर्थन करती है (जब तक वे निश्चित रूप से पाइथन 2 के साथ फंसने के लिए दुर्भाग्यपूर्ण नहीं हैं)। –