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,3foray7forb, por23lo 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 valor10acas un argumento de palabra clave, por lo que se considera un conflicto yacque no se puede asignar con ambos23y10.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.