सामान्य तर्क बनाम खोजशब्द तर्क


290

"कीवर्ड तर्क" नियमित तर्कों से कैसे अलग हैं? क्या सभी तर्कों को name=valueस्थितिबद्ध वाक्य रचना का उपयोग करने के बजाय पारित नहीं किया जा सकता है ?


6
आप PEP 3102 को भी पढ़ सकते हैं - वे Python 3 में इस सामान में से कुछ को देख रहे हैं। देखें: python.org/dev/peps/pep-3102
Ben Hoyt

और क्या कोई डिफ़ॉल्ट मान है या नहीं, इससे कोई लेना-देना नहीं है (सिवाय इसके कि आपको इसके लिए किसी मान की आवश्यकता है या नहीं), सही है?
mk12 2


@ बाइन होयट ने पायथन 3 को कवर करने के लिए नीचे एक उत्तर जोड़ा, आवश्यक कीवर्ड तर्क
क्रिस्टोफ़ रूसो

जवाबों:


347

दो संबंधित अवधारणाएं हैं, दोनों को " कीवर्ड तर्क " कहा जाता है ।

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

दूसरी अवधारणा फ़ंक्शन परिभाषा के पक्ष में है: आप एक फ़ंक्शन को परिभाषित कर सकते हैं जो नाम से पैरामीटर लेता है - और आपको यह निर्दिष्ट करने की भी आवश्यकता नहीं है कि वे नाम क्या हैं। ये शुद्ध खोजशब्द तर्क हैं , और इन्हें औपचारिक रूप से पारित नहीं किया जा सकता है। वाक्य-विन्यास है

def my_function(arg1, arg2, **kwargs)

इस फ़ंक्शन में आपके द्वारा पास किए गए किसी भी कीवर्ड तर्क को एक शब्दकोश में रखा जाएगा kwargs। आप रन-टाइम में इस शब्दकोश की कुंजियों की जाँच कर सकते हैं, जैसे:

def my_function(**kwargs):
    print str(kwargs)

my_function(a=12, b="abc")

{'a': 12, 'b': 'abc'}

5
+1 और स्वीकृत: आप केवल एक ही व्यक्ति हैं जिन्होंने दोनों प्रकार की स्थिति + खोजशब्द तर्क के बारे में बात की है, बाकी सभी ने या तो सोचा कि मैं पहले या दूसरे के बारे में बात कर रहा था (लेकिन वे अभी भी अच्छे पद थे)। धन्यवाद!
mk12

34
शब्दांकन स्पष्ट नहीं है: आम तौर पर आप कॉलिंग पक्ष पर तर्कों के बारे में बात करते हैं, जबकि कहा जाता है।
glglgl

3
क्या पैरामीटर नाम होना चाहिए kwargsया मैं इसका नाम बदलकर sth कर सकता हूं। जैसे options( def my_fuction(arg1, arg2, **options))?
ब्रूस सन

1
नाम कुछ भी हो सकता है, हालांकि kwargsअधिवेशन तब होता है जब अधिक उपयुक्त नाम नहीं होता है
मैट ज़िम्मरमैन

मुझे लगता है कि यहां बताई गई दूसरी अवधारणा को तकनीकी रूप से आर्बिटवर्स कीवर्ड तर्क कहा जाता है।
अंशुल दहिया

188

एक अंतिम भाषा विशेषता है जहां अंतर महत्वपूर्ण है। निम्नलिखित कार्य पर विचार करें:

def foo(*positional, **keywords):
    print "Positional:", positional
    print "Keywords:", keywords

यह *positionalतर्क उन सभी स्थैतिक तर्कों को संग्रहीत करेगा foo(), जिनकी आप कितनी सीमा प्रदान कर सकते हैं, इसकी कोई सीमा नहीं है।

>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}

**keywordsतर्क किसी भी कीवर्ड तर्क स्टोर करेगा:

>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}

और हां, आप एक ही समय में दोनों का उपयोग कर सकते हैं:

>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}

इन विशेषताओं का उपयोग शायद ही कभी किया जाता है, लेकिन कभी-कभी वे बहुत उपयोगी होते हैं, और यह जानना महत्वपूर्ण है कि कौन से तर्क स्थिति या कीवर्ड हैं।


