TypeError: Mehrere Werte für das Argument

139

Ich habe die anderen Threads gelesen, die mit diesem Fehler zu tun hatten, und es scheint, dass mein Problem einen interessanten Unterschied zu allen bisher gelesenen Beiträgen aufweist, nämlich, dass alle anderen bisherigen Beiträge den Fehler in Bezug auf einen der erstellten Benutzer aufweisen Klasse oder eine eingebaute Systemressource. Beim Aufrufen einer Funktion tritt dieses Problem auf. Ich kann nicht herausfinden, wofür es sein könnte. Irgendwelche Ideen?

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)

Fehlermeldung:

    Horizontol_drawbox(BOX_LENGTH, fillBox = True)
TypeError: Horizontol_drawbox() got multiple values for argument 'fillBox'
Chopper Draw Lion4
quelle
5
Was ist die Deklaration der Horizontol_drawboxFunktion? Wenn es mit beginnt fillBox, ist dies der Fehler (einmal mit Positionsargument und ein zweites Mal mit Schlüsselwortargument zugewiesen).
Cilyan

Antworten:

220

Dies geschieht, wenn ein Schlüsselwortargument angegeben wird, das ein Positionsargument überschreibt. Stellen wir uns zum Beispiel eine Funktion vor, die ein farbiges Kästchen zeichnet. Die Funktion wählt die zu verwendende Farbe aus und delegiert die Zeichnung des Felds an eine andere Funktion, wobei alle zusätzlichen Argumente weitergeleitet werden.

def color_box(color, *args, **kwargs):
    painter.select_color(color)
    painter.draw_box(*args, **kwargs)

Dann der Anruf

color_box("blellow", color="green", height=20, width=30)

schlägt fehl, weil zwei Werte zugewiesen sind color: "blellow"als Position und "green"als Schlüsselwort. ( painter.draw_boxsoll die heightund widthArgumente akzeptieren ).

Dies ist im Beispiel leicht zu erkennen, aber wenn man die Argumente beim Aufruf verwechselt, ist das Debuggen möglicherweise nicht einfach:

# misplaced height and width
color_box(20, 30, color="green")

Hier colorwird 20dann args=[30]und colorwieder vergeben "green".

Cilyan
quelle
Interessant - als ich diesen Fehler traf, ging es auch um ein colorArgument. Das Problem war etwas anders - mein model_matrixArgument wurde nur noch mit Schlüsselwörtern versehen, und einige ältere Codes hatten es als Positionsargument übergeben. Die neue API hatte erwartet colorund stattdessen eine 4x4-Matrix erhalten.
Tomasz Gandor
Hallo, ich verstehe es nicht für das zweite Beispiel. Es erfüllt auch die Bedingung : When a keyword argument is specified that overwrites a positional argument. Aber warum kann letzterer arbeiten? Was ist die Regel, wenn Python die Argumente zuweist? Danke dir.
Alston
2
@Stallman: Das zweite Beispiel, das ich gegeben habe, ist ebenfalls ein nicht funktionierendes. Farbe = 20 Konflikte mit Farbe = "Grün". Die Zuweisungsregel wird gleich danach angegeben. Weitere Informationen: docs.python.org/3/tutorial/controlflow.html#keyword-arguments Insbesondere das dritte der 4 Beispiele für "ungültige Anrufe".
Cilyan
70

Ich hatte das gleiche Problem, das wirklich einfach zu lösen ist, aber ich brauchte eine Weile, um es durchzusehen.

Ich hatte die Erklärung dorthin kopiert, wo ich sie verwendet hatte, und das Argument „Selbst“ dort belassen, aber es dauerte ewig, bis mir das klar wurde.

ich hatte

self.myFunction(self, a, b, c='123')

aber es hätte sein sollen

self.myFunction(a, b, c='123')
Q --- zehn
quelle
1
Oder ersetzen Sie zuerst selfdurch den Klassennamen. ;)
Tomasz Gandor
49

