Tante domande qui. Vedo almeno due, forse tre:
- Cosa fa pop (a, b)? / Perché c'è un secondo argomento?
- A cosa
*args
serve?
La prima domanda trova una risposta banale nel riferimento alla libreria standard Python :
pop (tasto [, predefinito])
Se la chiave è nel dizionario, rimuoverla e restituirne il valore, altrimenti restituire il valore predefinito. Se non viene fornito il valore predefinito e la chiave non è nel dizionario, viene sollevata un'eccezione KeyError.
La seconda domanda è trattata nel Python Language Reference :
Se è presente la forma "* identificatore", viene inizializzata a una tupla che riceve eventuali parametri posizionali in eccesso, impostando di default la tupla vuota. Se è presente la forma "** identificatore", viene inizializzato su un nuovo dizionario che riceve eventuali argomenti di parole chiave in eccesso, impostando di default un nuovo dizionario vuoto.
In altre parole, la pop
funzione accetta almeno due argomenti. Ai primi due vengono assegnati i nomi self
e key
; e il resto viene inserito in una tupla chiamata args
.
Quello che accade nella riga successiva quando *args
viene passato nella chiamata a self.data.pop
è il contrario di questo: la tupla *args
viene espansa a dei parametri posizionali che vengono passati. Questo è spiegato nella Guida di riferimento al linguaggio Python :
Se l'espressione della sintassi * appare nella chiamata di funzione, l'espressione deve restituire una sequenza. Gli elementi di questa sequenza vengono trattati come se fossero argomenti posizionali aggiuntivi
In breve, a.pop()
vuole essere flessibile e accettare un numero qualsiasi di parametri posizionali, in modo che possa passare questo numero sconosciuto di parametri posizionali a self.data.pop()
.
Questo ti dà flessibilità; data
sembra essere un in dict
questo momento, e quindi self.data.pop()
richiede uno o due parametri; ma se cambiaste data
per essere un tipo che richiede 19 parametri per una chiamata a non self.data.pop()
dovreste cambiare classe a
. a.pop()
Tuttavia, dovresti comunque modificare qualsiasi codice chiamato per passare i 19 parametri richiesti.
help(b.data.pop)
nel REPL.