2010-06-29 31 views
5

पाइथन के लिए तर्क सूची/dict मामलों में अनपॅकिंग तर्क शब्द में कीवर्ड तर्क, मैं निम्नानुसार अनपॅकिंग तर्कों का उपयोग कर सकता हूं।पाइथन

def hello(x, *y, **z): 
    print 'x', x 
    print 'y', y 
    print 'z', z 

hello(1, *[1,2,3], a=1,b=2,c=3) 
hello(1, *(1,2,3), **{'a':1,'b':2,'c':3}) 
 
x = 1 
y = (1, 2, 3) 
z = {'a': 1, 'c': 3, 'b': 2} 

लेकिन, मैं एक त्रुटि यदि कीवर्ड तर्क का उपयोग इस प्रकार मिला है।

hello(x=1, *(1,2,3), **{'a':1,'b':2,'c':3}) 
TypeError: hello() got multiple values for keyword argument 'x'

ऐसा क्यों है?

उत्तर

9

वे किस क्रम में निर्दिष्ट कर रहे हैं के बावजूद, स्थितीय तर्क तर्क कीवर्ड से पहले असाइन किए जाएंगे। आपके मामले में, स्थितित्मक तर्क (1, 2, 3) हैं और कीवर्ड तर्क x=1, a=1, b=2, c=3 हैं। चूंकि स्थितित्मक तर्क पहले असाइन किए जाते हैं, पैरामीटर x 1 प्राप्त करता है और अब कीवर्ड तर्कों के लिए योग्य नहीं है। इसमें कुछ समय अजीब लगता है क्योंकि वाक्य रचना अपने स्थितीय तर्क कीवर्ड बहस के बाद निर्दिष्ट कर रहे हैं, लेकिन फिर भी आदेश "स्थितीय तर्क → कीवर्ड तर्क" हमेशा से पालन किया जाता है।

>>> def f(x): pass 
... 
>>> f(1, x=2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: f() got multiple values for keyword argument 'x' 
>>> f(x=2, *(1,)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: f() got multiple values for keyword argument 'x' 
:

यहाँ एक सरल उदाहरण है