Подтвердить что ты не робот

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

Я прочитал другие темы, связанные с этой ошибкой, и кажется, что моя проблема имеет интересное отличие от всех сообщений, которые я читал до сих пор, а именно, все остальные сообщения до сих пор имеют ошибку в отношении пользовательский класс или встроенный системный ресурс. Я сталкиваюсь с этой проблемой при вызове функции, я не могу понять, для чего она может быть. Любые идеи?

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'
4b9b3361

Ответ 1

Это происходит, когда указан аргумент ключевого слова, который перезаписывает позиционный аргумент. Например, представьте себе функцию, которая рисует цветную рамку. Функция выбирает цвет, который будет использоваться, и делегирует чертеж окна другой функции, передавая все дополнительные аргументы.

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

Ответ 2

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

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

У меня был

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

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

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

Ответ 3

Это также происходит, если вы забудете объявление 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'

WORKS

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)

Ответ 4

Проще говоря, вы не можете сделать следующее:

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 и один раз в качестве объявления функции.

Ответ 5

Меня привезли сюда по причине, явно не упомянутой в ответах до сих пор, поэтому, чтобы спасти других, проблема:

Ошибка также возникает, если аргументы функции изменили порядок - по той же причине, что и в принятом ответе: позиционные аргументы конфликтуют с аргументами ключевого слова.

В моем случае это произошло потому, что порядок аргументов функции Pandas set_axis изменился между 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'] назначается оси, потому что это первый аргумент, а затем позиционный аргумент предоставляет "несколько значений".