2009-09-13 15 views
198

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

+5

आप पीईपी 3102 भी पढ़ना चाहेंगे - वे पाइथन 3 में इन चीजों में से कुछ को साफ कर रहे हैं। देखें: http://www.python.org/dev/peps/pep-3102/ –

+0

और क्या एक डिफ़ॉल्ट मान के साथ ऐसा करने के लिए कुछ भी नहीं है (सिवाय इसके कि आपको इसके लिए मूल्य पास करने की आवश्यकता है या नहीं), है ना? – mk12

+0

[पायथन स्थितित्मक/कीवर्ड तर्क] के बारे में और पढ़ें (http://symfony-world.blogspot.com/2013/07/python-positional-arguments-and-keyword.html) – ducin

उत्तर

256

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

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

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

def my_function(arg1, arg2, **kwargs) 

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

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

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

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

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

+17

शब्द अस्पष्ट है: आम तौर पर आप कॉल किए गए पक्ष के पैरामीटर के दौरान कॉलिंग पक्ष पर तर्कों की बात करते हैं। एक उपयोगी तकनीक के लिए – glglgl

20

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

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

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

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

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

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

+1

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

+2

यदि मैं दो स्वीकार कर सकता हूं तो आपका अगला होगा। – mk12

80

कीवर्ड तर्कों का उपयोग करना सामान्य तर्कों के समान है, आदेश को छोड़कर कोई फर्क नहीं पड़ता। वे उनके सामने कोई कीवर्ड नहीं है

def foo(bar, baz): 
    pass 

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

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

32

स्थितीय तर्क

: उदाहरण के लिए दो कार्य नीचे कॉल एक ही हैं। आदेश महत्वपूर्ण है!

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

कीवर्ड तर्क

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

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

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

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

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

यह आपको अनुमति देता है:

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

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

10

मैं हैरान कोई भी तथ्य यह है कि आप *args और **kwargs (from this site) का उपयोग इस तरह डरपोक काम करने के लिए स्थितीय और कीवर्ड तर्क मिश्रण कर सकते हैं उल्लेख किया है हूँ मनमानी कीवर्ड तर्कों का उपयोग करें जिनके पास ऐसी कुंजी हो सकती है जिन्हें आप पहले परिभाषित नहीं करना चाहते हैं।

138

एक आखिरी भाषा सुविधा है जहां भेद महत्वपूर्ण है। निम्नलिखित समारोह पर विचार करें:

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'} 

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

+0

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

18

मुझे लगता है कि कोई भी बताया है कि करने के लिए एक, बंद तर्क मानकों का एक शब्दकोश पारित कर सकते हैं कि औपचारिक संतुष्ट लगता है हैरान हूँ पैरामीटर, जैसे।

>>> 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 
>>> 
+9

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

+0

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

+2

उपरोक्त चौथा औपचारिक पैरामीटर - ** kwargs आवश्यक है यदि आप कभी भी एक शब्दकोश के साथ func कहते हैं जिसमें 'ए', 'बी' और 'सी' के अलावा अन्य कुंजी शामिल हैं। – Eduardo

11

अजगर 3 का उपयोग करके आप दोनों आवश्यक और गैर आवश्यक कीवर्ड arguments हो सकता है:

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

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'` 

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

+2

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

+0

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

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