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)
답변
