Quero adicionar mais uma resposta:
Isso acontece quando você tenta passar o parâmetro posicional com a ordem de posição incorreta e o argumento da palavra-chave na função de chamada.
there is difference between parameter and argument
você pode ler em detalhes sobre aqui Argumentos e Parâmetros em python
def hello(a,b=1, *args):
print(a, b, *args)
hello(1, 2, 3, 4,a=12)
já que temos três parâmetros:
a é parâmetro posicional
b = 1 é a palavra-chave e o parâmetro padrão
* args é um parâmetro de comprimento variável
então, primeiro atribuímos um parâmetro como posicional, significa que precisamos fornecer valor ao argumento posicional em sua ordem de posição, aqui a ordem importa. mas estamos passando o argumento 1 no lugar de uma função de chamada e, em seguida, também estamos fornecendo valor a, tratando como argumento de palavra-chave. agora a tem dois valores:
um é o valor posicional: a = 1
segundo é o valor com palavras-chave que é = 12
Solução
Temos que mudar hello(1, 2, 3, 4,a=12)
parahello(1, 2, 3, 4,12)
agora, a obterá apenas um valor posicional que é 1 e b obterá o valor 2 e o restante dos valores obterá * args (parâmetro de comprimento variável)
informação adicional
se quisermos que * args deve ter 2,3,4 e a deve ter 1 eb deve ter 12
então podemos fazer assim
def hello(a,*args,b=1):
pass
hello(1, 2, 3, 4,b=12)
Algo mais :
def hello(a,*c,b=1,**kwargs):
print(b)
print(c)
print(a)
print(kwargs)
hello(1,2,1,2,8,9,c=12)
resultado :
1
(2, 1, 2, 8, 9)
1
{'c': 12}
self
é melhor do que implícitothis
.