Tante domande qui. Vedo almeno due, forse tre:
- Cosa fa pop (a, b)? / Perché c'è un secondo argomento?
- A cosa
*argsserve?
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 popfunzione accetta almeno due argomenti. Ai primi due vengono assegnati i nomi selfe key; e il resto viene inserito in una tupla chiamata args.
Quello che accade nella riga successiva quando *argsviene passato nella chiamata a self.data.popè il contrario di questo: la tupla *argsviene 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à; datasembra essere un in dictquesto momento, e quindi self.data.pop()richiede uno o due parametri; ma se cambiaste dataper 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.