[python] 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'



답변

위치 인수를 겹쳐 쓰는 키워드 인수가 지정된 경우에 발생합니다. 예를 들어, 컬러 박스를 그리는 함수를 상상해 봅시다. 이 함수는 사용할 색상을 선택하고 상자 그림을 다른 함수에 위임하여 모든 추가 인수를 릴레이합니다.

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".


답변

나는 실제로 만들기 쉬운 문제가 있었지만 잠시 동안 시간을 ​​보냈다.

나는 그 선언을 내가 사용한 곳으로 복사하고 거기에 ‘자기’논리를 남겼지 만 그것을 깨닫는 데 오랜 시간이 걸렸다.

나는했다

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)


답변

내 문제는 Q–10과 비슷하지만 내 경우에는 클래스 함수에 자기 주장을 제공하는 것을 잊어 버렸습니다.

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. 다행스럽게도 여기의 나머지 답변은 누구나 오류를 빠르게 이해하고 수정할 수있을 정도로 명확합니다. 그렇지 않다면이 답변이 도움이되기를 바랍니다.


답변

간단히 다음을 수행 할 수 없습니다.

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


답변

나는 지금까지 답변에 명시 적으로 언급되지 않은 이유로 여기에 데려 와서 다른 사람들의 문제를 해결했습니다.

함수 인수가 순서를 변경 한 경우에도 오류가 발생합니다. 허용 된 답변과 같은 이유로 위치 인수가 키워드 인수와 충돌합니다.

필자의 경우 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']에는 첫 번째 인수이므로 축에 할당 된 다음 위치 인수는 “다중 값”을 제공합니다.


답변