Qual è il nome di ** in python?

57

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

    
posta Niklas Rosencrantz 23.01.2012 - 18:41
fonte

3 risposte

80

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

  • "l'argomento della parola chiave decompressione della sintassi"

Se hai un elenco di argomenti, *args , si chiama "argomento disimballaggio" , nello stesso modo **kwargs è chiamato "argomento chiave disimballaggio" .

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

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'argomento *args è chiamato "parametro posizionale variabile" e **kwargs è il "parametro parola chiave variabile". Gli argomenti con parole chiave non possono essere forniti in modo posizionale, perché un parametro posizionale variabile prenderà tutti gli argomenti che passi.

La maggior parte di questo si può trovare in PEP 0362 e 3102 , nonché in Controllo flusso sezione dei documenti. Va notato tuttavia che l'oggetto di firma della funzione PEP è solo una bozza e la terminologia potrebbe essere solo l'idea di una persona. Ma sono comunque buoni termini. :)

Quindi gli argomenti * e ** decomprimono semplicemente le rispettive strutture di 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 metodo __iter__() e i mapping sono oggetti che implementano keys() e __getitem__() . Qualsiasi oggetto che supporti questo protocollo sarà compreso dai costruttori tuple() e dict() , quindi possono essere utilizzati per gli argomenti di spacchettamento.

    
risposta data 23.01.2012 - 19:46
fonte
13

Non penso che abbia un nome. Nei documenti Python in "Disimballaggio degli elenchi degli argomenti", viene definito semplicemente "il ** -operator ".

Non sono sicuro di cosa intendi per "l'altro" struttura dei dati. Quando fai f(**kwargs) spacchetti il dizionario kwargs come una sequenza di coppie chiave-valore. Non vedo che ci sia un'altra struttura coinvolta.

Copia la esempio nella documentazione di cui 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: Che cosa significa * args e ** kwargs?

    
risposta data 23.01.2012 - 19:04
fonte
3

Se non sei sicuro di cosa chiamare un particolare operatore o se è senza nome, puoi sempre ricorrere a Waka Waka Bang Splat come riferimento per aiutarti a capire come chiamarlo. In questo caso per ** lo chiamerei double-splat , anche se ci sono alcuni nomi alternativi per i simboli .

    
risposta data 27.01.2012 - 03:11
fonte

Leggi altre domande sui tag