TypeError : 인수에 여러 값이 있습니다


143

이 오류와 관련된 다른 스레드를 읽었으며 지금까지 읽은 모든 게시물과는 다른 흥미로운 문제가 있습니다. 즉, 다른 모든 게시물에는 사용자가 만든 것과 관련하여 오류가 있습니다. 클래스 또는 내장 시스템 리소스 함수를 호출 할 때이 문제가 발생하여 그 기능이 무엇인지 알 수 없습니다. 어떤 아이디어?

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'

5
Horizontol_drawbox함수 선언은 무엇입니까 ? 로 시작 fillBox하면 오류입니다 (위치 인수로 한 번, 키워드 인수로 두 번째로 지정됨).
Cilyan 2019

답변:


223

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

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


흥미 롭습니다. 제가이 오류에 부딪쳤을 때도 color논쟁 에 관한 것이 었습니다 . 문제는 약간 달랐습니다. 내 model_matrix주장은 키워드 전용이되었고 일부 레거시 코드는 위치 인수로 전달되었습니다. 새로운 API는을 기대하고 있었고 color대신 4x4 행렬을 얻었습니다.
Tomasz Gandor 17 :

안녕하세요, 나는 두 번째 예를 얻지 못했습니다. 또한 다음 조건을 충족합니다 When a keyword argument is specified that overwrites a positional argument.. 그러나 왜 후자가 작동 할 수 있습니까? 파이썬이 인수를 할당 할 때의 규칙은 무엇입니까? 감사합니다.
Alston

2
@ Stallman : 내가 준 두 번째 예는 작동하지 않는 예입니다. color = 20은 color = "green"과 충돌합니다. 할당 규칙은 바로 다음에 제공됩니다. 추가 정보 : docs.python.org/3/tutorial/controlflow.html#keyword-arguments 특히 4 개의 "유효하지 않은 호출"예제 중 3 번째입니다.
Cilyan

70

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

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

나는했다

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

그러나 그것은

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

1
또는 먼저 self클래스 이름으로 바꾸십시오. ;)
Tomasz Gandor

49

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)

이 의견은 내 문제를 발견하는 데 도움이됩니다 self. 함수 선언 안에 인수 를 추가하는 것을 잊었습니다 . 즉, 무엇 def myFunction(self, a, b, c='123')으로 쓰여 져야 하는가 def myFunction(a, b, c='123'). 그리고 b리스트를 c취하고 스칼라를 취하기 때문에 , 자기가 없으면 인수가 엉망이되고 결국 입력이 b로 이동 c하여 "다중 인수"오류가 발생합니다. 클래스 외부 에서이 내부 메소드를 테스트했기 때문에이 실수를하고 self다시 추가하는 것을 잊어 버렸 습니다. 다른 사람에게 도움이되기를 바랍니다.
yuqli 2019

@ yuqli 이것은 내가이 문제에 어떻게 들어가는 지 정확하게입니다. ;)이 게시물이 도움이되었다 니 다행입니다.
gies0r

1
시간도 많이 절약했습니다 :)
nexla

또한 본질적으로 필요하지 않은 @staticmethod경우 더 나은 접근 방식이 될 수있는 기능을 장식 한 후에도 작동 self합니다.
ayorgo

21

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


2
오, "자기"를 잊어 버린 것도 내 문제였으며, 오해의 소지가있는 예외가 발생했다
pcko1

3

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

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


2

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.