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 **
?
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 **
?
Non è un operatore in quanto tale, quindi veramente ha un nome, ma è definito come una" regola sintattica ". Quindi dovrebbe essere chiamato:
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.
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?
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 .
Leggi altre domande sui tag python operators type-conversion