TypeError: got multiple values for argument

前端 未结 7 2282
忘掉有多难
忘掉有多难 2020-11-28 06:13

I read the other threads that had to do with this error and it seems that my problem has an interesting distinct difference than all the posts I read so far, namely, all the

相关标签:
7条回答
  • 2020-11-28 06:19

    This also happens if you forget selfdeclaration inside class methods.

    Example:

    class Example():
        def is_overlapping(x1, x2, y1, y2):
            # Thanks to https://stackoverflow.com/a/12888920/940592
            return max(x1, y1) <= min(x2, y2)
    

    Fails calling it like self.is_overlapping(x1=2, x2=4, y1=3, y2=5) with:

    {TypeError} is_overlapping() got multiple values for argument '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)
    
    0 讨论(0)
  • 2020-11-28 06:23

    My issue was similar to Q---ten's, but in my case it was that I had forgotten to provide the self argument to a class function:

    class A:
        def fn(a, b, c=True):
            pass
    

    Should become

    class A:
        def fn(self, a, b, c=True):
            pass
    

    This faulty implementation is hard to see when calling the class method as:

    a_obj = A()
    a.fn(a_val, b_val, c=False)
    

    Which will yield a TypeError: got multiple values for argument. Hopefully, the rest of the answers here are clear enough for anyone to be able to quickly understand and fix the error. If not, hope this answer helps you!

    0 讨论(0)
  • 2020-11-28 06:24

    Simply put you can't do the following:

    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
    

    Because you pass the variable 'y' into the function twice: once as kwargs and once as function declaration.

    0 讨论(0)
  • 2020-11-28 06:24

    This exception also will be raised whenever a function has been called with the combination of keyword arguments and args, kwargs

    Example:

    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,))
    

    And it'll raise:

    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'
    

    And Also it'll become more complicated, whenever you misuse it in the inheritance. so be careful we this stuff!

    1- Calling a function with keyword arguments and 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)
    

    Exception:

    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- Calling a function with keyword arguments and kwargs which it contains keyword arguments too:

    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})
    

    Exception:

    ---------------------------------------------------------------------------
    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'
    
    0 讨论(0)
  • 2020-11-28 06:30

    This happens when a keyword argument is specified that overwrites a positional argument. For example, let's imagine a function that draws a colored box. The function selects the color to be used and delegates the drawing of the box to another function, relaying all extra arguments.

    def color_box(color, *args, **kwargs):
        painter.select_color(color)
        painter.draw_box(*args, **kwargs)
    

    Then the call

    color_box("blellow", color="green", height=20, width=30)
    

    will fail because two values are assigned to color: "blellow" as positional and "green" as keyword. (painter.draw_box is supposed to accept the height and width arguments).

    This is easy to see in the example, but of course if one mixes up the arguments at call, it may not be easy to debug:

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

    Here, color is assigned 20, then args=[30] and color is again assigned "green".

    0 讨论(0)
  • 2020-11-28 06:32

    I was brought here for a reason not explicitly mentioned in the answers so far, so to save others the trouble:

    The error also occurs if the function arguments have changed order - for the same reason as in the accepted answer: the positional arguments clash with the keyword arguments.

    In my case it was because the argument order of the Pandas set_axis function changed between 0.20 and 0.22:

    0.20: DataFrame.set_axis(axis, labels)
    0.22: DataFrame.set_axis(labels, axis=0, inplace=None)
    

    Using the commonly found examples for set_axis results in this confusing error, since when you call:

    df.set_axis(['a', 'b', 'c'], axis=1)
    

    prior to 0.22, ['a', 'b', 'c'] is assigned to axis because it's the first argument, and then the positional argument provides "multiple values".

    0 讨论(0)
提交回复
热议问题