2013-06-05 5 views
62

Warum wirft dieser Code einen SyntaxError?Warum können nicht standardmäßige Argumente den Standardargumenten folgen?

>>> def fun1(a="who is you", b="True", x, y): 
...  print a,b,x,y 
... 
    File "<stdin>", line 1 
SyntaxError: non-default argument follows default argument 

Während das folgende Stück Code ohne sichtbare Fehler ausgeführt wird:

>>> def fun1(x, y, a="who is you", b="True"): 
...  print a,b,x,y 
... 
+0

in Python, das ist, wie die Struktur ist, wenn Sie eine Funktion 'def myfunction (position_arguments, * Argumente, ** Schlüsselwörter) definieren:' ' ....' – abhishekgarg

Antwort

72

Alle erforderlichen Parameter müssen vor allen Standardargumenten platziert werden. Einfach, weil sie obligatorisch sind, während Standardargumente dies nicht sind. Syntaktisch wäre es unmöglich für den Interpreter zu entscheiden, welche Werte mit welchen Argumenten übereinstimmen, wenn gemischte Modi zulässig sind. Eine SyntaxError wird ausgelöst, wenn die Argumente nicht in der richtigen Reihenfolge angegeben werden:

Werfen wir einen Blick auf Keyword-Argumente, mit Ihrer Funktion.

def fun1(a="who is you", b="True", x, y): 
...  print a,b,x,y 

seine Angenommen erlaubt Funktion zu erklären, wie oben, dann mit den obigen Erklärungen können wir die folgende (regular) Stellungs- oder Schlüsselwort-Argument telefonieren:

func1("ok a", "ok b", 1) # Is 1 assigned to x or ? 
func1(1)     # Is 1 assigned to a or ? 
func1(1, 2)    # ? 

Wie Sie die Zuordnung vorschlagen wird von Variablen im Funktionsaufruf, wie Standardargumente zusammen mit Schlüsselwortargumenten verwendet werden.

>>> def fun1(x, y, a="who is you", b="True"): 
...  print a,b,x,y 
... 

Referenz O'Reilly - Kern-Python
Wo, wie diese Funktion Verwendung der Standardargumente syntaktisch korrekt für obige Funktion telefonieren. Der Aufruf von Schlüsselwortargumenten erweist sich als nützlich, um Positionsargumente außerhalb der Reihenfolge bereitstellen zu können. Sie können jedoch auch in Verbindung mit Standardargumenten dazu verwendet werden, fehlende Argumente zu überspringen.

+0

Syntaktisch könnte der Interpreter nicht entscheiden, welche Werte mit welchen Argumenten übereinstimmen, wenn gemischte Modi erlaubt sind. Ruby erlaubt Nicht-Standardargumente nach Standard-Argumenten. Wie Sie die Zuweisung von Variablen im Funktionsaufruf vorschlagen Verwenden Sie einfach 'func1 (x = 1, y = 2)'. – weakish

+0

Hallo @weakish, danke für den Kommentar, Python hat einen schönen Weg, um dies zu erreichen, Bitte gehen Sie für * Args und ** kwargs –

+0

Hi @Rahul Gautam Ich bin verwirrt. Ich dachte '' kwargs' kann 'def fun1 'nicht machen (a =" wer bist du ", b =" Wahr ", x, y) oder ähnliches. Wenn Sie 'def f (** kwargs)' verwenden, müssen Sie Standardwerte im Hauptteil behandeln? – weakish

0

Erforderliche Argumente (die, die ohne Verzug), muss am Anfang seine Client-Code zu ermöglichen, nur zwei zu versorgen. Wenn die optionalen Argumente am Anfang wären, wäre es verwirrend:

Was würde das in Ihrem ersten Beispiel tun? In der letzten ist x "wer ist wer", y ist 3 und a = "jack".

9
SyntaxError: non-default argument follows default argument 

Wenn Sie dies zulassen waren, würden die Standardargumente unbrauchbar gemacht, weil Sie nie die Standardwerte zu verwenden, wäre in der Lage, die Nicht-Standard-Argumente kommen seit nach.

In Python 3 jedoch können Sie wie folgt vorgehen:

def fun1(a="who is you", b="True", *, x, y): 
    pass 

die nur x und y Stichwort macht so können Sie dies tun:

fun1(x=2, y=2) 

Dies funktioniert, weil es nicht mehr die Mehrdeutigkeit. Beachten Sie, dass Sie immer noch fun1(2, 2) nicht tun können (das würde die Standardargumente setzen).

+0

Keyword-only Argumente sind ein nettes Feature von Python 3. Schade, dass der Patch, um sie nach Python 2.6 und 2.7 zurück zu portieren, einfach [ausläuft] (http://bugs.python.org/issue1745). –

3

Lassen Sie mich klar zwei Punkte hier:

  • zunächst nicht-Standard-Argument sollte nicht Standard-Argument folgen, es bedeutet, dass Sie nicht definieren kann (a = b, c) in Funktion der Ordnungsparameter der Definition in Funktion ist:
    • Positionsparameter oder nicht-Standard-Parameter dh (a, b, c)
    • Schlüsselwort-Parameter oder Standardparameter, dh (a = "b", R = "j")
    • keyword- einziger Parameter ie (* args)
    • var-Schlüsselwort-Parameter, dh (** kwargs)

def example(a, b, c=None, r="w" , d=[], *ae, **ab):

(a, b) Positionsparameter sind

(c = keine) ist optional Parameter

(r = "w") ist Schlüsselwortparameter

(d = []) ist Listenparameter

(* ae) ist Keyword-only

(** ab) var-Schlüsselwort Parameter

  • jetzt zweitrangig ist, wenn ich so etwas wie dies versuchen: def example(a, b, c=a,d=b):

Argument ist nicht definiert, wenn Standardwerte gespeichert werden, Python berechnet und speichert Standardwerte, wenn Sie die Funktion

definieren

c und d sind nicht definiert, existiert nicht, wenn dies passiert (es existiert nur wenn die Funktion ausgeführt wird)

"a, a = b" ist im Parameter nicht erlaubt.

0

wurde durch den Working Machanism Python Argumenten Parser entschieden. Nichts magisches hier.

Verwandte Themen