it-swarm.com.de

Wie heißt ** in Python?

Beim Programmieren Python mache ich manchmal ein ** um eine Konvertierung vorzunehmen. Ich verstehe, was es tut, aber welche Datenstrukturen manipuliere ich? A dict und was ist der andere? Ein array? Gibt es einen Namen für das ** Operator?

59
Niklas

Es ist kein Operator als solcher, also hat es nicht wirklich einen Namen, sondern es ist als "syntaktische Regel" definiert . Also sollte es heißen:

  • "Das Schlüsselwortargument entpackt die Syntax"

Wenn Sie eine Liste von Argumenten haben, *args, Heißt sie "Argument entpacken", auf die gleiche Weise heißt **kwargs"Schlüsselwortargument entpacken"..

Wenn Sie es auf der linken Seite eines = Verwenden, wie in a, *middle, end = my_Tuple, Würden Sie "Tupelentpacken" sagen.

Insgesamt gibt es drei Arten von (Einzelparameter-) Argumenten:

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

Das Argument *args Wird als "variabler Positionsparameter" bezeichnet, und **kwargs Ist der "variable Schlüsselwortparameter". Nur-Schlüsselwort-Argumente können nicht positionell angegeben werden, da ein variabler Positionsparameter alle von Ihnen übergebenen Argumente übernimmt.

Das meiste davon finden Sie in den PEPs 62 und 102 sowie im Abschnitt Control Flow der Dokumente. Es sollte jedoch beachtet werden, dass das Funktionssignaturobjekt PEP nur ein Entwurf ist und die Terminologie möglicherweise nur die Idee einer Person ist. Aber sie sind trotzdem gute Begriffe. :) :)

Die Argumente * Und ** Entpacken also einfach ihre jeweiligen Datenstrukturen:

args = (1, 2, 3)  # usually a Tuple, always an iterable[1]

f(*args) → f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[1]: Iterables sind Objekte, die die Methode __iter__() implementieren, und Zuordnungen sind Objekte, die keys() und __getitem__() implementieren. Jedes Objekt, das dieses Protokoll unterstützt, wird von den Konstruktoren Tuple() und dict() verstanden, sodass sie zum Entpacken von Argumenten verwendet werden können.

86
Stefano Palazzo

Ich glaube nicht, dass es einen Namen hat. In Python Docs unter "Argumentlisten entpacken" wird es nur als "** - Operator" bezeichnet.

Ich bin mir nicht sicher, was Sie unter "der anderen" Datenstruktur verstehen. Wenn Sie f(**kwargs) ausführen, entpacken Sie das Wörterbuch kwargs als 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 Klarheit kopieren.

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

Siehe auch: Was bedeutet * args und ** kwargs?

13
Kris Harper

Wenn Sie sich nicht sicher sind, wie Sie einen bestimmten Operator nennen sollen, oder wenn er nicht benannt ist, können Sie jederzeit auf Waka Waka Bang Splat als Referenz zurückgreifen, um die Abbildung zu erleichtern heraus, wie man es nennt. In diesem Fall würde ich für **double-splat Nennen, obwohl es einige alternative Namen für Symbole gibt .

3
aculich