클래스 메서드는 "TypeError: ...키워드 인수에 대한 여러 값을 받았습니다..."를 생성합니다.
키워드 인수를 사용하여 클래스 메서드를 정의하면 다음과 같습니다.
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'
무슨 일이야?
문제는 파이썬에서 클래스 메소드에 전달된 첫 번째 인수가 항상 메소드가 호출되는 클래스 인스턴스의 복사본이라는 것입니다.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
메서드가 인수와 함께 호출됩니다.(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'에 대한 참조가 할당되었음을 알 수 있습니다.문서의 이 섹션에서는 함수 인수의 작동 방식에 대해 설명합니다.
유익한 게시물 감사합니다."TypeError: foodo()가 키워드 인수 'thing'에 대한 여러 값을 얻었다"는 메시지가 나타나면 함수를 호출할 때 실수로 '자기'를 매개 변수로 전달하는 것일 수도 있습니다(아마도 클래스 선언에서 줄을 복사했기 때문입니다). 이는 급할 때 일반적인 오류입니다.
이것은 명백할 수도 있지만, 전에 그것을 본 적이 없는 사람에게 도움이 될 수도 있습니다.위치별 및 이름별로 매개변수를 잘못 할당한 경우에도 이 문제가 발생합니다.
>>> 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'
키 중 하나가 위치 인수와 유사한(문자열 이름이 같은) 키워드 인수를 전달하는 경우에도 이 오류가 발생할 수 있습니다.
>>> 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'
>>>
"fire"가 'bar' 인수에 허용되었습니다.그런데도 또 다른 '바' 주장이 Kwargs에 존재합니다.
메서드에 전달하기 전에 키워드 인수를 kwargs에서 제거해야 합니다.
기능에 '정적 메소드' 데코레이터를 추가하면 문제가 해결됩니다.
class foo(object):
@staticmethod
def foodo(thing=None, thong='not underwear'):
print thing if thing else "nothing"
print 'a thong is',thong
저는 한 가지 대답을 더 추가하고 싶습니다.
호출 함수에서 키워드 인수와 함께 잘못된 위치 순서로 위치 매개 변수를 전달하려고 할 때 발생합니다.
there is difference between parameter and argument
python의 Arguments and Parameter에 대해 자세히 읽을 수 있습니다.
def hello(a,b=1, *args):
print(a, b, *args)
hello(1, 2, 3, 4,a=12)
세 가지 매개 변수가 있기 때문입니다.
is 위치 매개 변수
b=1은 키워드 및 기본 매개 변수입니다.
*args는 가변 길이 매개 변수입니다.
그래서 우리는 먼저 위치 매개 변수를 할당합니다. 즉, 위치 순서에서 위치 인수에 값을 제공해야 합니다. 여기서 물질을 주문합니다.그러나 우리는 호출 함수의 위치에서 인수 1을 전달하고 키워드 인수로 처리하여 a에 값을 제공합니다.이제 a에는 두 가지 값이 있습니다.
하나는 위치 값: a=1
두 번째는 a=12인 키워드 값입니다.
해결책
우리는 변해야 합니다.hello(1, 2, 3, 4,a=12)
hello(1, 2, 3, 4,12)
따라서 이제 a는 1인 하나의 위치 값만 얻고 b는 2 값을 얻고 나머지 값은 *args(변수 길이 매개 변수)를 얻습니다.
추가 정보
만약 우리가 *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}
또한 jquery agax to url을 사용하여 'request' 매개 변수를 포함하지 않는 함수로 되돌리는 경우 Django에서 이 문제가 발생할 수 있습니다.
$.ajax({
url: '{{ url_to_myfunc }}',
});
def myfunc(foo, bar):
...
언급URL : https://stackoverflow.com/questions/18950054/class-method-generates-typeerror-got-multiple-values-for-keyword-argument
'your programing' 카테고리의 다른 글
열 nvarchar 길이를 드롭 없이 변경하는 방법 (0) | 2023.08.10 |
---|---|
배치 삽입 및 LAST_INSERT_슬리크와 마리아의 아이디DB (0) | 2023.08.10 |
'XXX' 유형을 로드할 수 없습니다.전역' (0) | 2023.06.11 |
NGINX를 Apache에 대한 역방향 프록시로 사용할 때 Wordpress Permalinks가 404를 반환합니다. (0) | 2023.06.11 |
PLS-00103: 다음 중 하나를 예상할 때 "파일 끝" 기호가 발생했습니다.; (0) | 2023.06.11 |