Warum löst dieser Code einen SyntaxError aus?
>>> 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 der folgende Code ohne sichtbare Fehler ausgeführt wird:
>>> def fun1(x, y, a="who is you", b="True"):
... print a,b,x,y
...
def myfunction(position_arguments, *arguments, **keywords):
"...."Antworten:
Alle erforderlichen Parameter müssen vor Standardargumenten stehen. Einfach, weil sie obligatorisch sind, Standardargumente jedoch nicht. Syntaktisch wäre es für den Interpreter unmöglich zu entscheiden, welche Werte mit welchen Argumenten übereinstimmen, wenn gemischte Modi zulässig wären. A
SyntaxError
wird ausgelöst, wenn die Argumente nicht in der richtigen Reihenfolge angegeben werden:Lassen Sie uns mit Ihrer Funktion einen Blick auf Schlüsselwortargumente werfen.
Angenommen, es ist erlaubt, die Funktion wie oben zu deklarieren. Dann können wir mit den obigen Deklarationen die folgenden (regulären) Positions- oder Schlüsselwortargumentaufrufe durchführen:
Wie Sie die Zuweisung von Variablen im Funktionsaufruf vorschlagen, wie Standardargumente zusammen mit Schlüsselwortargumenten verwendet werden.
Referenz O'Reilly - Core-Python
Wobei diese Funktion die Standardargumente verwendet, die für die obigen Funktionsaufrufe syntaktisch korrekt sind. Das Aufrufen von Schlüsselwortargumenten erweist sich als nützlich, um Positionsargumente außerhalb der Reihenfolge bereitstellen zu können. In Verbindung mit Standardargumenten können sie jedoch auch verwendet werden, um fehlende Argumente zu "überspringen".
quelle
func1(x=1, y=2)
.**kwargs
kann nichtdef fun1(a="who is you", b="True", x, y)
oder ähnliche Arbeit machen. Wenn Sie verwendendef f(**kwargs)
, müssen Sie Standardwerte im Körper behandeln?def fun1(a="who is you", b="True", x, y)
das gleiche mit einem anderen Stil erreicht werden. Wenn def fun1 (** kwrgs) `, dann rufen Siefun1({'a': 'who is you', 'b': True})
keine Notwendigkeit auf, x und y zu übergeben.def foo(x=None, y)
dies zulässig wäre. Ich bin also immer noch neugierig, warum dies von Python nicht erlaubt wird. Gibt es einen wirklich fundamentalen Grund oder ist es nur "wir erlauben es nicht, weil wir es nicht erlauben".Wenn Sie dies zulassen, werden die Standardargumente unbrauchbar, da Sie ihre Standardwerte niemals verwenden können, da die nicht standardmäßigen Argumente nachher kommen .
In Python 3 können Sie jedoch Folgendes tun:
das macht
x
undy
Schlüsselwort nur, damit Sie dies tun können:Dies funktioniert, weil keine Mehrdeutigkeit mehr besteht. Beachten Sie,
fun1(2, 2)
dass Sie dies immer noch nicht tun können (dies würde die Standardargumente festlegen).quelle
Lassen Sie mich hier zwei Punkte klarstellen:
def example(a, b, c=None, r="w" , d=[], *ae, **ab):
(a, b) sind Positionsparameter
(c = keine) ist ein optionaler Parameter
(r = "w") ist der Schlüsselwortparameter
(d = []) ist der Listenparameter
(* ae) ist nur mit Schlüsselwörtern
(** ab) ist der var-Schlüsselwortparameter
def example(a, b, c=a,d=b):
Das Argument ist nicht definiert, wenn Standardwerte gespeichert werden. Python berechnet und speichert Standardwerte, wenn Sie die Funktion definieren
c und d sind nicht definiert, existieren nicht, wenn dies geschieht (es existiert nur, wenn die Funktion ausgeführt wird)
"a, a = b" ist im Parameter nicht erlaubt.
quelle
Erforderliche Argumente (diejenigen ohne Standardeinstellungen) müssen am Anfang stehen, damit der Clientcode nur zwei liefern kann. Wenn die optionalen Argumente am Anfang wären, wäre dies verwirrend:
Was würde das in Ihrem ersten Beispiel tun? Im letzten ist x "wer ist wer", y ist 3 und a = "jack".
quelle