3
बहुत बढ़िया जवाब! बस एक नोट करें कि आवश्यक स्थिति संबंधी तर्क पहले पारित किए जा सकते हैं *positionalऔर **keywordsअगर हम फ़ंक्शन परिभाषा को बदलते हैं def foo(arg1, *positional, **keywords):। यहाँ arg1स्थितिगत और आवश्यक है। कृपया ध्यान दें कि उत्तर में स्थितीय का अर्थ है स्थैतिक तर्कों के वैकल्पिक और परिवर्तनशील संख्या।
शैफू 18

2
हां ठीक जवाब। एक और नोट: यदि आप अपने फ़ंक्शन को कॉल करते हैं, foo(bar=True)तो आप bar = keywords.pop('bar')उसी का उपयोग करके मान प्राप्त कर सकते हैं bar = keywords.pop('bar', None)। डिफ़ॉल्ट मान के लिए, का उपयोग करेंbar = keywords.pop('bar', False)
olibre

111

कीवर्ड तर्कों का उपयोग करना सामान्य आदेशों के समान है, सिवाय इसके कि आदेश कोई मायने नहीं रखते। उदाहरण के लिए नीचे दिए गए दो फ़ंक्शन कॉल समान हैं:

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)

3
इसके लिए धन्यवाद। ऐसा नहीं है कि मैं कर सकते हैं अविश्वसनीय रूप से उपयोगी है दोनों एक स्थितीय आर्ग, के रूप में एक कीवर्ड आर्ग निर्दिष्ट और एक कीवर्ड आर्ग के रूप में एक स्थितीय आर्ग।
ल्यूक डेविस

47

स्थिति संबंधी तर्क

उनके पास पहले से कोई कीवर्ड नहीं है। आदेश महत्वपूर्ण है!

func(1,2,3, "foo")

कीवर्ड तर्क

उनके सामने कीवर्ड हैं। वे किसी भी क्रम में हो सकते हैं!

func(foo="bar", baz=5, hello=123)

func(baz=5, foo="bar", hello=123)

आपको यह भी पता होना चाहिए कि यदि आप कीवर्ड डालने के लिए डिफ़ॉल्ट तर्कों और उपेक्षा का उपयोग करते हैं, तो आदेश फिर मायने रखेगा!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)

8
IMHO, तीसरा उदाहरण (डिफ़ॉल्ट तर्क) स्पष्ट नहीं है। मुझे लगता है कि आप इस बारे में बात कर रहे हैं कि क्या होता है जब एक या अधिक पैरामीटर डिफ़ॉल्ट मानों की घोषणा करते हैं, और कॉल स्थितीय संकेतन का उपयोग करता है, लेकिन घोषित मापदंडों की संख्या से कम आपूर्ति करता है। हालाँकि, आपके उदाहरण में 3 घोषित हैं, और 3 कॉल में हैं, इसलिए डिफ़ॉल्ट मानों का कोई प्रभाव नहीं है! क्या आपने तीसरा arg को छोड़ना चाहते हैं जैसे func("bar", 5)? और फिर कहते हैं कि helloइसका डिफ़ॉल्ट मान मिलता है 3
टूलमेकरसेव

25

फ़ंक्शन मापदंडों को तर्क मान निर्दिष्ट करने के दो तरीके हैं, दोनों का उपयोग किया जाता है।

  1. स्थिति द्वारा। स्थिति संबंधी तर्कों में कीवर्ड नहीं होते हैं और उन्हें पहले असाइन किया जाता है।

  2. कीवर्ड द्वारा। कीवर्ड तर्क में कीवर्ड हैं और उन्हें दूसरे तर्क के बाद, असाइन किया गया है।

ध्यान दें कि आपके पास स्थितीय तर्कों का उपयोग करने का विकल्प है।

यदि आप स्थिति-संबंधी तर्कों का उपयोग नहीं करते हैं, तो - हाँ - आपके द्वारा लिखी गई प्रत्येक चीज एक कीवर्ड तर्क है।

जब आप किसी फ़ंक्शन को कॉल करते हैं तो आप स्थिति या कीवर्ड या मिश्रण का उपयोग करने का निर्णय लेते हैं। आप चाहें तो सभी कीवर्ड चुन सकते हैं। हम में से कुछ इस विकल्प को नहीं बनाते हैं और स्थिति संबंधी तर्कों का उपयोग करते हैं।


1
ओह, मैं मापदंडों के बारे में सोच रहा था, जब यह वास्तव में तर्क है (जो मैं पास करता हूं )। धन्यवाद!
mk12 1

