TypeError: ha ottenuto più valori per argomento


143

Ho letto gli altri thread che hanno avuto a che fare con questo errore e sembra che il mio problema abbia una differenza nettamente interessante rispetto a tutti i post che ho letto finora, vale a dire, tutti gli altri post finora hanno l'errore rispetto a un utente creato classe o una risorsa di sistema integrata. Sto riscontrando questo problema quando si chiama una funzione, non riesco a capire a cosa possa servire. Qualche idea?

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)

Messaggio di errore:

    Horizontol_drawbox(BOX_LENGTH, fillBox = True)
TypeError: Horizontol_drawbox() got multiple values for argument 'fillBox'

5
Qual è la dichiarazione della Horizontol_drawboxfunzione? Se inizia con fillBox, allora questo è l'errore (assegnato una volta con argomento posizionale e una seconda volta con argomento parola chiave).
Cilyan,

Risposte:


223

Ciò accade quando viene specificato un argomento di parole chiave che sovrascrive un argomento posizionale. Ad esempio, immaginiamo una funzione che disegna una casella colorata. La funzione seleziona il colore da utilizzare e delega il disegno del riquadro a un'altra funzione, inoltrando tutti gli argomenti extra.

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

Quindi la chiamata

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

fallirà perché due valori sono assegnati a color: "blellow"come posizionale e "green"come parola chiave. ( painter.draw_boxdovrebbe accettare gli argomenti heighte width).

Questo è facile da vedere nell'esempio, ma ovviamente se si confondono gli argomenti a chiamata, potrebbe non essere facile eseguire il debug:

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

Qui, colorviene assegnato 20, quindi args=[30]e colorviene nuovamente assegnato "green".


Interessante: quando ho riscontrato questo errore, si trattava anche di una colordiscussione. Il problema era un po 'diverso: il mio model_matrixargomento è diventato solo parola chiave e alcuni codici legacy sono stati passati come argomento posizionali. La nuova API era in attesa colore ha invece ottenuto una matrice 4x4.
Tomasz Gandor,

Ciao, non capisco per il secondo esempio. Inoltre soddisfa la condizione: When a keyword argument is specified that overwrites a positional argument. Ma perché quest'ultimo può funzionare? Qual è la regola quando python assegna gli argomenti. Grazie.
Alston,

2
@Stallman: il secondo esempio che ho dato è anche non funzionante. color = 20 è in conflitto con color = "green". La regola per l'assegnazione è data subito dopo. Maggiori informazioni: docs.python.org/3/tutorial/controlflow.html#keyword-arguments In particolare il 3 ° dei 4 esempi di "chiamate non valide".
Cilyan,

70

Ho avuto lo stesso problema che è davvero facile da risolvere, ma mi ci è voluto un po 'per capire.

Avevo copiato la dichiarazione nel punto in cui la stavo usando e avevo lasciato lì l'argomento "sé", ma mi ci sono voluti anni per capirlo.

avevo

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

ma avrebbe dovuto essere

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

1
Oppure sostituisci prima selfcon il nome della classe. ;)
Tomasz Gandor,

49

Ciò accade anche se si dimentica la selfdichiarazione all'interno dei metodi di classe.

Esempio:

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

Non lo chiama come self.is_overlapping(x1=2, x2=4, y1=3, y2=5) con:

{TypeError} is_overlapping () ha ottenuto più valori per l'argomento 'x1'

LAVORI :

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)

Questo commento mi aiuta a individuare il mio problema: ho dimenticato di aggiungere un selfargomento all'interno della dichiarazione di funzione. cioè ciò che dovrebbe essere def myFunction(self, a, b, c='123')stato scritto come def myFunction(a, b, c='123'). E poiché bprende un elenco e cprende uno scalare, quando manca self gli argomenti incasinati e alla fine l'input di bva a c, causando l'errore "argomenti multipli". Faccio questo errore perché ho testato questo metodo interno al di fuori della classe e ho dimenticato di aggiungere selfnuovamente. Spero utile per qualcun altro!
yuqli

@yuqli Questo è esattamente il modo in cui entro in questo problema. ;) Bello sapere che questo post ti ha aiutato.
gies0r,

1
mi ha fatto risparmiare anche un po 'di tempo :)
nexla,

Funziona anche dopo aver decorato la funzione con @staticmethodcui può essere un approccio migliore quando selfnon è intrinsecamente richiesto.
Ayorgo,

22

Il mio problema era simile a quello di Q --- ten, ma nel mio caso era che avevo dimenticato di fornire l'argomento personale a una funzione di classe:

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

Dovrebbe diventare

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

Questa implementazione difettosa è difficile da vedere quando si chiama il metodo class come:

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

Che produrrà a TypeError: got multiple values for argument. Speriamo che il resto delle risposte qui sia abbastanza chiaro da permettere a chiunque di capire e correggere rapidamente l'errore. In caso contrario, spero che questa risposta ti aiuti!


2
oh amico, dimenticare il "sé" era anche il mio problema, che eccezione fuorviante da gettare
pcko1

3

In poche parole, non puoi fare quanto segue:

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

Perché passi la variabile 'y' nella funzione due volte: una volta come kwargs e una volta come dichiarazione di funzione.


2

Sono stato portato qui per un motivo non finora menzionato esplicitamente nelle risposte, in modo da evitare ad altri il disturbo:

L'errore si verifica anche se gli argomenti della funzione hanno cambiato ordine, per lo stesso motivo della risposta accettata: gli argomenti posizionali si scontrano con gli argomenti della parola chiave.

Nel mio caso è stato perché l'ordine degli argomenti della set_axisfunzione Panda è cambiato tra 0,20 e 0,22:

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

L'uso degli esempi comunemente trovati per set_axis provoca questo errore confuso, da quando si chiama:

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

prima di 0.22, ['a', 'b', 'c']viene assegnato ad axis perché è il primo argomento, quindi l'argomento posizionale fornisce "valori multipli".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.