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
*argssert-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 popfonction prend au moins deux arguments. Les deux premiers reçoivent les noms selfet key; et le reste est placé dans un tuple appelé args.
Ce qui se passe sur la ligne suivante quand *argsest passé dans l'appel à self.data.popest l'inverse de ceci - le tuple *argsest é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é; datase trouve être un en dictce 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.