24

मुझे आश्चर्य है कि किसी ने भी यह संकेत नहीं दिया है कि कोई व्यक्ति तर्क-वितर्क के मापदंडों का एक शब्दकोश पारित कर सकता है, जो औपचारिक मापदंडों को पूरा करता है, जैसे।

>>> def func(a='a', b='b', c='c', **kwargs):
...    print 'a:%s, b:%s, c:%s' % (a, b, c)
... 
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>> 

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

1
मैंने विभिन्न पुस्तकालयों के स्रोत कोड में ऐसा होते देखा है और इसलिए उलझन में था। इसे क्लीयर करने के लिए शुक्रिया!
क्रेग लैंबेंज

3
ऊपर चौथा औपचारिक पैरामीटर - ** kwargs आवश्यक है यदि आप कभी भी एक ऐसे शब्दकोश के साथ फ़ंक कहते हैं जिसमें 'a', 'b' और 'c' के अलावा अन्य कुंजियाँ हों।
एडुआर्डो

मेरे लिए print 'a:%s, b:%s, c:%s' % (a, b, c)सिंटैक्स त्रुटि देता है, हालांकि print('a:%s, b:%s, c:%s' % (a, b, c))काम करता है। पायथन संस्करण के साथ कुछ? वैसे भी इस अंतर्दृष्टि के लिए धन्यवाद, अब तक मैं अधिक print('a:{}, b:{}, c:{}'.format(a, b, c))
क्लंकी

17

पायथन 3 का उपयोग करना आपके लिए आवश्यक और गैर-आवश्यक दोनों प्रकार के तर्क हो सकते हैं :


वैकल्पिक : ('बी' के लिए परिभाषित डिफ़ॉल्ट मान)

def func1(a, *, b=42):
    ...
func1(value_for_a) # b is optional and will default to 42

आवश्यक (परम 'बी' के लिए कोई डिफ़ॉल्ट मान परिभाषित नहीं):

def func2(a, *, b):
    ... 
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`

यह उन मामलों में मदद कर सकता है, जहां आपके पास एक-दूसरे के बगल में कई समान तर्क हैं, खासकर यदि वे एक ही प्रकार के हैं, तो उस स्थिति में मैं नामित तर्कों का उपयोग करना पसंद करता हूं या अगर मैं एक साथ तर्क करता हूं तो मैं एक कस्टम वर्ग बनाता हूं।


3
आवश्यक संस्करण काफी उपयोगी है। यह बिना किसी चूक के प्रदान किए नाम से आर्ग देने का आग्रह करता है, जो अक्सर समझ में नहीं आता है।
टीएनटी

डिफ़ॉल्ट मान अच्छे लगते हैं और जब आप शुरू करते हैं तो समय बचाने में आपकी मदद कर सकते हैं, लेकिन लंबे समय तक डिफ़ॉल्ट मान पीटीए हो सकते हैं।
क्रिस्टोफ रूसो

11

मैं हैरान हूँ कि कोई भी तथ्य यह है कि आप इस का उपयोग कर की तरह डरपोक काम करने के लिए स्थितीय और कीवर्ड तर्क मिश्रण कर सकते हैं उल्लेख किया है *argsऔर **kwargs( इस साइट से ):

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

यह आपको मनमाने ढंग से खोजशब्द तर्क का उपयोग करने की अनुमति देता है जिसमें वे कुंजी हो सकती हैं जिन्हें आप आगे परिभाषित नहीं करना चाहते हैं।


0

मैं एक उदाहरण की तलाश में था जिसमें टाइप एनोटेशन का उपयोग करने वाले डिफ़ॉल्ट kwargs थे:

def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
     return ' '.join([a, b, c, str(kwargs)])

उदाहरण:

>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}

0

फ़ंक्शन को कॉल करते समय महत्वपूर्ण शब्दों में निर्दिष्ट नहीं किए गए तर्कों के डिफ़ॉल्ट मान को परिभाषित करने के लिए बस एक तरीका है / जोड़ें :

def func(**keywargs):
if 'my_word' not in keywargs:
    word = 'default_msg'
else:
    word = keywargs['my_word']
return word

इसके द्वारा कॉल करें:

print(func())
print(func(my_word='love'))

आपको मिलेगा:

default_msg
love

अजगर के बारे में *argsऔर अधिक पढ़ें **kwargs: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3

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