Verwendung von Standardargumenten vor Positionsargumenten

9

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 :

anrufe %Vor%

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?

    
GodMan 08.09.2012, 15:52
quelle

3 Antworten

9

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 .

    
unutbu 08.09.2012, 15:55
quelle
2

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):

%Vor%

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 ...

    
Andy Hayden 08.09.2012 16:47
quelle
1

Python3 hat die Reihenfolge entspannt.

Jetzt können Sie etwas tun wie:

%Vor%     
Shiran Abbasi 27.04.2017 18:27
quelle

Tags und Links