web-dev-qa-db-ja.com

** kwargsのキーが存在するかどうかを確認する方法?

Python 3.2.3。いくつかのアイデアがありました ここにリストされています 、これは通常のvarで動作しますが、** kwargsは異なるルールで遊ぶようです...それではなぜこの動作しないのですか** kwargsに存在しますか?

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

私もこれはうまくいくと思うが、うまくいかない-

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

Kwargsは反復可能だからだと思いますか?特定のキーが存在するかどうかを確認するために、繰り返し処理する必要がありますか?

83
Zamphatta

あなたが欲しい

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」に関連付けられた値を取得し、そのブール値を確認する」ことを意味します。そのようなキーがない場合、KeyErrorを取得します。

2番目の例if errormessage in kwargs:は、「kwargs」が「errormessage」という名前の要素を含み、「errormessage」が変数の名前でない限り、 NameErrorを取得します。

辞書には、デフォルトのパラメータを受け入れるメソッド.get()(デフォルトはNone)もあるため、kwargs.get("errormessage")はそのキーが存在しNoneの場合に値を返すことに注意してくださいそれ以外の場合(同様にkwargs.get("errormessage", 17)は、あなたが考えると思うことをします)。存在するキーと値としてNoneを持つキーと存在しないキーの違いを気にしない場合、これは便利です。

124
DSM

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

ご覧のとおり、prefixkwargsに含まれていない場合、デフォルトの''(空の文字列)はローカルprefix変数に格納されています。指定されている場合、その値が使用されています。

これは一般に、あらゆる種類の関数のラッパーを作成するためのコンパクトで読みやすいレシピです。常に理解できないパススルー引数だけで、存在するかどうかさえわかりません。常に*args**kwargsをパススルーする場合、コードの速度が遅くなり、もう少し入力する必要がありますが、呼び出される関数(この場合はprint)のインターフェースが変更されると、コードを変更する必要はありません。このアプローチは、すべてのインターフェースの変更をサポートしながら開発時間を短縮します。

18
cfi

これだけです:

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

キーが辞書にあるかどうかを確認する必要があります。その構文はsome_key in some_dictです(some_keyはハッシュ可能なもので、必ずしも文字列ではありません)。

リンクしたアイデア( これらのアイデア )には、locals()およびglobals()によって返される辞書に特定のキーが存在するかどうかを確認する例が含まれていました。 kwargs辞書(キーワード引数を含む辞書)の特定のキーの存在を確認しているため、例は似ています。

8
Tadeck

1つの方法は、自分で追加することです!どうやって? 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に予期しないキーがあるかどうかを確認します。次に、argskwargsで更新します。これにより、ユーザーが設定した新しい値が上書きされます。キーが存在するかどうかをテストする必要はありません。引数辞書としてargsを使用し、kwargsの必要はありません。

2
cdarke

これらのことは自分で簡単に発見できます。

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

hello(what="world")
1