programing

TypeError: 인수 값을 여러 개 가져왔습니다.

goodcopy 2022. 10. 27. 22:19
반응형

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'

이것은 positional 인수를 덮어쓰는 키워드 인수가 지정된 경우에 발생합니다.예를 들어, 색칠된 상자를 그리는 함수를 상상해 보겠습니다.함수는 사용할 색상을 선택하고 상자의 도면을 다른 함수로 위임하여 모든 추가 인수를 릴레이합니다.

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

그 후 콜

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

에 2개의 값이 할당되어 있기 때문에 실패합니다.color:"blellow"위치 및"green"키워드로 지정합니다.(painter.draw_box를 받아들이기로 되어 있다.height그리고.width인수)를 참조해 주세요).

이 예에서는 쉽게 알 수 있지만, 물론 콜 시 인수를 혼재시키면 디버깅이 쉽지 않을 수 있습니다.

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

여기서,color할당되어 있다20,그리고나서args=[30]그리고.color다시 할당됩니다."green".

나는 정말 쉽게 만들 수 있는 같은 문제를 가지고 있었지만, 그것을 꿰뚫어보는 데 시간이 좀 걸렸다.

나는 선언문을 내가 사용하던 곳에 복사했고 '자기' 주장을 그곳에 남겼지만, 그것을 깨닫는 데 오랜 시간이 걸렸다.

나는 가지고 있었다

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

그랬어야 했는데

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

이 또한 당신이 잊었을 때 일어난다.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)

이 예외는 함수가 다음 명령어 조합과 함께 호출될 때마다 발생합니다.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'

저는 지금까지의 답변에서 명확하게 언급되지 않은 이유로 이곳에 오게 되었습니다. 다른 사람들에게 폐를 끼치지 않기 위해서입니다.

이 오류는 함수 인수의 순서가 변경된 경우에도 발생합니다.이것은, 받아들여진 응답과 같은 이유로, positional 인수가 키워드 인수와 충돌합니다.

때문이다.set_axis0.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']는 첫 번째 인수이기 때문에 축에 할당되며, 다음으로 positional 인수에 의해 "최소값"이 지정됩니다.

간단히 말하면, 다음의 조작은 할 수 없습니다.

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로, 한 번은 함수 선언으로 전달합니다.

언급URL : https://stackoverflow.com/questions/21764770/typeerror-got-multiple-values-for-argument

반응형