97 votes

En Python, que signifie dict.pop(a,b) ?

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 ?

126voto

Alex Martelli Points 330805

Le site pop des dicts (comme self.data c'est-à-dire {'a':'aaa','b':'bbb','c':'ccc'} ici) prend deux arguments -- voir les docs

Le deuxième argument, default c'est ce que pop retourne si le premier argument, key est absent. (Si vous appelez pop avec un seul argument, key il lève une exception si cette clé est absente).

Dans votre exemple, print b.pop('a',{'b':'bbb'}) mais cela n'est pas pertinent car 'a' es une clé dans b.data . Mais si vous répétez cette ligne. . :

b=a()
print b.pop('a',{'b':'bbb'})
print b.pop('a',{'b':'bbb'})
print b.data

vous verrez que cela fait une différence : le premier pop supprime le 'a' donc dans la deuxième pop le site default est effectivement retourné (puisque 'a' est maintenant absent de b.data ).

28voto

James Polley Points 4258

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.

7voto

James Polley Points 4258
>>> def func(a, *args, **kwargs):
...   print 'a %s, args %s, kwargs %s' % (a, args, kwargs)
... 
>>> func('one', 'two', 'three', four='four', five='five')
a one, args ('two', 'three'), kwargs {'four': 'four', 'five': 'five'}

>>> def anotherfunct(beta, *args):
...   print 'beta %s, args %s' % (beta, args)
... 
>>> def func(a, *args, **kwargs):
...   anotherfunct(a, *args)
... 
>>> func('one', 'two', 'three', four='four', five='five')
beta one, args ('two', 'three')
>>>

7voto

Seth Points 18568
def func(*args): 
    pass

Lorsque vous définissez une fonction de cette façon, *args sera un tableau d'arguments passés à la fonction. Cela permet à votre fonction de fonctionner sans savoir à l'avance combien d'arguments vont lui être passés.

Vous pouvez également le faire avec des arguments de mots-clés, en utilisant **kwargs :

def func2(**kwargs): 
    pass

Voir : Listes d'arguments arbitraires


Dans votre cas, vous avez défini une classe qui agit comme un dictionnaire. Le site dict.pop est définie comme suit pop(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 a dict.pop() vous permettez à l'appelant d'utiliser l'outil de gestion de l'information. default paramètre.

En d'autres termes, vous devriez être en mesure d'utiliser la classe pop méthode comme dict.pop :

my_a = a()
value1 = my_a.pop('key1')       # throw an exception if key1 isn't in the dict
value2 = my_a.pop('key2', None) # return None if key2 isn't in the dict

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X