class a(object):
data={'a':'aaa','b':'bbb','c':'ccc'}
def pop(self, key, *args):
return self.data.pop(key, *args)#what is this mean.
b=a()
print b.pop('a',{'b':'bbb'})
print b.data
self.data.pop(key, *args)
← ------ pourquoi y a-t-il un deuxième argument?
python
dictionary
zjm1126
la source
la source
help(b.data.pop)
dans le REPL.Réponses:
La
pop
méthode des dicts (commeself.data
, c'est-à-dire{'a':'aaa','b':'bbb','c':'ccc'}
ici) prend deux arguments - voir la documentationLe deuxième argument,,
default
est ce quipop
revient si le premier argumentkey
,, est absent. (Si vous appelezpop
avec un seul argumentkey
,, cela déclenche une exception si cette clé est absente).Dans votre exemple,
print b.pop('a',{'b':'bbb'})
ce n'est pas pertinent car il'a'
s'agit d' une cléb.data
. Mais si vous répétez cette ligne ...:vous verrez que cela fait une différence: le premier
pop
supprime la'a'
clé, donc dans le secondpop
l'default
argument est effectivement retourné (car il'a'
est maintenant absent deb.data
).la source
pop
un élémentdict
mais conserve la valeur de l'élément sauté. Ainsi,dict.pop(key)
supprime lekey
avec le associévalue
mais renvoie également levalue
dekey
qui vient d'être supprimé. Je l'ai trouvé utile ...pop()
- un comportement commun dans plus de langages comme JavaScript, PHP, Java, bien que tous les langages ne le fassent pas - par exemple C ++.Tant de questions ici. J'en vois au moins deux, peut-être trois:
*args
sert-il?La première question trouve une réponse triviale dans la référence de la bibliothèque standard Python :
La deuxième question est traitée dans la référence du langage Python :
En d'autres termes, la
pop
fonction prend au moins deux arguments. Les deux premiers reçoivent les nomsself
etkey
; 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 :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 endict
ce moment, etself.data.pop()
prend donc un ou deux paramètres; mais si vous deviezdata
être un type qui prenait 19 paramètres pour un appel,self.data.pop()
vous n'auriez pas du tout à changer de classea
. Vous devrez quand même changer tout code qui a appeléa.pop()
pour passer les 19 paramètres requis.la source
Lorsque vous définissez une fonction de cette façon,
*args
un tableau d'arguments sera transmis à la fonction. Cela permet à votre fonction de fonctionner sans savoir à l'avance combien d'arguments vont lui être transmis.Vous faites cela aussi avec des arguments de mots-clés, en utilisant
**kwargs
:Voir: Listes d'arguments arbitraires
Dans votre cas, vous avez défini une classe qui agit comme un dictionnaire. La
dict.pop
méthode est définie commepop(key[, default])
.Votre méthode n'utilise pas le
default
paramètre. Mais, en définissant votre méthode avec*args
et en passant*args
àdict.pop()
, vous autorisez l'appelant à utiliser ledefault
paramètre.En d'autres termes, vous devriez pouvoir utiliser la
pop
méthode de votre classe commedict.pop
:la source
la source