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」に関連付けられた値を取得し、そのブール値を確認する」ことを意味します。そのようなキーがない場合、KeyError
を取得します。
2番目の例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
辞書(キーワード引数を含む辞書)の特定のキーの存在を確認しているため、例は似ています。
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
の必要はありません。
これらのことは自分で簡単に発見できます。
def hello(*args, **kwargs):
print kwargs
print type(kwargs)
print dir(kwargs)
hello(what="world")