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