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'
тяпка ничья lion4
источник
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".

Cilyan
источник
Интересно - когда я столкнулся с этой ошибкой, это тоже было связано с colorаргументом. Проблема была немного в другой - мой model_matrixаргумент стал содержать только ключевые слова, а в некотором устаревшем коде он передавался как позиционный аргумент. Новый API был ожидаемым color, а вместо него получил матрицу 4x4.
Tomasz
Привет, я не понимаю для второго примера. Он также удовлетворяет условию: When a keyword argument is specified that overwrites a positional argument. Но почему последний может работать? Какое правило, когда Python присваивает аргументы. Спасибо.
Alston
2
@Stallman: второй пример, который я привел, тоже нерабочий. color = 20 конфликтует с color = "green". Сразу после дается правило назначения. Дополнительная информация: docs.python.org/3/tutorial/controlflow.html#keyword-arguments В частности, третий из 4 примеров «недействительных вызовов».
Cilyan
70

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

Я скопировал декларацию туда, где я ее использовал, и оставил там аргумент «я», но мне потребовались годы, чтобы осознать это.

я имел

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

но это должно было быть

self.myFunction(a, b, c='123')
Q --- десять
источник
1
Или замените сначала selfна имя класса. ;)
Tomasz
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)
gies0r
источник
Этот комментарий помогает мне определить мою проблему: я забываю добавить selfаргумент внутри объявления функции. т.е. то, что должно быть def myFunction(self, a, b, c='123')написано как def myFunction(a, b, c='123'). И поскольку bпринимает список и cпринимает скаляр, при отсутствии self аргументы ошибаются, и в конечном итоге ввод bпереходит к c, вызывая ошибку «несколько аргументов». Я совершаю эту ошибку, потому что тестировал этот внутренний метод вне класса и забыл добавить его selfобратно. Надеюсь, это поможет кому-то другому!
yuqli 04
@yuqli Именно так я и попадаю в эту проблему. ;) Приятно слышать, что этот пост вам помог.
gies0r
1
сэкономили и мне довольно много времени :)
nexla
Также работает после декорирования функции, @staticmethodкоторая может быть лучшим подходом, когда selfона по сути не требуется.
ayorgo
22

Моя проблема была похожа на Q --- ten, но в моем случае это было то, что я забыл предоставить аргумент 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']присваивается оси, потому что это первый аргумент, а затем позиционный аргумент предоставляет "несколько значений".

Хит Рафтери
источник