méthode de la classe génère “TypeError: ... a plusieurs valeurs pour le mot-clé de l'argumentation ...”
Si je définir une méthode de classe avec un argument mot-clé ainsi:
class foo(object):
def foodo(thing=None, thong='not underwear'):
print thing if thing else "nothing"
print 'a thong is',thong
l'appel de la méthode génère un TypeError
:
myfoo = foo()
myfoo.foodo(thing="something")
...
TypeError: foodo() got multiple values for keyword argument 'thing'
Ce qu'il se passe?
- Vous n'obtiendrez jamais de réponse satisfaisante quant à pourquoi explicite
self
est mieux que implicitesthis
.
Vous devez vous connecter pour publier un commentaire.
Le problème est que le premier argument passé à des méthodes de la classe en python est toujours une copie de l'instance de classe sur lequel la méthode est appelée, généralement étiquetés
self
. Si la classe est déclarée ainsi:il se comporte comme prévu.
Explication:
Sans
self
comme premier paramètre, lorsquemyfoo.foodo(thing="something")
est exécuté, lefoodo
méthode est appelée avec des arguments(myfoo, thing="something")
. L'instancemyfoo
est alors attribué àthing
(depuisthing
est le premier paramètre déclaré), mais python tente également d'attribuer"something"
àthing
, donc l'Exception.À démontrer, l'essayer avec le code d'origine:
Vous aurez de sortie comme:
Vous pouvez voir que la "chose" a été attribué une référence à l'instance "myfoo' de la classe 'foo'. Cette section de la documentation explique comment les arguments de la fonction de travail un peu plus.
Merci pour l'instructif postes. Je voudrais juste garder une note que si vous avez de la "TypeError: foodo() a obtenu plusieurs valeurs pour argument mot-clé 'chose'", il se peut également que vous êtes en tort, en passant le " soi " comme étant un paramètre lors de l'appel de la fonction (probablement parce que vous avez copié la ligne de la déclaration de classe - c'est une erreur courante lorsque l'on est pressé).
@classmethod
, le solution avoir à utilisersuper().function(...)
au lieu de<parentclass>.function(cls, ...)
.Cela peut être évident, mais il pourrait aider quelqu'un qui n'a jamais vu avant. C'est également le cas pour des fonctions classiques si par erreur vous assigner un paramètre de position et de manière explicite par leur nom.
juste ajouter "staticmethod' décorateur la fonction et le problème est résolu
myfoo.foodo(thing="something")
, chose="quelque chose" sera attribué au premier argument, plutôt que de la soi implicite argument.self
Je veux ajouter une réponse de plus :
there is difference between parameter and argument
vous pouvez lire en détail ici Les Arguments et les paramètres en pythondepuis, nous avons trois paramètres :
est un paramètre de position
b=1 est le mot clé et le paramètre par défaut
*args est de longueur variable paramètre
nous avons donc d'abord attribuer un comme paramètre de position , signifie que nous avons à offrir de la valeur de position argument dans sa position de commande, ici de l'ordre de la matière.
mais nous sommes en train de l'argument 1 à la place de l'un à l'appel de la fonction, puis nous sommes également à donner de la valeur à un , le traiter comme argument mot-clé.
maintenant avoir deux valeurs :
l'un est en position de valeur: a=1
deuxième est disponible, la valeur qui est a=12
Solution
Nous devons changer
hello(1, 2, 3, 4,a=12)
àhello(1, 2, 3, 4,12)
alors maintenant, il va recevoir une seule position de la valeur à 1 et b recevra la valeur 2 et le reste des valeurs obtiendrez *args (paramètres de longueur variable)
des informations supplémentaires
si nous voulons que *args devriez obtenir 2,3,4 et devrait obtenir 1 et b doivent obtenir 12
alors on peut faire comme ceci
def hello(a,*args,b=1):
pass
hello(1, 2, 3, 4,b=12)
Quelque chose de plus :
de sortie :
Cette erreur peut également se produire si vous passez d'un mot-clé argument pour lequel l'une des clés est similaire (ayant le même nom de chaîne) à une position d'argument.
"feu" a été accepté dans le " bar " argument. Et pourtant, il y a un autre 'bar' argument présent dans kwargs.
Vous devez supprimer le mot-clé argument de la kwargs avant de passer à la méthode.
Aussi ce qui peut arriver dans Django si vous utilisez jquery ajax à l'url qui s'inverse pour une fonction qui ne contient pas de 'demande', paramètre