J'ai lu les autres discussions ayant trait à cette erreur et il semble que mon problème présente une différence distincte et intéressante par rapport à tous les messages que j'ai lus jusqu'à présent, à savoir que tous les autres messages jusqu'à présent ont l'erreur en ce qui concerne l'utilisateur créé classe ou une ressource système intégrée. J'éprouve ce problème en appelant une fonction, je ne peux pas comprendre à quoi ça pourrait bien servir. Des idées?
BOX_LENGTH = 100
turtle.speed(0)
fill = 0
for i in range(8):
fill += 1
if fill % 2 == 0:
Horizontol_drawbox(BOX_LENGTH, fillBox = False)
else:
Horizontol_drawbox(BOX_LENGTH, fillBox = True)
for i in range(8):
fill += 1
if fill % 2 == 0:
Vertical_drawbox(BOX_LENGTH,fillBox = False)
else:
Vertical_drawbox(BOX_LENGTH,fillBox = True)
Message d'erreur:
Horizontol_drawbox(BOX_LENGTH, fillBox = True)
TypeError: Horizontol_drawbox() got multiple values for argument 'fillBox'
Cela se produit lorsqu'un argument de mot-clé est spécifié qui écrase un argument de position. Par exemple, imaginons une fonction qui dessine une boîte de couleur. La fonction sélectionne la couleur à utiliser et délègue le dessin de la boîte à une autre fonction, en relayant tous les arguments supplémentaires.
def color_box(color, *args, **kwargs):
Painter.select_color(color)
Painter.draw_box(*args, **kwargs)
Puis l'appel
color_box("blellow", color="green", height=20, width=30)
échouera car deux valeurs sont attribuées à color
: "blellow"
en tant que positionnel et "green"
en tant que mot clé. (Painter.draw_box
est supposé accepter les arguments height
et width
).
C'est facile à voir dans l'exemple, mais bien sûr, si on mélange les arguments à l'appel, il peut ne pas être facile de déboguer:
# misplaced height and width
color_box(20, 30, color="green")
Ici, color
est affecté à 20
, puis args=[30]
et color
est à nouveau affecté à "green"
.
J'ai eu le même problème qui est vraiment facile à faire, mais m'a pris un certain temps pour voir à travers.
J'avais copié la déclaration là où je l'utilisais et avais laissé l'argument du "moi", mais il m'a fallu un temps fou pour m'en rendre compte.
J'avais
self.myFunction(self, a, b, c='123')
mais ça aurait dû être
self.myFunction(a, b, c='123')
Cela se produit également si vous oubliez self
declaration dans les méthodes de classe.
Exemple:
class Example():
def is_overlapping(x1, x2, y1, y2):
# Thanks to https://stackoverflow.com/a/12888920/940592
return max(x1, y1) <= min(x2, y2)
échec en l'appelant comme self.is_overlapping(x1=2, x2=4, y1=3, y2=5)
avec:
{TypeError} is_overlapping () a eu plusieurs valeurs pour l'argument 'x1'
FONCTIONNE:
class Example():
def is_overlapping(self, x1, x2, y1, y2):
# Thanks to https://stackoverflow.com/a/12888920/940592
return max(x1, y1) <= min(x2, y2)
Mon problème était similaire à celui de Q --- ten, mais dans mon cas, c’était que j’avais oublié de fournir l’argument personnel à une fonction de classe:
class A:
def fn(a, b, c=True):
pass
Devraient devenir
class A:
def fn(self, a, b, c=True):
pass
Il est difficile de voir cette implémentation défectueuse lorsqu’on appelle la méthode class en tant que:
a_obj = A()
a.fn(a_val, b_val, c=False)
Ce qui donnera un TypeError: got multiple values for argument
. Espérons que le reste des réponses ici est suffisamment clair pour que quiconque puisse comprendre rapidement et corriger l'erreur. Sinon, espérons que cette réponse vous aidera!
En termes simples, vous ne pouvez pas faire ce qui suit:
class C(object):
def x(self, y, **kwargs):
# Which y to use, kwargs or declaration?
pass
c = C()
y = "Arbitrary value"
kwargs["y"] = "Arbitrary value"
c.x(y, **kwargs) # FAILS
Parce que vous passez la variable 'y' dans la fonction deux fois: une fois en tant que kwargs et une fois en tant que déclaration de fonction.
On m'a amené ici pour une raison qui n'a pas été explicitement mentionnée dans les réponses jusqu'à présent, alors pour éviter que d'autres gênent les autres:
L'erreur se produit également si les arguments de la fonction ont changé d'ordre - pour la même raison que dans la réponse acceptée: les arguments de position se heurtent avec les arguments de mot-clé.
Dans mon cas, c'est parce que l'ordre des arguments de la fonction Pandas set_axis
a changé entre 0,20 et 0,22:
0.20: DataFrame.set_axis(axis, labels)
0.22: DataFrame.set_axis(labels, axis=0, inplace=None)
L'utilisation des exemples couramment trouvés pour set_axis entraîne cette erreur déroutante, car lorsque vous appelez:
df.set_axis(['a', 'b', 'c'], axis=1)
avant 0.22, ['a', 'b', 'c']
est affecté à axis car il s'agit du premier argument, puis l'argument de position fournit des "valeurs multiples".