python-3.x TypeError:参数有多个值

lhcgjxsq  于 2023-01-10  发布在  Python
关注(0)|答案(7)|浏览(316)

我读了其他与这个错误有关的线程,似乎我的问题与我目前读到的所有帖子有一个有趣的明显区别,即,目前为止所有其他帖子都有关于用户创建的类或内置系统资源的错误。我在调用函数时遇到了这个问题,我不知道它可能是什么。有什么想法吗?

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'
x8goxv8g

x8goxv8g1#

当一个关键字参数覆盖了一个位置参数时,就会发生这种情况。例如,让我们想象一个绘制彩色方框的函数。该函数选择要使用的颜色,并将方框的绘制委托给另一个函数,传递所有额外的参数。

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应该接受heightwidth参数)。
这在示例中很容易看到,但当然,如果在调用时混淆了参数,则可能不容易调试:

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

这里,color被分配为20,然后args=[30]color再次被分配为"green"

ccgok5k5

ccgok5k52#

我也有同样的问题,这真的很容易,但我花了一段时间才看穿。
我已经将声明复制到了使用它的地方,并将self参数留在了那里,但我花了很长时间才意识到这一点。
我有

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

但应该是

self.my_method(a, b, c='123')
inn6fuwd

inn6fuwd3#

如果您忘记了类方法中的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)
pnwntuvh

pnwntuvh4#

只要使用keyword argumentsargskwargs的组合调用函数,也会引发此异常

    • 示例:**
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 argumentsargs调用函数:

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 argumentskwargs的函数,该函数也包含关键字参数:

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'
fafcakar

fafcakar5#

简单地说,你不能做以下事情:

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,一次作为函数声明。

7d7tgy0s

7d7tgy0s6#

我被带到这里来的原因到目前为止在答案中没有明确提到,所以为了保存别人的麻烦:
如果函数参数更改了顺序,也会发生错误-原因与可接受的答案相同:位置参数与关键字参数冲突。
在我的例子中,这是因为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']被赋值给axis,因为它是第一个参数,然后位置参数提供“多个值”。

yzuktlbb

yzuktlbb7#

我得到了与使用@classmethod相同的错误。
如果有人在类中使用@classmethod时遇到此错误,请不要忘记将cls参数传递到方法中:

class X:
  @classmethod
  def my_method(x):
    pass

上述代码将引发原因“TypeError:参数””错误,获得多个值,您应按如下方式传递cls

class X:
  @classmethod
  def my_method(cls, x):
    pass

相关问题