TypeError: отримано декілька значень для аргументу


143

Я читав інші теми, що мали відношення до цієї помилки, і, схоже, моя проблема має цікаву різницю, ніж усі публікації, які я читав до цих пір, а саме всі інші публікації поки що мають помилку стосовно створеного користувачем. клас або вбудований системний ресурс. У мене виникає ця проблема під час виклику функції, я не можу зрозуміти, що це може бути. Будь-які ідеї?

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)

Повідомлення про помилку:

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

5
Що таке оголошення Horizontol_drawboxфункції? Якщо це починається з цього fillBox, то це і є помилка (призначається один раз з позиційним аргументом, а вдруге з аргументом ключового слова).
Cilyan

Відповіді:


223

Це відбувається, коли вказано аргумент ключового слова, який замінює позиційний аргумент. Наприклад, уявимо функцію, яка малює кольорове поле. Функція вибирає колір, який буде використовуватися, і делегує малюнок поля іншій функції, передаючи всі додаткові аргументи.

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

Тоді дзвінок

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

не вдасться, оскільки присвоєно два значення color: "blellow"як позиційне, так і "green"ключове слово. ( painter.draw_boxповинен прийняти heightі widthаргументи).

Це легко помітити в прикладі, але, звичайно, якщо один змішує аргументи під час виклику, це може бути непросто:

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

Тут, colorпризначається 20, потім args=[30]і colorзнову призначається "green".


Цікаво - коли я потрапив на цю помилку, мова йшла і про colorаргумент. Проблема була дещо іншою - мій model_matrixаргумент став лише ключовим словом, а деякий застарілий код передав його як позиційний аргумент. Новий API очікував color, а натомість отримав матрицю 4x4.
Томаш Гандор

Привіт, я не розумію це для другого прикладу. Він також задовольняє умові: When a keyword argument is specified that overwrites a positional argument. Але чому останній може працювати? Яке правило, коли python призначає аргументи. Дякую.
Альстон

2
@Stallman: другий приклад, який я наводив, також є непрацюючим. color = 20 конфліктує з color = "green". Правило призначення приводиться відразу після. Більше інформації: docs.python.org/3/tutorial/controlflow.html#keyword-arguments Особливо 3-й із 4-х прикладів "недійсних дзвінків".
Кільян

70

У мене була та сама проблема, яку справді легко зробити, але мені знадобилося деякий час.

Я скопіював декларацію туди, де я її використовував, і залишив там аргумент "Я", але мені знадобилося вік, щоб усвідомити це.

я мав

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

але це мало бути

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

1
Або замініть спочатку selfім'я класу. ;)
Томаш Гандор

49

Це також відбувається, якщо ви забудете selfдекларування всередині методів класу.

Приклад:

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

Не вдається назвати це як self.is_overlapping(x1=2, x2=4, y1=3, y2=5) :

{TypeError} is_overlapping () отримав кілька значень для аргументу 'x1'

РОБОТИ :

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)

Цей коментар допомагає помітити мою проблему: я забуваю додати selfаргумент всередині декларації функції. тобто те, що слід def myFunction(self, a, b, c='123')писати як def myFunction(a, b, c='123'). А тому, що bбере список і cприймає скаляр, коли пропущений сам аргументи переплутався і, врешті-решт, вхід bпереходить до c, викликаючи помилку "декількох аргументів". Я роблю цю помилку, оскільки тестував цей внутрішній метод поза класом і забув додати selfще. Сподіваюся, корисний для когось іншого!
yuqli

@yuqli Саме так я потрапляю і в цю проблему. ;) Приємно чути, що ця публікація вам допомогла.
gies0r

1
врятувало і мене досить багато часу :)
nexla

Також працює після прикраси функції, з @staticmethodякою може бути кращим підходом, коли selfце не властиво.
айорго

21

Моя проблема була схожа на Q --- десять, але в моєму випадку, я забув надати аргумент self для функції класу:

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

Повинен стати

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

Ця несправна реалізація важко помітити при виклику методу класу як:

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

Який дасть а TypeError: got multiple values for argument. Сподіваємось, решта відповідей тут досить зрозумілі, щоб кожен міг швидко зрозуміти та виправити помилку. Якщо ні, то сподіваюся, що ця відповідь допоможе вам!


2
о людино, забувши "себе" було і моїм питанням, який оманливий виняток потрібно кинути
pcko1

3

Простіше кажучи, ви не можете робити наступне:

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

Тому що ви передаєте змінну 'y' у функцію двічі: один раз як kwargs та один раз як оголошення функції.


2

Мене привезли сюди з тієї причини, яка досі прямо не згадується у відповідях, щоб врятувати іншим неприємності:

Помилка також виникає, якщо аргументи функції змінили порядок - з тієї ж причини, що і у прийнятій відповіді: позиційні аргументи суперечать аргументам ключового слова.

У моєму випадку це було через те, що порядок аргументів set_axisфункції Pandas змінився між 0,20 та 0,22:

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

Використання загальноприйнятих прикладів для set_axis призводить до цієї заплутаної помилки, оскільки коли ви телефонуєте:

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

до 0,22, ['a', 'b', 'c']присвоюється осі, тому що це перший аргумент, а потім позиційний аргумент надає "кілька значень".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.