Python - Entpackungsreihenfolge für Werte in Methodenparametern

8
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'
Łukasz
quelle
Ich weiß nicht genau, warum ein Fehler ausgelöst wird, aber Sie sollten niemals variable Argumente nach Schlüsselwortargumenten haben. Normalerweise wird ein Fehler ausgegeben, aber das Entpacken von Tupeln scheint einen anderen Fehler als den normalen auszulösen SyntaxError: positional argument follows keyword argument.
Fehler - Syntaktische Reue
@ Error-SyntacticalRemorse. Ich denke, Sie verpassen den Punkt. OP hat einen Fall gefunden, in dem Sie tatsächlich eine Position nach einem Schlüsselwort setzen können, und es funktioniert.
Mad Physicist
@ MadPhysicist Ich sehe das. Aber ich habe nur eine Aussage gemacht, dass das Entpacken von Tupeln nicht nach Schlüsselwortargumenten erfolgen sollte. Also habe ich es als Kommentar nicht als Antwort gemacht.
Fehler - Syntaktische Reue
1
Tolle Frage. Ich wusste nie, dass das eine Sache ist.
Fehler - Syntaktische Reue

Antworten:

6

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 zwar 3für aund 7für b, so 23würde Parameter zugeordnet werden c, weshalb ist fun(3, 7, d=10, *(23,))funktioniert, aber in fun(3, 7, c=10, *(23,))Ihnen zuweisen auch Wert 10auf cals ein Schlüsselwortargument, daher wird es als Konflikt betrachtet, da ces nicht mit 23und zugewiesen werden kann 10.

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.

blhsing
quelle
Es ist klar, was passiert, aber seit wann können Sie Positionen nach Schlüsselwörtern entpacken?
Mad Physicist
Seit Python 3.
Blhsing
Hast du eine Quelle dafür? Ist es beabsichtigt und dokumentiert oder wohl ein Fehler / eine Auslassung?
Verrückter Physiker
Das Entpacken von Tupeln muss vor den Schlüsselwortargumenten in Bezug auf die Reihenfolge der Operation erfolgen. Könnte eine Auslassung sein ...
Fehler - Syntaktische Reue
1
@ MadPhysicist Mein schlechtes. Ich dachte an etwas anderes. Diese Syntax ist auch in Python 2 legal. Wie aus dem CPython-Testfall 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.
Blhsing