Qual è il nome di ** in python?


59

Durante la programmazione di Python a volte faccio **una conversione. Capisco cosa fa ma quali strutture di dati sto manipolando? A dicte qual è l'altro? Un array? C'è un nome per l' **operatore?


3
operatore esponenziale?
Rook,

12
Ci sono due significati per **. Potenza e "dizionario degli argomenti delle parole chiave". Di che stai parlando? La documentazione contiene queste parole: "Se il modulo" ** identificatore "è presente, viene inizializzato su un nuovo dizionario che riceve eventuali argomenti di parole chiave in eccesso, per impostazione predefinita su un nuovo dizionario vuoto." Quali di questi sembrano pertinenti alla tua domanda?
S. Lott,

"dizionario per parole chiave" era quello di cui mi chiedevo. Grazie per i commenti
Niklas Rosencrantz,

Risposte:


86

Non è un operatore in quanto tale, quindi non ha in realtà ha un nome, ma è definito come "regola sintattica" . Quindi dovrebbe essere chiamato:

  • "l'argomento della parola chiave decomprimendo la sintassi"

Se hai un elenco di argomenti, *argssi chiama "decompressione dell'argomento" , allo stesso modo **kwargssi chiama "decompressione dell'argomento della parola chiave" .

Se lo usi sul lato sinistro di un =, come in a, *middle, end = my_tuple, diresti "tuple disimballaggio" .

In totale, ci sono tre tipi di argomenti (parametro singolo):

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

L' *argsargomento si chiama "parametro di posizione variabile" ed **kwargsè il "parametro di parola chiave variabile". Gli argomenti di sola parola chiave non possono essere proposti in modo posizionale, poiché un parametro di posizione variabile prenderà tutti gli argomenti passati.

La maggior parte di questo può essere trovata nei PEP 0362 e 3102 , nonché nella sezione Flusso di controllo dei documenti. Va notato tuttavia che l'oggetto firma della funzione PEP è solo una bozza e la terminologia potrebbe essere solo un'idea di una persona. Ma sono comunque buone condizioni. :)

Quindi gli argomenti *e **decomprimono le rispettive strutture dati:

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 sono oggetti che implementano il __iter__()metodo e mapping sono oggetti che implementano keys()e __getitem__(). Qualsiasi oggetto che supporti questo protocollo sarà compreso dai costruttori tuple()e dict(), quindi, potranno essere utilizzati per decomprimere gli argomenti.


3
Nel caso in cui qualcun altro sia confuso, def f(x, *xs, y=0): passnon è valida la sintassi di Python 2. {5,6,7}, né fa def f(x, y=0, *xs):ciò che ci si potrebbe aspettare. AFAIK, l'unico modo per ottenere l'effetto (ovviamente) previsto è def f(x, *xs, **kw): y=kw.get('y', 0); del kw; .... Python 3 gestisce la sintassi originale come previsto.
Chbrown

1
Mentre ci siamo: la begin, *middle, end = (0, 1, 2, 3, 4, 5)sintassi non funziona neanche in Python 2.x.
Stefano Palazzo,

Questa risposta non è corretta in Python 3.5 e versioni successive. PEP-448 specifica l'operatore ** come operatore di decompressione del dizionario. Vedi python.org/dev/peps/pep-0448
devnul3,

13

Non credo abbia un nome. In Python Docs in "Unpacking Liste di argomenti", viene appena chiamato "l' **operatore".

Non sono sicuro di cosa intendi per "l'altra" struttura dei dati. Quando lo fai f(**kwargs)scompattate il dizionario kwargscome una sequenza di coppie chiave-valore. Non vedo che c'è un'altra struttura coinvolta.

Copierò l' esempio nella documentazione sopra per maggiore chiarezza.

>>> 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 !

Vedi anche: Cosa significano * args e ** kwargs?


Esistono diversi modi in cui un lettore può interpretare f(**kwargs)...
Deer Hunter,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.