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 ?
- Qu'est-ce que
*args
à laquelle il est utilisé ?
La première question trouve une réponse triviale dans l'énoncé suivant Bibliothèque standard Python référence :
pop(clé[, défaut])
Si la clé est dans le dictionnaire, la supprimer et retourner sa valeur, sinon retourner la valeur par défaut. Si default n'est pas donné et que key n'est pas dans le dictionnaire, une KeyError est levée.
La deuxième question est traitée dans le Référence du langage Python :
Si la forme "*identifiant" est présente, elle est initialisée à un tuple recevant tout paramètre positionnel excédentaire, par défaut le tuple vide. Si la forme la forme "**identifiant" est présente, elle est initialisée en un nouveau dictionnaire recevant tout mot-clé excédentaire par défaut un nouveau dictionnaire vide. vide.
En d'autres termes, le pop
prend au moins deux arguments. Les deux premiers se voient attribuer les noms self
y key
et le reste est placé dans un tuple appelé args
.
Que se passe-t-il sur la ligne suivante quand *args
est transmis lors de 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 le Référence du langage Python :
Si la syntaxe *expression apparaît dans l'appel de fonction, l'expression doit être évaluée comme une séquence. Les éléments de cette séquence sont traités comme s'ils étaient des 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 dict
en ce moment, et donc self.data.pop()
prend un ou deux paramètres ; mais si vous avez modifié data
pour être un type qui prend 19 paramètres pour un appel à self.data.pop()
vous n'auriez pas à changer de classe a
du tout. Vous devrez toujours changer tout code qui appelle a.pop()
pour passer les 19 paramètres requis.