Was bewirkt ein bloßes Sternchen in den Argumenten einer Funktion?
Wenn ich mir das Gurkenmodul anschaue , sehe ich Folgendes:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
Ich kenne ein einzelnes und ein doppeltes Sternchen vor Argumenten (für eine variable Anzahl von Argumenten), aber dies geht nichts voraus. Und ich bin mir ziemlich sicher, dass dies nichts mit Gurke zu tun hat. Das ist wahrscheinlich nur ein Beispiel dafür. Ich habe den Namen erst erfahren, als ich ihn an den Dolmetscher geschickt habe:
>>> def func(*):
... pass
...
File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
Wenn es darauf ankommt, bin ich auf Python 3.3.0.
Antworten:
Bare
*
wird verwendet, um den Aufrufer zu zwingen, benannte Argumente zu verwenden. Sie können also keine Funktion mit*
als Argument definieren, wenn Sie keine folgenden Schlüsselwortargumente haben.Weitere Informationen finden Sie in dieser Antwort oder in der Python 3-Dokumentation .
quelle
*args
, vor dem Bare stehen müssen*
.*
ist anstelle von*args
und umgekehrt; Sie können in einer Signatur nicht koexistieren. Deshalb haben sie gewählt*
; Zuvor*args
war die einzige Möglichkeit , rein Positionsargumente zu zwingen, und es markiert das Ende der Argumente , die konnte positionsübergeben werden (da sie alle verbleibenden Positions Argumente gesammelt, sie könnten die folgenden benannten Argumente erreichen).*
bedeutet, dass die gleichen "Positionsargumente hier nicht darüber hinausgehen können", aber das Fehlen eines Namens bedeutet "aber ich werde sie überhaupt nicht akzeptieren, weil ich mich dafür entschieden habe, keinen Platz für sie zu schaffen".Während die ursprüngliche Antwort die Frage vollständig beantwortet, fügen Sie einfach ein paar verwandte Informationen hinzu. Das Verhalten für das einzelne Sternchen ergibt sich aus
PEP-3102
. Zitieren des verwandten Abschnitts:In einfachem Englisch bedeutet dies, dass Sie den Wert für key explizit als übergeben müssen, um ihn zu übergeben
key="value"
.quelle
*
ist, verbleibende Positionsargumente zu verschlingen, aber das ist nicht der Fall. Das Übergeben zusätzlicher Positionsargumente als von der Funktion erwartet, führt zu einem Fehler dieser Art:foo() takes exactly 1 positional argument (2 given)
das obige Beispiel mit ** kwargs
quelle
Semantisch bedeutet dies, dass die darauf folgenden Argumente nur Schlüsselwörter sind. Sie erhalten also eine Fehlermeldung, wenn Sie versuchen, ein Argument anzugeben, ohne dessen Namen anzugeben. Beispielsweise:
Pragmatisch bedeutet dies, dass Sie die Funktion mit einem Schlüsselwortargument aufrufen müssen. Dies geschieht normalerweise, wenn es schwierig ist, den Zweck des Arguments ohne den Hinweis durch den Namen des Arguments zu verstehen.
Vergleiche zB
sorted(nums, reverse=True)
vs. wenn du geschrieben hastsorted(nums, True)
. Letzteres wäre viel weniger lesbar, daher haben die Python-Entwickler beschlossen, Sie dazu zu bringen, es auf die erstere Weise zu schreiben.quelle
Angenommen, Sie haben Funktion:
Sie können diese Funktion auf zwei Arten aufrufen:
sum(1,2)
odersum(1,key=2)
Angenommen, Sie möchten
sum
, dass die Funktion nur mit Schlüsselwortargumenten aufgerufen wird.Sie fügen
*
der Funktionsparameterliste hinzu, um das Ende der Positionsargumente zu markieren.Also Funktion definiert als:
darf nur mit aufgerufen werden
sum(1,key=2)
quelle
Ich habe den folgenden Link als sehr hilfreich zu erklären
*
,*args
und**kwargs
:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/
Zusätzlich zu den obigen Antworten habe ich auf der obigen Website (Kredit: https://pythontips.com/author/yasoob008/ ) Folgendes gelernt :
Mit der unten zuerst definierten Demonstrationsfunktion gibt es zwei Beispiele, eines mit
*args
und eines mit**kwargs
Auf diese Weise
*args
können Sie dynamisch eine Liste von Argumenten erstellen, die in der Reihenfolge aufgenommen werden, in der sie**kwargs
eingegeben werden, während Sie die Übergabe von NAMED-Argumenten ermöglichen und von NAME entsprechend verarbeitet werden können (unabhängig von der Reihenfolge, in der sie eingegeben werden). .Die Site fährt fort und merkt an, dass die richtige Reihenfolge der Argumente sein sollte:
quelle