Dies passiert auch, wenn Sie die selfDeklaration innerhalb von Klassenmethoden vergessen .

Beispiel:

class Example():
    def is_overlapping(x1, x2, y1, y2):
        # Thanks to https://stackoverflow.com/a/12888920/940592
        return max(x1, y1) <= min(x2, y2)

Kann es nicht wie folgt nennen self.is_overlapping(x1=2, x2=4, y1=3, y2=5) :

{TypeError} is_overlapping () hat mehrere Werte für das Argument 'x1'.

WERKE :

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)
gies0r
quelle
Dieser Kommentar hilft mir, mein Problem zu erkennen: Ich habe vergessen, ein selfArgument in die Funktionsdeklaration einzufügen. dh was def myFunction(self, a, b, c='123')geschrieben werden sollte als def myFunction(a, b, c='123'). Und weil beine Liste und cein Skalar verwendet werden, werden bei fehlendem Selbst die Argumente durcheinander gebracht und schließlich geht die Eingabe von ban c, was den Fehler "Mehrere Argumente" verursacht. Ich mache diesen Fehler, weil ich diese interne Methode außerhalb der Klasse getestet habe und vergessen habe, sie wieder hinzuzufügen self. Ich hoffe, sie ist hilfreich für jemand anderen!
Yuqli
@yuqli Genau so komme ich auch in dieses Problem. ;) Schön zu hören, dass dieser Beitrag dir geholfen hat.
Gies0r
1
hat mir auch einige Zeit gespart :)
nexla
Funktioniert auch nach dem Dekorieren der Funktion, mit @staticmethodder ein besserer Ansatz selferzielt werden kann, wenn dies nicht unbedingt erforderlich ist.
Ayorgo
21

Mein Problem war ähnlich wie das von Q --- ten, aber in meinem Fall hatte ich vergessen, das Selbstargument für eine Klassenfunktion anzugeben:

class A:
    def fn(a, b, c=True):
        pass

Soll werden

class A:
    def fn(self, a, b, c=True):
        pass

Diese fehlerhafte Implementierung ist beim Aufrufen der Klassenmethode wie folgt schwer zu erkennen:

a_obj = A()
a.fn(a_val, b_val, c=False)

Welches ergibt a TypeError: got multiple values for argument. Hoffentlich sind die restlichen Antworten hier klar genug, damit jeder den Fehler schnell verstehen und beheben kann. Wenn nicht, hoffe diese Antwort hilft Ihnen!

Andreas Forslöw
quelle
2
Oh Mann, "Selbst" zu vergessen war auch mein Problem, was für eine irreführende Ausnahme, um geworfen zu werden
pcko1
3

Einfach ausgedrückt können Sie Folgendes nicht tun:

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

Weil Sie die Variable 'y' zweimal an die Funktion übergeben: einmal als kwargs und einmal als Funktionsdeklaration.

Quasipolynom
quelle
2

Ich wurde aus einem Grund hierher gebracht, der in den Antworten bisher nicht ausdrücklich erwähnt wurde, um anderen die Mühe zu ersparen:

Der Fehler tritt auch auf, wenn die Reihenfolge der Funktionsargumente geändert wurde - aus demselben Grund wie in der akzeptierten Antwort: Die Positionsargumente kollidieren mit den Schlüsselwortargumenten.

In meinem Fall lag es daran, dass sich die Argumentreihenfolge der Pandas- set_axisFunktion zwischen 0,20 und 0,22 geändert hat:

0.20: DataFrame.set_axis(axis, labels)
0.22: DataFrame.set_axis(labels, axis=0, inplace=None)

Die Verwendung der häufig vorkommenden Beispiele für set_axis führt zu diesem verwirrenden Fehler, da beim Aufrufen von:

df.set_axis(['a', 'b', 'c'], axis=1)

vor 0.22 ['a', 'b', 'c']wird der Achse zugewiesen, da dies das erste Argument ist und das Positionsargument dann "mehrere Werte" bereitstellt.

Heath Raftery
quelle