Quiero agregar una respuesta más:
Sucede cuando intenta pasar el parámetro posicional con un orden de posición incorrecto junto con el argumento de la palabra clave en la función de llamada.
there is difference between parameter and argument
puedes leer en detalle aquí Argumentos y parámetros en python
def hello(a,b=1, *args):
print(a, b, *args)
hello(1, 2, 3, 4,a=12)
ya que tenemos tres parámetros:
a es parámetro posicional
b = 1 es palabra clave y parámetro predeterminado
* args es un parámetro de longitud variable
así que primero asignamos un parámetro posicional, significa que tenemos que proporcionar valor al argumento posicional en su orden de posición, aquí el orden importa. pero estamos pasando el argumento 1 en el lugar de a en la función de llamada y luego también estamos proporcionando valor a a, tratándolo como argumento de palabra clave. ahora a tiene dos valores:
uno es el valor posicional: a = 1
segundo es el valor de palabras clave que es a = 12
Solución
Tenemos que cambiar hello(1, 2, 3, 4,a=12)
a, hello(1, 2, 3, 4,12)
por lo que ahora a obtendrá un solo valor posicional que es 1 yb obtendrá el valor 2 y el resto de valores obtendrá * args (parámetro de longitud variable)
Información Adicional
si queremos que * args debería obtener 2,3,4 y a debería obtener 1 yb debería obtener 12
entonces podemos hacer así
def hello(a,*args,b=1):
pass
hello(1, 2, 3, 4,b=12)
Algo más :
def hello(a,*c,b=1,**kwargs):
print(b)
print(c)
print(a)
print(kwargs)
hello(1,2,1,2,8,9,c=12)
salida:
1
(2, 1, 2, 8, 9)
1
{'c': 12}
self
es mejor que implícitothis
.