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


111

Python 3.2.3。ここリストされているいくつかのアイデアは、通常の変数で機能しますが、** kwargsはさまざまなルールで動作しているようです...では、なぜこの機能が機能せず、** kwargsのキーが存在するかどうかを確認するにはどうすればよいですか?

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

これもうまくいくと思いますが、うまくいきません-

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

kwargsは反復可能であるため、私は推測していますか?特定のキーが存在するかどうかを確認するためだけに反復する必要がありますか?


4
特別なルールはありません。あなただけの引用符を忘れていました。
Lennart Regebro 2012

回答:


163

あなたが欲しい

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:kwargserrormessage"で指定された要素が含まれている場合、" errormessage"が変数の名前でない限り、を取得しNameErrorます。

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


詳しい説明ありがとうございます!Pythonの初心者が背景情報を入手し、何が可能で何が不可能であるかについてのさらなる例を得るには、常に良いものです。その精神で:私は、kwargs.get("errormessage", 17)その値を返す可能性があるか、または17errormessageが存在しない場合-私は確信していません。あれは正しいですか?
Honeybear 2018

ああそうです。ここで見つけ。ありがとう...確認したかっただけです。
Honeybear 2018

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

11

それはこれだけです:

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

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

リンクしたアイデアこれらのアイデア)には、locals()およびによって返された辞書に特定のキーが存在するかどうかを確認するための例が含まれていましたglobals()kwargsディクショナリ(キーワード引数を含むディクショナリ)内の特定のキーの存在をチェックしているので、あなたの例も同様です。


3

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


1

あなたはそれらを自分で簡単に見つけることができます:

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

hello(what="world")

13
「簡単」を削除すると、より良い答えになります。誰にとっても簡単だったら、このサイトは必要ないでしょう。inプログラムを実行したことがない場合やPythonを初めて使用する場合は、それ自体で演算子を見つけるのは簡単ではありません。それはdict.get()dict.setdefault()ヘルプでほのめかされているだけです。
cfi 2012

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.