def fun(a, b, c, d):
print('a:', a, 'b:', b, 'c:', c, 'd:', d)
por que esse funciona
fun(3, 7, d=10, *(23,))
e imprime:
a: 3 b: 7 c: 23 d: 10
enquanto isso
fun(3, 7, c=10, *(23,))
não
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
fonte
fonte
SyntaxError: positional argument follows keyword argument
.Respostas:
Com
*(23,)
, você está descompactando os valores na tupla(23,)
como argumentos posicionais, seguindo os argumentos posicionais já definidos, ou seja,3
paraa
e7
parab
, por isso23
seriam atribuídos ao parâmetroc
, e é por isso quefun(3, 7, d=10, *(23,))
funciona, masfun(3, 7, c=10, *(23,))
você também está atribuindo valor10
ac
como um argumento de palavra-chave, portanto, é considerado um conflito, poisc
não pode ser atribuído com ambos23
e10
.Observe que, embora legal, é desencorajado por alguns descompactar argumentos iteráveis após argumentos de palavra-chave, conforme discutido aqui , embora a sintaxe seja finalmente mantida.
fonte
f(1,2,c=3,*d,**e)
em test_ast.py , é permitir que uma função de wrapper passe argumentos variáveis e argumentos de palavra-chave para a função de forma mais intuitiva, colocando os argumentos e a palavra-chave variável. argumentos no final da lista de argumentos.