Python 3.2.3. 여기에 나열된 몇 가지 아이디어가 있는데 , 이는 일반 var에서 작동하지만 ** kwargs는 다른 규칙에 따라 작동하는 것 같습니다 … 그래서 왜 이것이 작동하지 않으며 ** kwargs에 키가 있는지 어떻게 확인할 수 있습니까?
if kwargs['errormessage']:
print("It exists")
나는 또한 이것이 효과가 있다고 생각하지만 그렇지 않습니다.
if errormessage in kwargs:
print("yeah it's here")
kwargs가 반복 가능하기 때문에 추측하고 있습니까? 특정 키가 있는지 확인하기 위해 반복해야합니까?
답변
원하는
if 'errormessage' in kwargs:
print("found it")
가치를 얻으려면 errormessage
if 'errormessage' in kwargs:
print("errormessage equals " + kwargs.get("errormessage"))
이런 식으로 kwargs
는 또 다른 dict
. 첫 번째 예인 if kwargs['errormessage']
은 “kwargs에서”errormessage “키와 연관된 값을 가져온 다음 bool 값을 확인하십시오”를 의미합니다. 따라서 그러한 키가 없으면 KeyError
.
두 번째 예인 은 ” “로 명명 된 요소 if errormessage in kwargs:
가 kwargs
포함 된 errormessage
경우 ” errormessage
“가 변수의 이름이 아닌 경우 NameError
.
사전 .get()
에는 기본 매개 변수 (기본값은 None
) 를 받아들이 는 메서드도 있으므로 kwargs.get("errormessage")
해당 키가 존재하고 None
그렇지 않으면 값 을 반환합니다 (비슷하게 kwargs.get("errormessage", 17)
생각할 수있는 작업을 수행함). 기존 키와 None
값으로 갖는 키 또는 존재하지 않는 키의 차이에 대해 신경 쓰지 않을 때 유용 할 수 있습니다.
답변
DSM 및 Tadeck의 답변은 귀하의 질문에 직접 답변합니다.
내 스크립트에서 나는 종종 편리한 dict.pop()
옵션을 사용하여 추가 인수를 처리합니다. 다음은 간단한 print()
래퍼 의 예입니다 .
def my_print(*args, **kwargs):
prefix = kwargs.pop('prefix', '')
print(prefix, *args, **kwargs)
그때:
>>> my_print('eggs')
eggs
>>> my_print('eggs', prefix='spam')
spam eggs
보시다시피 prefix
가에 포함되어 있지 않으면 kwargs
기본값 ''
(빈 문자열)이 로컬 prefix
변수 에 저장됩니다 . 주어지면 그 값이 사용됩니다.
이것은 일반적으로 모든 종류의 함수에 대한 래퍼를 작성하기위한 간결하고 읽기 쉬운 방법입니다. 항상 이해하지 못하는 인수를 통과하고 인수가 존재하는지조차 알지 못합니다. 항상 통과 *args
하고 **kwargs
코드를 더 느리게 만들고 조금 더 입력해야하지만 호출 된 함수 (이 경우 print
)의 인터페이스가 변경되면 코드를 변경할 필요가 없습니다. 이 접근 방식은 모든 인터페이스 변경을 지원하면서 개발 시간을 단축합니다.
답변
바로 이것입니다 :
if 'errormessage' in kwargs:
print("yeah it's here")
키가 사전에 있는지 확인해야합니다. 그 구문은 some_key in some_dict
(여기서는 some_key
문자열이 아닌 해시 가능한 것입니다).
링크 한 아이디어 ( 이러한 아이디어 )에는 locals()
및 에서 반환 한 사전에 특정 키가 있는지 확인하는 예제가 포함 되어 globals()
있습니다. kwargs
딕셔너리 (키워드 인수를 포함하는 딕셔너리) 에서 특정 키의 존재를 확인하기 때문에 귀하의 예는 유사 합니다.
답변
한 가지 방법은 직접 추가하는 것입니다! 어떻게? kwargs
많은 기본값과 병합 합니다. 예를 들어 키가 미리 알려지지 않은 경우와 같이 모든 경우에 적절하지는 않습니다. 그러나 그렇다면 다음은 간단한 예입니다.
import sys
def myfunc(**kwargs):
args = {'country':'England','town':'London',
'currency':'Pound', 'language':'English'}
diff = set(kwargs.keys()) - set(args.keys())
if diff:
print("Invalid args:",tuple(diff),file=sys.stderr)
return
args.update(kwargs)
print(args)
기본값은 args
우리가 예상하는 모든 키를 포함 하는 사전에 설정됩니다 . 먼저 kwargs에 예상치 못한 키가 있는지 확인합니다. 그런 다음 우리는 업데이트 args
와 함께 kwargs
사용자가 설정 한 새로운 값을 덮어 쓸 것이다. 키가 존재하는지 테스트 할 필요가 없습니다. 이제 args
인수 사전으로 사용하고 더 이상 kwargs
.
답변
이러한 것들을 스스로 쉽게 발견 할 수 있습니다.
def hello(*args, **kwargs):
print kwargs
print type(kwargs)
print dir(kwargs)
hello(what="world")
답변
if kwarg.__len__() != 0:
print(kwarg)