Beim Programmieren von Python mache ich manchmal **
eine Konvertierung. Ich verstehe, was es tut, aber welche Datenstrukturen bearbeite ich? A dict
und was ist der andere? Ein array
? Gibt es einen Namen für den **
Betreiber?
python
operators
type-conversion
Niklas Rosencrantz
quelle
quelle
**
. Macht und "Keyword-Argument-Wörterbuch". Über was redest du? Die Dokumentation enthält die folgenden Wörter: "Wenn das Formular" ** bezeichner "vorhanden ist, wird es mit einem neuen Wörterbuch initialisiert, das alle überzähligen Schlüsselwortargumente empfängt. Standardmäßig wird ein neues leeres Wörterbuch verwendet." Welche davon scheinen für Ihre Frage relevant zu sein?Antworten:
Es ist kein Operator als solcher, hat also eigentlich keinen Namen, ist aber als "syntaktische Regel" definiert . Also sollte es heißen:
Wenn Sie eine Liste von Argumenten haben,
*args
, nennt man das „Argument auspacken“ , auf die gleiche Weise**kwargs
heißt „Schlüsselwort - Argument Auspacken“ .Wenn Sie es auf der linken Seite eines
=
wie in verwendena, *middle, end = my_tuple
, würden Sie "Tupel auspacken" sagen .Insgesamt gibt es drei Arten von (Einzelparameter-) Argumenten:
Das
*args
Argument heißt "variabler Positionsparameter" und**kwargs
ist der "variable Schlüsselwortparameter". Nur-Schlüsselwort-Argumente können nicht positionsbezogen angegeben werden, da ein variabler Positionsparameter alle von Ihnen übergebenen Argumente akzeptiert.Das meiste davon finden Sie in den PEPs 0362 und 3102 sowie im Abschnitt Kontrollfluss in den Dokumenten. Es sollte jedoch beachtet werden, dass das Funktionssignaturobjekt PEP nur ein Entwurf ist und die Terminologie möglicherweise nur eine Idee einer Person ist. Aber sie sind trotzdem gute Begriffe. :)
Die Argumente
*
und**
entpacken also einfach ihre jeweiligen Datenstrukturen:[1]: Iterables sind Objekte, die die
__iter__()
Methode implementieren , und Mappings sind Objekte, diekeys()
und implementieren__getitem__()
. Alle Objekte, die dieses Protokoll unterstützen, werden von den Konstruktoren verstandentuple()
unddict()
können daher zum Entpacken von Argumenten verwendet werden.quelle
def f(x, *xs, y=0): pass
ist die Syntax von Python 2. {5,6,7} nicht gültig, und es wird auch nicht dasdef f(x, y=0, *xs):
getan, was Sie vielleicht erwarten. AFAIK ist der einzige Weg, um die (offensichtlich) beabsichtigte Wirkung zu erzielendef f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...
. Python 3 behandelt die ursprüngliche Syntax wie erwartet.begin, *middle, end = (0, 1, 2, 3, 4, 5)
Syntax funktioniert auch in Python 2.x nicht.Ich glaube nicht, dass es einen Namen hat. In den Python-Dokumenten unter "Entpacken von Argumentlisten" wird es nur als "der
**
-Operator" bezeichnet.Ich bin nicht sicher, was Sie mit "der anderen" Datenstruktur meinen. Wenn Sie dies tun
f(**kwargs)
, entpacken Sie das Wörterbuchkwargs
als eine Folge von Schlüssel-Wert-Paaren. Ich sehe nicht, dass es sich um eine andere Struktur handelt.Ich werde das Beispiel in der obigen Dokumentation zur Verdeutlichung kopieren .
Siehe auch: Was bedeuten * args und ** kwargs?
quelle
f(**kwargs)
...Wenn Sie sich nicht sicher sind, wie Sie einen bestimmten Operator anrufen sollen, oder wenn er nicht benannt ist, können Sie immer auf Waka Waka Bang Splat als Referenz zurückgreifen , um herauszufinden, wie Sie ihn anrufen sollen. In diesem Fall
**
würde ich es nennendouble-splat
, obwohl es einige alternative Namen für Symbole gibt .quelle