क्या किसी फ़ंक्शन के लिए वैकल्पिक पैरामीटर पास करने का कोई तरीका है?


133

क्या पायथन में वैकल्पिक तरीके से किसी फ़ंक्शन को कॉल करने के लिए इसे पास करने का कोई तरीका है और फ़ंक्शन परिभाषा में "केवल यदि वैकल्पिक पैरामीटर पारित किया गया है" पर आधारित कुछ कोड हैं

जवाबों:


115

अजगर 2 प्रलेखन, 7.6। फ़ंक्शन परिभाषाएँ आपको यह पता लगाने के लिए कुछ तरीके देती हैं कि क्या एक कॉलर ने वैकल्पिक पैरामीटर की आपूर्ति की है।

सबसे पहले, आप विशेष औपचारिक पैरामीटर सिंटैक्स का उपयोग कर सकते हैं *। यदि फ़ंक्शन परिभाषा में एक एकल से पहले एक औपचारिक पैरामीटर है *, तो पायथन उस पैरामीटर को किसी भी स्थितीय मापदंडों के साथ पॉप्युलेट करता है जो औपचारिक मापदंडों से पहले मेल नहीं खाते हैं (टुपल के रूप में)। यदि फ़ंक्शन परिभाषा में पहले से एक औपचारिक पैरामीटर है **, तो पायथन उस पैरामीटर को किसी भी कीवर्ड पैरामीटर के साथ पॉप्युलेट करता है , जो औपचारिक मापदंडों से पहले मेल नहीं खाते हैं (एक तानाशाह के रूप में)। फ़ंक्शन का कार्यान्वयन आपके इच्छित प्रकार के किसी भी "वैकल्पिक पैरामीटर" के लिए इन मापदंडों की सामग्री की जांच कर सकता है।

उदाहरण के लिए, यहाँ एक समारोह है opt_funजो दो स्थितीय पैरामीटर लेता है x1और x2"वैकल्पिक" नामक एक अन्य कीवर्ड पैरामीटर के लिए, और दिखता है।

>>> def opt_fun(x1, x2, *positional_parameters, **keyword_parameters):
...     if ('optional' in keyword_parameters):
...         print 'optional parameter found, it is ', keyword_parameters['optional']
...     else:
...         print 'no optional parameter, sorry'
... 
>>> opt_fun(1, 2)
no optional parameter, sorry
>>> opt_fun(1,2, optional="yes")
optional parameter found, it is  yes
>>> opt_fun(1,2, another="yes")
no optional parameter, sorry

दूसरा, आप कुछ मूल्य के एक डिफ़ॉल्ट पैरामीटर मान की आपूर्ति कर सकते हैं जैसे Noneकि एक कॉलर कभी भी उपयोग नहीं करेगा। यदि पैरामीटर में यह डिफ़ॉल्ट मान है, तो आपको पता है कि कॉलर ने पैरामीटर निर्दिष्ट नहीं किया था। यदि पैरामीटर में एक गैर-डिफ़ॉल्ट मान है, तो आप जानते हैं कि यह कॉलर से आया था।


7
positional_parametersएक टपल है, और keyword_parametersएक शब्दकोश है।
सेस टिम्मरमैन '

अजगर कैसे भेद करता है formal parameters preceded by * (इसे क्या कहा जाता है?) A से keyword parameter। जैसा कि मैंने इसे समझा था, =फ़ंक्शन कॉल में ऑपरेटर का उपयोग करके कीवर्ड पैरामीटर निर्दिष्ट किए जाते हैं (इसलिए opt_fun(1,2, optional="yes")एक फ़ंक्शन के लिए एक कीवर्ड तर्क "हाँ" प्रदान करता है जो पूर्वानुमान करता है, लेकिन जरूरी नहीं कि पैरामीटर की आवश्यकता हो option)।
मिन्ह ट्रान

दूसरी ओर, मैंने formal parameters preceded by * बस "कॉलर द्वारा प्रदान की गई दलीलें समझीं, जो किसी भी तर्क वितर्क से पहले जाने वाली स्थिति संबंधी तर्कों के अनुरूप नहीं है"। उदाहरण के लिए, में opt_fun(1,2, "blah", 3.14, mykey="yes", myyear="2018"), "blah"और 3.14कर रहे हैं forma arguments preceded by *, क्योंकि यह दो स्थितीय तर्क और तर्क का उपयोग करता है के बीच में है =पर हस्ताक्षर। परिणामस्वरूप टपल positional_parameterको डंपल किया जाएगा ("blah", 3.14):। क्या ये सही है?
मिन्ह ट्रैन

