** kwargs의 키가 있는지 확인하는 방법?


111

Python 3.2.3. 여기에 나열된 몇 가지 아이디어가 있는데 , 이는 일반 var에서 작동하지만 ** kwargs는 다른 규칙에 따라 작동하는 것 같습니다 ... 그래서 왜 이것이 작동하지 않으며 ** kwargs에 키가 있는지 어떻게 확인할 수 있습니까?

if kwargs['errormessage']:
    print("It exists")

나는 또한 이것이 효과가 있다고 생각하지만 그렇지 않습니다.

if errormessage in kwargs:
    print("yeah it's here")

kwargs가 반복 가능하기 때문에 추측하고 있습니까? 특정 키가 있는지 확인하기 위해 반복해야합니까?


4
특별한 규칙은 없습니다. 따옴표를 잊어 버렸습니다.
Lennart Regebro 2012 년

답변:


164

원하는

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값으로 갖는 키 또는 존재하지 않는 키의 차이에 대해 신경 쓰지 않을 때 유용 할 수 있습니다.


추가 설명에 감사드립니다! 파이썬 초보자가 배경 정보와 가능한 것과 불가능한 것에 대한 추가 예제를 얻는 데 항상 좋습니다. 그 정신으로 : kwargs.get("errormessage", 17)그 값을 반환하거나 17errormessage가 존재하지 않는 경우-하지만 확실하지 않습니다. 그 맞습니까?
Honeybear

아, 그렇습니다. 여기 에서 찾았습니다 . 고마워요 ... 확실히하고 싶었어요.
Honeybear

21

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)의 인터페이스가 변경되면 코드를 변경할 필요가 없습니다. 이 접근 방식은 모든 인터페이스 변경을 지원하면서 개발 시간을 단축합니다.


에 기본값을 할당하는 방법을 보여 주셔서 감사합니다 prefix.
HBat 2017

11

바로 이것입니다 :

if 'errormessage' in kwargs:
    print("yeah it's here")

키가 사전에 있는지 확인해야합니다. 그 구문은 some_key in some_dict(여기서는 some_key문자열이 아닌 해시 가능한 것입니다).

링크 한 아이디어 ( 이러한 아이디어 )에는 locals()및 에서 반환 한 사전에 특정 키가 있는지 확인하는 예제가 포함 되어 globals()있습니다. kwargs딕셔너리 (키워드 인수를 포함하는 딕셔너리) 에서 특정 키의 존재를 확인하기 때문에 귀하의 예는 유사 합니다.


3

한 가지 방법은 직접 추가하는 것입니다! 어떻게? 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.


1

이러한 것들을 스스로 쉽게 발견 할 수 있습니다.

def hello(*args, **kwargs):
    print kwargs
    print type(kwargs)
    print dir(kwargs)

hello(what="world")

13
"쉬움"을 제거하면 더 나은 대답이됩니다. 모두에게 쉬웠다면이 사이트는 필요하지 않을 것입니다. in프로그래밍 한 적이 없거나 Python을 처음 사용하는 경우 연산자 자체를 찾는 것은 쉽지 않습니다. dict.get()dict.setdefault()도움말 에서만 암시됩니다 .
cfi

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