TypeError:获取参数的多个值

cho*_*on4 102 python python-3.x

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

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)
Run Code Online (Sandbox Code Playgroud)

错误信息:

    Horizontol_drawbox(BOX_LENGTH, fillBox = True)
TypeError: Horizontol_drawbox() got multiple values for argument 'fillBox'
Run Code Online (Sandbox Code Playgroud)

Cil*_*yan 172

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

def color_box(color, *args, **kwargs):
    painter.select_color(color)
    painter.draw_box(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

然后是电话

color_box("blellow", color="green", height=20, width=30)
Run Code Online (Sandbox Code Playgroud)

将失败,因为两个值分配给color:"blellow"作为位置和"green"关键字.(painter.draw_box应该接受heightwidth论证).

这在示例中很容易看到,但是当然如果在调用时混淆了参数,则调试可能并不容易:

# misplaced height and width
color_box(20, 30, color="green")
Run Code Online (Sandbox Code Playgroud)

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

  • @斯托曼:我举的第二个例子也是一个无效的例子。color = 20与color =“ green”冲突。分配规则在之后给出。更多信息:https://docs.python.org/3/tutorial/controlflow.html#keyword-arguments特别是4个“无效调用”示例中的第3个。 (2认同)

Q--*_*ten 51

我有同样的问题很容易制作,但我花了一段时间才能看透.

我把声明复制到我使用它的地方,并在那里留下了"自我"的论点,但我花了很多时间才意识到这一点.

我有

self.myFunction(self, a, b, c='123')
Run Code Online (Sandbox Code Playgroud)

但应该是

self.myFunction(a, b, c='123')
Run Code Online (Sandbox Code Playgroud)

  • 我的问题与此相反,在类方法中缺少“self”! (9认同)
  • 或者用类名替换第一个“self”。;) (2认同)

gie*_*s0r 36

如果您忘记了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)
Run Code Online (Sandbox Code Playgroud)

失败称之为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)
Run Code Online (Sandbox Code Playgroud)

  • 这条评论帮助我发现了我的问题:我忘记在函数声明中添加一个 `self` 参数。即应该是`def myFunction(self, a, b, c='123')`被写成`def myFunction(a, b, c='123')`。并且因为`b` 接受一个列表而`c` 接受一个标量,当缺少self 时,参数会混乱,最终`b` 的输入进入`c`,导致“多参数”错误。我犯了这个错误,因为我在类外测试了这个内部方法而忘记重新添加`self`。希望对其他人有帮助! (4认同)

And*_*löw 14

我的问题类似于Q --- ten,但在我的情况下,我忘记了为类函数提供self参数:

class A:
    def fn(a, b, c=True):
        pass
Run Code Online (Sandbox Code Playgroud)

应该成为

class A:
    def fn(self, a, b, c=True):
        pass
Run Code Online (Sandbox Code Playgroud)

调用类方法时很难看到这个错误的实现:

a_obj = A()
a.fn(a_val, b_val, c=False)
Run Code Online (Sandbox Code Playgroud)

哪个会产生一个TypeError: got multiple values for argument.希望这里的其余答案足够清楚,任何人都能够快速理解并修复错误.如果没有,希望这个答案可以帮到你!


qua*_*ial 7

简而言之,您不能执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

因为您将变量 'y' 传递到函数中两次:一次作为 kwargs,一次作为函数声明。


Hea*_*ery 7

我被带到这里的原因到目前为止在答案中没有明确提到,所以为了省去其他人的麻烦:

如果函数参数更改了顺序,也会发生错误 - 原因与接受的答案相同:位置参数与关键字参数冲突。

就我而言,这是因为 Pandasset_axis函数的参数顺序在 0.20 和 0.22 之间变化:

0.20: DataFrame.set_axis(axis, labels)
0.22: DataFrame.set_axis(labels, axis=0, inplace=None)
Run Code Online (Sandbox Code Playgroud)

使用 set_axis 的常见示例会导致此令人困惑的错误,因为当您调用:

df.set_axis(['a', 'b', 'c'], axis=1)
Run Code Online (Sandbox Code Playgroud)

在 0.22 之前,['a', 'b', 'c']被分配给 axis 因为它是第一个参数,然后位置参数提供“多个值”。


Moh*_*umi 5

此异常也将得到提升每当一个函数被调用用的组合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,))
Run Code Online (Sandbox Code Playgroud)

它会提高:

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'
Run Code Online (Sandbox Code Playgroud)

而且,每当您在继承中滥用它时,它都会变得更加复杂。所以要小心我们这些东西!

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)
Run Code Online (Sandbox Code Playgroud)

例外:

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'
Run Code Online (Sandbox Code Playgroud)

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})
Run Code Online (Sandbox Code Playgroud)

例外:

---------------------------------------------------------------------------
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'
Run Code Online (Sandbox Code Playgroud)

  • 我不明白这里的解决方案。错误已解释但未提供解决方案? (22认同)