146 votes

La méthode de classe génère "TypeError: ... a reçu plusieurs valeurs pour l'argument de mot-clé ..."

Si je définis une méthode de classe avec un argument de mot-clé de la manière suivante :

class foo(object):
  def foodo(chose=None, string='pas sous-vêtements'):
    print chose if chose else "rien" 
    print 'un string est', string

appeler la méthode génère une TypeError :

myfoo = foo()
myfoo.foodo(chose="quelque chose")

...
TypeError: foodo() a reçu des valeurs multiples pour l'argument de mot-clé 'chose'

Que se passe-t-il?

4voto

Ayodhyankit Paul Points 4505

Je veux ajouter une réponse de plus :

Cela se produit lorsque vous essayez de passer un paramètre positionnel avec un ordre de position incorrect ainsi qu'un argument clé lors de l'appel d'une fonction.

il y a une différence entre paramètre et argument que vous pouvez lire en détail ici Arguments and Parameter in python

def hello(a,b=1, *args):
   print(a, b, *args)

hello(1, 2, 3, 4,a=12)

puisque nous avons trois paramètres :

a est un paramètre positionnel

b=1 est un paramètre de mot-clé et par défaut

*args est un paramètre de longueur variable

donc nous attribuons d'abord a comme paramètre positionnel, cela signifie que nous devons fournir une valeur à l'argument positionnel dans l'ordre de sa position, ici l'ordre est important. mais nous passons l'argument 1 à la place de a dans la fonction d'appel, puis nous fournissons également une valeur à a, considérée comme un argument clé. maintenant a a deux valeurs :

une est une valeur positionnelle: a=1

la deuxième est une valeur clé qui est a=12

Solution

Nous devons modifier hello(1, 2, 3, 4,a=12) en hello(1, 2, 3, 4,12) maintenant a ne recevra qu'une seule valeur positionnelle qui est 1 et b recevra la valeur 2 et le reste des valeurs recevront *args (paramètre de longueur variable)

informations supplémentaires

si nous voulons que *args obtienne 2,3,4 et que a obtienne 1 et que b obtienne 12

alors nous pouvons le faire comme ceci
def hello(a,*args,b=1): pass hello(1, 2, 3, 4,b=12)

Quelque chose en plus :

def hello(a,*c,b=1,**kwargs):
    print(b)
    print(c)
    print(a)
    print(kwargs)

hello(1,2,1,2,8,9,c=12)

sortie :

1

(2, 1, 2, 8, 9)

1

{'c': 12}

1voto

user171654 Points 26

Aussi cela peut se produire dans Django si vous utilisez jquery ajax vers une URL qui se inverse vers une fonction qui ne contient pas le paramètre 'request'

$.ajax({
  url: '{{ url_to_myfunc }}',
});

def myfunc(foo, bar):
    ...

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