2010-06-29 10 views
5

Dla Pythona, mógłbym użyć argumentów rozpakowywania w następujący sposób.Argumenty słów kluczowych w rozpakowywaniu list argumentów/przypadków dyktowanych w Pythonie

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} 

Ale mam błąd, jeśli mogę użyć argumentu słowa kluczowego następująco.

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

Dlaczego tak jest?

Odpowiedz

9

Bez względu na kolejność, w jakiej są podane, argumenty pozycyjne są przypisywane przed argumentami słów kluczowych. W twoim przypadku argumenty pozycyjne to (1, 2, 3), a argumentami słów kluczowych są x=1, a=1, b=2, c=3. Ponieważ argumenty pozycyjne są najpierw przypisywane, parametr x odbiera 1 i nie kwalifikuje się już do argumentów słów kluczowych. Brzmi to trochę dziwnie, ponieważ składniowo argumenty pozycyjne są określane jako argumenty ze słowem kluczowym, ale niemniej kolejność "argumenty pozycyjne → argumenty słów kluczowych" jest zawsze przestrzegana.

Oto prostszy przykład:

>>> 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' 
Powiązane problemy