Tant de questions ici. J'en vois au moins deux, peut-être trois:
- Que fait pop (a, b)? / Pourquoi y a-t-il un deuxième argument?
- À quoi
*args
sert-il?
La première question trouve une réponse triviale dans la référence de la bibliothèque standard Python :
pop (clé [, par défaut])
Si la clé est dans le dictionnaire, supprimez-la et renvoyez sa valeur, sinon renvoyez la valeur par défaut. Si la valeur par défaut n'est pas indiquée et que la clé n'est pas dans le dictionnaire, une KeyError est déclenchée.
La deuxième question est traitée dans la référence du langage Python :
Si la forme «* identifiant» est présente, elle est initialisée à un tuple recevant tous les paramètres de position en excès, par défaut au tuple vide. Si la forme «** identifiant» est présente, elle est initialisée à un nouveau dictionnaire recevant tout argument de mot-clé en excès, par défaut à un nouveau dictionnaire vide.
En d'autres termes, la pop
fonction prend au moins deux arguments. Les deux premiers reçoivent les noms self
et key
; et le reste est placé dans un tuple appelé args
.
Ce qui se passe sur la ligne suivante quand *args
est passé dans l'appel à self.data.pop
est l'inverse de ceci - le tuple *args
est étendu à des paramètres de position qui sont transmis. Ceci est expliqué dans la référence du langage Python :
Si l'expression syntaxique * apparaît dans l'appel de fonction, l'expression doit s'évaluer en une séquence. Les éléments de cette séquence sont traités comme s'il s'agissait d'arguments positionnels supplémentaires
En bref, a.pop()
veut être flexible et accepter n'importe quel nombre de paramètres de position, afin de pouvoir transmettre ce nombre inconnu de paramètres de position à self.data.pop()
.
Cela vous donne de la flexibilité; data
se trouve être un en dict
ce moment, et self.data.pop()
prend donc un ou deux paramètres; mais si vous deviez data
être un type qui prenait 19 paramètres pour un appel, self.data.pop()
vous n'auriez pas du tout à changer de classe a
. Vous devrez quand même changer tout code qui a appelé a.pop()
pour passer les 19 paramètres requis.
help(b.data.pop)
dans le REPL.