"कीवर्ड तर्क" नियमित तर्कों से कैसे अलग हैं? क्या सभी तर्कों को name=value
स्थितिबद्ध वाक्य रचना का उपयोग करने के बजाय पारित नहीं किया जा सकता है ?
"कीवर्ड तर्क" नियमित तर्कों से कैसे अलग हैं? क्या सभी तर्कों को name=value
स्थितिबद्ध वाक्य रचना का उपयोग करने के बजाय पारित नहीं किया जा सकता है ?
जवाबों:
दो संबंधित अवधारणाएं हैं, दोनों को " कीवर्ड तर्क " कहा जाता है ।
कॉलिंग पक्ष पर, जो अन्य टिप्पणीकारों ने उल्लेख किया है, आपके पास नाम से कुछ फ़ंक्शन तर्क निर्दिष्ट करने की क्षमता है। आपको बिना नाम ( स्थिति तर्क ) के सभी तर्कों के बाद उनका उल्लेख करना होगा, और किसी भी पैरामीटर के लिए डिफ़ॉल्ट मान होना चाहिए, जिनका उल्लेख नहीं किया गया था।
दूसरी अवधारणा फ़ंक्शन परिभाषा के पक्ष में है: आप एक फ़ंक्शन को परिभाषित कर सकते हैं जो नाम से पैरामीटर लेता है - और आपको यह निर्दिष्ट करने की भी आवश्यकता नहीं है कि वे नाम क्या हैं। ये शुद्ध खोजशब्द तर्क हैं , और इन्हें औपचारिक रूप से पारित नहीं किया जा सकता है। वाक्य-विन्यास है
def my_function(arg1, arg2, **kwargs)
इस फ़ंक्शन में आपके द्वारा पास किए गए किसी भी कीवर्ड तर्क को एक शब्दकोश में रखा जाएगा kwargs
। आप रन-टाइम में इस शब्दकोश की कुंजियों की जाँच कर सकते हैं, जैसे:
def my_function(**kwargs):
print str(kwargs)
my_function(a=12, b="abc")
{'a': 12, 'b': 'abc'}
kwargs
या मैं इसका नाम बदलकर sth कर सकता हूं। जैसे options
( def my_fuction(arg1, arg2, **options)
)?
kwargs
अधिवेशन तब होता है जब अधिक उपयुक्त नाम नहीं होता है
एक अंतिम भाषा विशेषता है जहां अंतर महत्वपूर्ण है। निम्नलिखित कार्य पर विचार करें:
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'}
इन विशेषताओं का उपयोग शायद ही कभी किया जाता है, लेकिन कभी-कभी वे बहुत उपयोगी होते हैं, और यह जानना महत्वपूर्ण है कि कौन से तर्क स्थिति या कीवर्ड हैं।
*positional
और **keywords
अगर हम फ़ंक्शन परिभाषा को बदलते हैं def foo(arg1, *positional, **keywords):
। यहाँ arg1
स्थितिगत और आवश्यक है। कृपया ध्यान दें कि उत्तर में स्थितीय का अर्थ है स्थैतिक तर्कों के वैकल्पिक और परिवर्तनशील संख्या।
foo(bar=True)
तो आप bar = keywords.pop('bar')
उसी का उपयोग करके मान प्राप्त कर सकते हैं bar = keywords.pop('bar', None)
। डिफ़ॉल्ट मान के लिए, का उपयोग करेंbar = keywords.pop('bar', False)
कीवर्ड तर्कों का उपयोग करना सामान्य आदेशों के समान है, सिवाय इसके कि आदेश कोई मायने नहीं रखते। उदाहरण के लिए नीचे दिए गए दो फ़ंक्शन कॉल समान हैं:
def foo(bar, baz):
pass
foo(1, 2)
foo(baz=2, bar=1)
उनके पास पहले से कोई कीवर्ड नहीं है। आदेश महत्वपूर्ण है!
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)
func("bar", 5)
? और फिर कहते हैं कि hello
इसका डिफ़ॉल्ट मान मिलता है 3
।
फ़ंक्शन मापदंडों को तर्क मान निर्दिष्ट करने के दो तरीके हैं, दोनों का उपयोग किया जाता है।
स्थिति द्वारा। स्थिति संबंधी तर्कों में कीवर्ड नहीं होते हैं और उन्हें पहले असाइन किया जाता है।
कीवर्ड द्वारा। कीवर्ड तर्क में कीवर्ड हैं और उन्हें दूसरे तर्क के बाद, असाइन किया गया है।
ध्यान दें कि आपके पास स्थितीय तर्कों का उपयोग करने का विकल्प है।
यदि आप स्थिति-संबंधी तर्कों का उपयोग नहीं करते हैं, तो - हाँ - आपके द्वारा लिखी गई प्रत्येक चीज एक कीवर्ड तर्क है।
जब आप किसी फ़ंक्शन को कॉल करते हैं तो आप स्थिति या कीवर्ड या मिश्रण का उपयोग करने का निर्णय लेते हैं। आप चाहें तो सभी कीवर्ड चुन सकते हैं। हम में से कुछ इस विकल्प को नहीं बनाते हैं और स्थिति संबंधी तर्कों का उपयोग करते हैं।
मुझे आश्चर्य है कि किसी ने भी यह संकेत नहीं दिया है कि कोई व्यक्ति तर्क-वितर्क के मापदंडों का एक शब्दकोश पारित कर सकता है, जो औपचारिक मापदंडों को पूरा करता है, जैसे।
>>> 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
>>>
, **kwargs
। यह प्रदर्शित करता है कि एक निश्चित # पैरामीटर के साथ, एक साधारण फंक डिफॉल्ट, एक शब्दकोश की आपूर्ति की जा सकती है। यही है, यह परिभाषा में कुछ भी फैंसी की आवश्यकता नहीं है। जब आप परिभाषा में ** kwargs के साथ एक दूसरा उदाहरण जोड़ सकते हैं, और दिखा सकते हैं कि कैसे शब्दकोश में EXTRA आइटम इसके माध्यम से उपलब्ध हैं।
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))
पायथन 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'`
यह उन मामलों में मदद कर सकता है, जहां आपके पास एक-दूसरे के बगल में कई समान तर्क हैं, खासकर यदि वे एक ही प्रकार के हैं, तो उस स्थिति में मैं नामित तर्कों का उपयोग करना पसंद करता हूं या अगर मैं एक साथ तर्क करता हूं तो मैं एक कस्टम वर्ग बनाता हूं।
मैं हैरान हूँ कि कोई भी तथ्य यह है कि आप इस का उपयोग कर की तरह डरपोक काम करने के लिए स्थितीय और कीवर्ड तर्क मिश्रण कर सकते हैं उल्लेख किया है *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])
यह आपको मनमाने ढंग से खोजशब्द तर्क का उपयोग करने की अनुमति देता है जिसमें वे कुंजी हो सकती हैं जिन्हें आप आगे परिभाषित नहीं करना चाहते हैं।
मैं एक उदाहरण की तलाश में था जिसमें टाइप एनोटेशन का उपयोग करने वाले डिफ़ॉल्ट 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 {}
फ़ंक्शन को कॉल करते समय महत्वपूर्ण शब्दों में निर्दिष्ट नहीं किए गए तर्कों के डिफ़ॉल्ट मान को परिभाषित करने के लिए बस एक तरीका है / जोड़ें :
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