2010-06-29 12 views
5

Para python, podría usar los argumentos de desempaquetado de la siguiente manera.Argumento de la palabra clave al desempaquetar los casos de la lista de argumentos/dict en Python

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} 

Pero, me dio un error si uso argumento de palabra clave de la siguiente manera.

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

¿Por qué es esto?

Respuesta

9

Independientemente del orden en que se especifiquen, los argumentos de posición se asignan antes de los argumentos de palabras clave. En su caso, los argumentos posicionales son (1, 2, 3) y los argumentos de la palabra clave son x=1, a=1, b=2, c=3. Debido a que los argumentos posicionales se asignan primero, el parámetro x recibe 1 y ya no es elegible para los argumentos de palabra clave. Esto suena un poco raro porque sintácticamente sus argumentos posicionales están especificados después de el argumento de la palabra clave, pero no obstante el orden "argumentos posicionales → argumentos de palabra clave" siempre se cumple.

Aquí es un ejemplo más simple:

>>> 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' 
Cuestiones relacionadas