Ich lerne, Positionsargumente in Python zu verwenden und versuche auch zu sehen, wie sie funktionieren, wenn sie mit Standardargumenten vermischt werden: -
%Vor%Dies gibt mir die Ausgabe:
%Vor% Wie Sie sehen, wird a
als ein Wert betrachtet, der für ae
übergeben wurde, und b
sowie c
werden als Positionsargumente betrachtet.
Also versuche ich jetzt 10
für ae
zuzuweisen, während ich withPositionalArgs
:
Aber ich kann es nicht tun. Ich bekomme den Fehler:
%Vor%Meine Frage ist:
Mache ich richtig? Ist die Verwendung von Standardargument erlaubt oder eine gute Übung vor Positionsargumenten in Python-Funktionen?
In Python2 dürfen Sie keine Argumente mit einem Standardwert vor Positionsargumenten einfügen.
Die Positionsargumente müssen zuerst kommen, dann die Argumente mit Standardwerten (oder, wenn die Funktion aufgerufen wird, die Schlüsselwortargumente), dann *args
und dann **kwargs
.
Diese Reihenfolge ist sowohl für die Funktionsdefinition als auch für Funktionsaufrufe erforderlich.
In Python3 wurde die Reihenfolge gelockert. (Zum Beispiel kann *args
vor einem Schlüsselwortargument in der Funktionsdefinition stehen.) Siehe PEP3102 .
Ich denke, wir sollten die Unterscheidung zwischen Standardwerten und der Übergabe von beliebigen Argumenten / Schlüssel / Wert-Paaren vornehmen. Das Verhalten ohne Standardwerte ist dasselbe:
%Vor% Die Art, wie wir das geschrieben haben, bedeutet, dass das erste Argument in f
im Tupel args
übergeben wurde, also f(1,2,3,a=1,b=2)
(die Sequenz geht in explizite Argumente, * args, ** kwargs). Hier: ae = 1, args = (2,3), kwargs = {'a': 1, 'b': 2}
.
Wenn wir versuchen, f(1,2,3,a=1,ae=3)
zu übergeben, wird ein TypeError: f() got multiple values for keyword argument 'ae'
geworfen, da versucht wird, den Wert von ae
zweimal zu ändern.
.
Eine Möglichkeit, ae
nur dann zu setzen, wenn es explizit vorgeschrieben ist, könnten wir (nach der def-Zeile):
und diesmal g(1,2,3,a=1,ae=3)
setzt args=(1,2,3), kwargs={a=1,ae=3}
.
Ich vermute jedoch, dass dies keine bewährte Vorgehensweise ist ...
Python3 hat die Reihenfolge entspannt.
Jetzt können Sie etwas tun wie:
%Vor%Tags und Links python