class 메소드는 "TypeError :… 키워드 인수에 대해 여러 값을 얻었습니다…"


129

키워드 인수로 클래스 메소드를 정의하면 다음과 같습니다.

class foo(object):
  def foodo(thing=None, thong='not underwear'):
    print thing if thing else "nothing" 
    print 'a thong is',thong

메소드를 호출하면 TypeError:

myfoo = foo()
myfoo.foodo(thing="something")

...
TypeError: foodo() got multiple values for keyword argument 'thing'

무슨 일이야?


1
왜 명시 self적이 암시 적보다 나은지에 대한 만족스러운 답변을 얻지 못할 것 this입니다.
nurettin

답변:


163

문제는 파이썬에서 클래스 메소드에 전달 된 첫 번째 인수는 항상 메소드가 호출되는 클래스 인스턴스의 사본이며 항상 레이블이 붙어 있다는 것 self입니다. 클래스가 이렇게 선언되면 :

class foo(object):
  def foodo(self, thing=None, thong='not underwear'):
    print thing if thing else "nothing" 
    print 'a thong is',thong

예상대로 동작합니다.

설명:

self첫 번째 매개 변수가 없으면 myfoo.foodo(thing="something")실행될 때 foodo메소드가 arguments로 호출됩니다 (myfoo, thing="something"). 인스턴스는 myfoo다음에 할당 thing(이후 thing처음 선언 된 매개 변수가)뿐만 아니라, 파이썬 시도는 할당 "something"thing따라서 예외.

시연하려면 원래 코드로 이것을 실행하십시오.

myfoo.foodo("something")
print
print myfoo

다음과 같이 출력됩니다 :

<__main__.foo object at 0x321c290>
a thong is something

<__main__.foo object at 0x321c290>

'thing'에 'foo'클래스의 'myfoo'인스턴스에 대한 참조가 할당되었음을 알 수 있습니다. 문서 섹션에서는 함수 인수가 어떻게 작동하는지 설명합니다.


1
참고 : 함수 def에 self가 첫 번째 매개 변수로 포함 된 경우 동일한 유형의 오류가 발생할 수 있으며 실수로 self를 첫 번째 매개 변수로 사용하여 실수로 함수를 호출 할 수 있습니다.
Christopher Hunter

48

유익한 게시물에 감사드립니다. "TypeError : foodo () 키워드 인수 'thing'"에 대해 여러 값을 얻는 경우 매개 변수로 'self'를 실수로 전달했을 수도 있습니다. 함수 호출 (아마도 클래스 선언에서 행을 복사했기 때문에-서두르면 일반적인 오류입니다).


7
이 답변에 추가해 주셔서 감사합니다. 이것은 가장 일반적인 실수 일 수 있습니다. 그래서 당신은 내지지를 얻습니다.
rdrey

동일한는 과부하시 발생하는 @classmethod상기 용액은 사용되는 super().function(...)대신 <parentclass>.function(cls, ...).
ederag

30

이것은 명백 할 수도 있지만, 전에 본 적이없는 사람에게 도움이 될 수 있습니다. 위치와 이름으로 매개 변수를 실수로 잘못 지정한 경우에도 일반 기능에 대해서도 발생합니다.

>>> def foodo(thing=None, thong='not underwear'):
...     print thing if thing else "nothing"
...     print 'a thong is',thong
...
>>> foodo('something', thing='everything')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foodo() got multiple values for keyword argument 'thing'

6

'정적 방법'데코레이터를 기능에 추가하면 문제가 해결됩니다.

class foo(object):
    @staticmethod
    def foodo(thing=None, thong='not underwear'):
        print thing if thing else "nothing" 
        print 'a thong is',thong

방금이 오류가 발생 하여이 솔루션으로 문제가 해결되었습니다. 그러나이 데코레이터가 어떻게 또는 왜 문제를 해결했는지에 대해 자세히 설명 할 수 있습니까?
Ray

1
staticmethod는 첫 번째 인수로 self를받는 메소드를 중지합니다. 이제을 호출 myfoo.foodo(thing="something")하면 암시 적 자체 인수가 아닌 첫 번째 인수에 thing = "something"이 할당됩니다.
danio

또한 함수 내에서 클래스 변수에 액세스 할 수 없음을 의미합니다. 일반적으로 다음을 통해 액세스합니다.self
drevicko

4

하나 이상의 답변을 추가하고 싶습니다.

함수 호출에서 키워드 인수와 함께 잘못된 위치 순서로 위치 매개 변수를 전달하려고 할 때 발생합니다.

there is difference between parameter and argument파이썬에서 인수 및 매개 변수에 대해 자세히 읽을 수 있습니다

def hello(a,b=1, *args):
   print(a, b, *args)


hello(1, 2, 3, 4,a=12)

우리는 세 가지 매개 변수가 있기 때문에 :

a는 위치 매개 변수입니다

b = 1은 키워드 및 기본 매개 변수입니다.

* args는 가변 길이 매개 변수입니다.

먼저 우리는 위치 매개 변수로 위치 매개 변수를 할당합니다. 즉, 순서 순서대로 위치 인수에 값을 제공해야 함을 의미합니다. 그러나 호출 함수 대신 인수 1을 전달하고 키워드 인수로 취급하여 값을 제공합니다. 이제 두 가지 값이 있습니다.

하나는 위치 값입니다. a = 1

초는 키워드 값으로 a = 12입니다.

해결책

우리는 변경할 필요 hello(1, 2, 3, 4,a=12)hello(1, 2, 3, 4,12) 현재는 1이고, b는 2 값을 얻을 * 인수 (가변 길이 매개 변수)를 얻을 것이다 값의 나머지 하나의 위치 값을 얻을 수 있도록

추가 정보

* args가 2,3,4를 얻고 a가 1을, b가 12를 얻으려면

우리는 이렇게 할 수 있습니다
def hello(a,*args,b=1): pass hello(1, 2, 3, 4,b=12)

뭔가 더 :

def hello(a,*c,b=1,**kwargs):
    print(b)
    print(c)
    print(a)
    print(kwargs)

hello(1,2,1,2,8,9,c=12)

출력 :

1

(2, 1, 2, 8, 9)

1

{'c': 12}

그것은 이미 답변 stackoverflow.com/a/31822875/12663에 의해 덮여 있습니다 -귀하의 예제에는 위치와 이름으로 명시 적으로 지정된 동일한 매개 변수 (a)가 있습니다.
danio

3

이 오류는 키 중 하나가 동일한 문자열 이름을 갖는 키워드 인수를 위치 인수와 전달하는 경우에도 발생할 수 있습니다.

>>> class Foo():
...     def bar(self, bar, **kwargs):
...             print(bar)
... 
>>> kwgs = {"bar":"Barred", "jokes":"Another key word argument"}
>>> myfoo = Foo()
>>> myfoo.bar("fire", **kwgs)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bar() got multiple values for argument 'bar'
>>> 

"화재"는 '막대기'논쟁에서 받아 들여졌다. 그러나 kwargs에는 또 다른 'bar'논쟁이 있습니다.

메소드에 전달하기 전에 kwargs에서 키워드 인수를 제거해야합니다.


1

jquery ajax를 사용하여 URL을 '요청'매개 변수가 포함되지 않은 함수로 되 돌리는 경우 장고에서 발생할 수 있습니다.

$.ajax({
  url: '{{ url_to_myfunc }}',
});


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