web-dev-qa-db-fra.com

TypeError: a obtenu plusieurs valeurs pour l'argument

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'
89
chopper draw lion4

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".

157
Cilyan

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')
46
Q---ten

Cela se produit également si vous oubliez selfdeclaration 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)
33
gies0r

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!

11
Andreas Forslöw

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.

2
quasipolynomial

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".

1
Heath Raftery