141

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

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

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

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

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

4

6 に答える 6

216

あなたが欲しい

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ます。

2番目の例、は、「」で名前が付けられた要素が含まれているif errormessage in kwargs:場合、 「 」が変数の名前でない限り、を取得します。kwargserrormessageerrormessageNameError

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

于 2012-09-13T05:17:45.353 に答える
28

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)のインターフェイスが変更された場合は、コードを変更する必要はありません。このアプローチは、すべてのインターフェイスの変更をサポートしながら、開発時間を短縮します。

于 2012-09-13T09:35:11.097 に答える
15

それはこれだけです:

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

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

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

于 2012-09-13T05:19:51.143 に答える
6

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に予期しないキーがあるかどうかを確認します。次に、ユーザーが設定した新しい値を上書きする更新argsを行います。kwargsキーが存在するかどうかをテストする必要はありません。args引数ディクショナリとして使用するようになり、これ以上の必要はありませんkwargs

于 2012-09-13T07:57:33.870 に答える
2

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

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

hello(what="world")
于 2012-09-13T07:24:24.393 に答える
2
if kwarg.__len__() != 0:
    print(kwarg)
于 2019-08-16T04:45:05.547 に答える