Argumento de palabra clave al descomprimir casos de lista / dict de argumentos en Python

Para Python, podría usar los argumentos de desempaquetado de la siguiente manera.

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, recibí un error si uso el argumento de palabras clave de la siguiente manera.

 hello(x=1, *(1,2,3), **{'a':1,'b':2,'c':3}) 
  TypeError: hello () obtuvo varios valores para el argumento de palabra clave 'x' 

¿Por qué es esto?

Independientemente del orden en que se especifiquen, los argumentos posicionales se asignan antes de los argumentos de palabras clave. En su caso, los argumentos posicionales son (1, 2, 3) y los argumentos de palabras 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 palabras clave. Esto suena un poco extraño porque sintácticamente sus argumentos posicionales se especifican después del argumento de la palabra clave, pero no obstante, el orden “argumentos posicionales → argumentos de la palabra clave” siempre se cumple.

Aquí hay un ejemplo más simple:

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