2012-09-13 11 views
55

Python 3.2.3。通常のvarで動作するいくつかのアイデアlisted hereがありましたが、** kwargsは異なるルールで動作するようです...なぜ、この動作しないのですか?** kwargsのキーが存在するかどうかを確認するにはどうすればよいですか?** kwargsのキーが存在するかどうかを確認するには?

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

また、私は、これは動作するはずだと思うが、それはしていません -

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

kwargsからは反復可能であるので、私は推測していますか?特定のキーがあるかどうかを調べるために繰り返し処理する必要がありますか?

+2

特別なルールはありません。引用符を忘れただけです。 –

答えて

86

あなたは

if 'errormessage' in kwargs: 
    print("found it") 

kwargsはちょうど別のdictで、このようにerrormessage

if 'errormessage' in kwargs: 
    print("errormessage equals " + kwargs.get("errormessage")) 

の値を取得したいです。あなたの最初の例であるif kwargs['errormessage']は、 "kwargsのキー" errormessage "に関連付けられた値を取得し、そのbool値を確認する"という意味です。したがって、そのような鍵がない場合、KeyErrorが得られます。

あなたの第二の例、if errormessage in kwargs:errormessagekwargsがで指定された要素が含まれている場合は、」」、およびない限り、 『errormessage』は変数の名前で、あなたがNameErrorを得ることができますを意味します。

を、私はそれを言及する必要があります辞書には、デフォルトのパラメータ(デフォルトではNone)を受け入れるメソッド.get()があります。kwargs.get("errormessage")は、そのキーが存在する場合は値を返し、それ以外の場合はNoneを返します(同様にkwargs.get("errormessage", 17)と思われるかもしれません)。存在するキーと、値がNoneのキーとの違い、またはキーではないxisting、これは便利です。

8

それはちょうど、このです:

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

キーが辞書にある場合は、チェックする必要があります。その構文はsome_key in some_dictです(some_keyはハッシュ可能なものであり、必ずしも文字列である必要はありません)。

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

1

自分で簡単にそれらのものを発見することができます。

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

hello(what="world") 
+3

"簡単"を削除してから、より良い答えです。誰もが簡単だったら、このサイトは必要ありません。 'in '演算子を見つけることは、決してプログラミングしたことがない、そして/またはPythonを初めて使う人にとっては簡単ではありません。これは 'dict.get()'と 'dict.setdefault()'のヘルプでのみ示唆されています。 – cfi

2

一つの方法は、それを自分で追加することです!どうやって? 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を必要としません。

11

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

関連する問題