def fun(a, b, c, d):
print('a:', a, 'b:', b, 'c:', c, 'd:', d)
warum dieser funktioniert
fun(3, 7, d=10, *(23,))
und druckt aus:
a: 3 b: 7 c: 23 d: 10
während dies
fun(3, 7, c=10, *(23,))
nicht
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
quelle
quelle
SyntaxError: positional argument follows keyword argument
.Antworten:
Mit
*(23,)
, können Sie die Werte in dem Tupel sind Auspacken(23,)
als Positionsargumente, im Anschluss an die Positionsargumente , die bereits definiert sind, und zwar3
füra
und7
fürb
, so23
würde Parameter zugeordnet werdenc
, weshalb istfun(3, 7, d=10, *(23,))
funktioniert, aber infun(3, 7, c=10, *(23,))
Ihnen zuweisen auch Wert10
aufc
als ein Schlüsselwortargument, daher wird es als Konflikt betrachtet, dac
es nicht mit23
und zugewiesen werden kann10
.Beachten Sie, dass es zwar legal ist, von einigen jedoch davon abgeraten wird, iterierbare Argumente nach Schlüsselwortargumenten zu entpacken, wie hier erläutert , obwohl die Syntax letztendlich so bleibt, dass sie erhalten bleibt.
quelle
f(1,2,c=3,*d,**e)
in test_ast.py hervorgeht , besteht der primäre Anwendungsfall darin , einer Wrapper-Funktion zu ermöglichen, variable Argumente und Schlüsselwortargumente auf intuitivere Weise an die umschlossene Funktion zu übergeben, indem sowohl die variablen Argumente als auch das variable Schlüsselwort platziert werden Argumente am Ende der Argumentliste.