我读了与此错误有关的其他主题,似乎我的问题与我到目前为止所读的所有帖子都有一个有趣的明显区别,即到目前为止所有其他帖子都有关于用户创建的类或内置系统资源。我在调用函数时遇到这个问题,我无法弄清楚它可能是什么。有什么想法吗?
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'
答案 0 :(得分:140)
当指定覆盖位置参数的关键字参数时,会发生这种情况。例如,让我们想象一个绘制彩色框的功能。该函数选择要使用的颜色,并将框的绘图委托给另一个函数,转发所有额外的参数。
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"
。
答案 1 :(得分:40)
我遇到了同样容易犯的问题,但是花了一段时间才看透。
我已将声明复制到我使用它的位置,并在那里留下了“自我”的论点,但我花了很多时间才意识到这一点。
我有
self.myFunction(self, a, b, c='123')
但应该是
self.myFunction(a, b, c='123')
答案 2 :(得分:27)
如果您忘记了类方法中的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()获得了参数&#39; x1&#39;
的多个值
<强> 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)
答案 3 :(得分:9)
我的问题类似于Q --- ten,但就我而言,我忘记了为类函数提供自我参数:
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
。希望这里的其余答案足够清楚,任何人都能够快速理解并修复错误。如果没有,希望这个答案可以帮到你!
答案 4 :(得分:2)
简单地说,你不能做到以下几点:
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 :(得分:1)
我被带到这里是因为到目前为止答案中没有明确提到的原因,所以为了拯救别人的麻烦:
如果函数参数已更改顺序,也会发生错误 - 原因与接受的答案中的原因相同:位置参数与关键字参数冲突。
在我的情况下,这是因为Pandas $(ProjectDir)
函数的参数顺序在0.20和0.22之间变化:
set_axis
使用常见的set_axis示例会导致这种令人困惑的错误,因为当您调用时:
0.20: DataFrame.set_axis(axis, labels)
0.22: DataFrame.set_axis(labels, axis=0, inplace=None)
在0.22之前,df.set_axis(['a', 'b', 'c'], axis=1)
被分配给轴,因为它是第一个参数,然后位置参数提供&#34;多个值&#34;。
答案 6 :(得分:1)
无论何时使用keyword arguments
和args
,kwargs
的组合调用函数,都会引发此异常
示例:
def function(a, b, c, *args, **kwargs):
print(f"a: {a}, b: {b}, c: {c}, args: {args}, kwargs: {kwargs}")
function(a=1, b=2, c=3, *(4,))
它将提高:
TypeError Traceback (most recent call last)
<ipython-input-4-1dcb84605fe5> in <module>
----> 1 function(a=1, b=2, c=3, *(4,))
TypeError: function() got multiple values for argument 'a'
而且,如果您在继承中滥用它,它将变得更加复杂。所以要小心我们这东西!
1-用keyword arguments
和args
调用函数:
class A:
def __init__(self, a, b, *args, **kwargs):
self.a = a
self.b = b
class B(A):
def __init__(self, *args, **kwargs):
a = 1
b = 2
super(B, self).__init__(a=a, b=b, *args, **kwargs)
B(3, c=2)
例外:
TypeError Traceback (most recent call last)
<ipython-input-5-17e0c66a5a95> in <module>
11 super(B, self).__init__(a=a, b=b, *args, **kwargs)
12
---> 13 B(3, c=2)
<ipython-input-5-17e0c66a5a95> in __init__(self, *args, **kwargs)
9 a = 1
10 b = 2
---> 11 super(B, self).__init__(a=a, b=b, *args, **kwargs)
12
13 B(3, c=2)
TypeError: __init__() got multiple values for argument 'a'
2-使用keyword arguments
和kwargs
调用一个函数,该函数也包含关键字参数:
class A:
def __init__(self, a, b, *args, **kwargs):
self.a = a
self.b = b
class B(A):
def __init__(self, *args, **kwargs):
a = 1
b = 2
super(B, self).__init__(a=a, b=b, *args, **kwargs)
B(**{'a': 2})
例外:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-c465f5581810> in <module>
11 super(B, self).__init__(a=a, b=b, *args, **kwargs)
12
---> 13 B(**{'a': 2})
<ipython-input-7-c465f5581810> in __init__(self, *args, **kwargs)
9 a = 1
10 b = 2
---> 11 super(B, self).__init__(a=a, b=b, *args, **kwargs)
12
13 B(**{'a': 2})
TypeError: __init__() got multiple values for keyword argument 'a'