@ मेनहट्रान, टिप्पणियों में सवाल स्टैक ओवरफ्लो में जवाब पाने का सबसे अच्छा तरीका नहीं है। बड़े नीले "प्रश्न पूछें" बटन पर क्लिक करना बेहतर है, और अपना अनुरोध "प्रश्न" के रूप में लिखें, जिसे अन्य "उत्तर" दे सकते हैं। लेकिन आपकी मदद करने के लिए, एक) नोट मैंने लिखा " parameter" नहीं " parameters" के लिए preceded by *"। भाषा *identifierपैरामीटर सूची में केवल एक के लिए अनुमति देती है । b) docs.python.org/2/reference/… , c) read docs.python.org/2/reference/expressions.html#calls पढ़ें । क्षमा करें, इस टिप्पणी में अनुमत वर्णों से बाहर चल रहा है।
जिम डेलांट

81
def my_func(mandatory_arg, optional_arg=100):
    print(mandatory_arg, optional_arg)

http://docs.python.org/2/tutorial/controlflow.html#default-argument-values

मुझे यह उपयोग करने से अधिक पठनीय लगता है **kwargs

यह निर्धारित करने के लिए कि क्या कोई तर्क पारित किया गया था, मैं डिफ़ॉल्ट मूल्य के रूप में एक कस्टम उपयोगिता वस्तु का उपयोग करता हूं:

MISSING = object()

def func(arg=MISSING):
    if arg is MISSING:
        ...

-धन्यवाद, क्या कोड में एक और चर के रूप में इस पैरामीटर के डिफ़ॉल्ट मान को निर्दिष्ट करने का एक तरीका है?
user1795998

हाँ। default_value=100; def my_func(mandatory_argument, optional_argument_with_default_value=default_value): ...
वारवरियुक

यह दिखाने के लिए प्रकट होता है कि वैकल्पिक मापदंडों का उपयोग कैसे किया जाता है, लेकिन परीक्षण कैसे नहीं किया जाता है यदि कोई पास हो, जो ओपी पूछ रहा है।
मावग का कहना है कि मोनिका

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

19
def op(a=4,b=6):
    add = a+b
    print add

i)op() [o/p: will be (4+6)=10]
ii)op(99) [o/p: will be (99+6)=105]
iii)op(1,1) [o/p: will be (1+1)=2]
Note:
 If none or one parameter is passed the default passed parameter will be considered for the function. 

1
क्या केवल दूसरा पैरामीटर (बी) पास करने का एक तरीका है और पहले वाला (ए) नहीं है?
जिदीउफ

4
@Djidiouf हां, वहाँ हैop(b=2)
Jürg Merlin Spaak

7

यदि आप एक पैरामीटर असाइन मान () में कुछ डिफ़ॉल्ट मान देना चाहते हैं। जैसे (x = 10)। लेकिन महत्वपूर्ण पहले अनिवार्य तर्क तो डिफ़ॉल्ट मान होना चाहिए।

जैसे।

(y, x = 10)

परंतु

(x = 10, y) गलत है


धन्यवाद, क्या कोड में एक और चर के रूप में इस पैरामीटर के डिफ़ॉल्ट मूल्य को निर्दिष्ट करने का एक तरीका है?
user1795998

हाँ, आप *arg **kargफ़ंक्शन तर्कों के रूप में कुछ का उपयोग कर सकते हैं । गूगल पर खोजें।
सुमित

यह दिखाने के लिए प्रकट होता है कि वैकल्पिक मापदंडों का उपयोग कैसे किया जाता है, लेकिन परीक्षण कैसे नहीं किया जाता है यदि कोई पास हो, जो ओपी पूछ रहा है।
मावग का कहना है कि मोनिका

2

आप वैकल्पिक तर्क के लिए कुछ के साथ एक डिफ़ॉल्ट मान निर्दिष्ट कर सकते हैं जो फ़ंक्शन में कभी नहीं जाएगा और इसे isऑपरेटर के साथ जांचें :

class _NO_DEFAULT:
    def __repr__(self):return "<no default>"
_NO_DEFAULT = _NO_DEFAULT()

def func(optional= _NO_DEFAULT):
    if optional is _NO_DEFAULT:
        print("the optional argument was not passed")
    else:
        print("the optional argument was:",optional)

तब तक जब तक आप नहीं करते func(_NO_DEFAULT)हैं, तब तक आप सटीक रूप से पता लगा सकते हैं कि क्या तर्क पारित किया गया था या नहीं, और स्वीकृत उत्तर के विपरीत आपको ** नोटेशन के दुष्प्रभावों के बारे में चिंता करने की आवश्यकता नहीं है:

# these two work the same as using **
func()
func(optional=1)

# the optional argument can be positional or keyword unlike using **
func(1) 

#this correctly raises an error where as it would need to be explicitly checked when using **
func(invalid_arg=7)

बस करो _NO_DEFAULT = object()
अरन-फे

बेहतर आत्मनिरीक्षण देने के लिए 2 अतिरिक्त लाइनें इसके लायक हैं। इसके साथ यदि आप चलाते help(func)हैं तो आपको एक स्पष्ट विचार मिलता है कि यदि स्पष्ट रूप से पारित नहीं किया जाता है तो तर्क की व्याख्या कैसे की जाती है।
ताडग मैकडोनाल्ड-जेन्सेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.