def fun(a, b, c, d):
print('a:', a, 'b:', b, 'c:', c, 'd:', d)
por que este funciona
fun(3, 7, d=10, *(23,))
e imprime:
a: 3 b: 7 c: 23 d: 10
mientras esto
fun(3, 7, c=10, *(23,))
no
Traceback (most recent call last):
File "/home/lookash/PycharmProjects/PythonLearning/learning.py", line 10, in <module>
fun(3, 7, c=10, *(23,))
TypeError: fun() got multiple values for argument 'c'
python
unpack
argument-unpacking
Łukasz
fuente
fuente
SyntaxError: positional argument follows keyword argument
.Respuestas:
Con
*(23,)
, está desempacando los valores en la tupla(23,)
como argumentos posicionales, siguiendo los argumentos posicionales que ya están definidos, a saber,3
fora
y7
forb
, por23
lo que se asignarían al parámetroc
, por esofun(3, 7, d=10, *(23,))
funciona, perofun(3, 7, c=10, *(23,))
también está asignando un valor10
ac
as un argumento de palabra clave, por lo que se considera un conflicto yac
que no se puede asignar con ambos23
y10
.Tenga en cuenta que, si bien es legal, algunos desaconsejan desempaquetar argumentos iterables después de los argumentos de palabras clave, como se discute aquí , aunque la sintaxis finalmente se mantiene.
fuente
f(1,2,c=3,*d,**e)
en test_ast.py , es permitir que una función de contenedor pase argumentos variables y argumentos de palabras clave a la función envuelta de una manera más intuitiva, colocando tanto los argumentos variables como las palabras clave variables argumentos al final de la lista de argumentos.