2012-01-31 54 views
2
str='test' 
example={'test':'value',} 
return str in example and example[str] or None 

exampleのキーstrのように見える余分なテストはなぜですか?この(冗長な)Python式の意味は何ですか?

+1

を取得しますが存在しない場合は、[STR] strの例では、他のNONE' –

+0

@JochenRitzel場合 - この私の答えには、もう一度、その点がありません。彼の例に基づいて真理テストの値をFalseにキャッチする必要があります。 – jdi

+0

@ jdi:2つの値のうちの1つを返すために 'または'が使用されると、ほとんどの場合、意図は0を防ぐのではなく、 []などが返されるのを避けるために、デフォルトのための単なる「巧妙な」1ライナーです。なぜなら、人々は、 'if'ブロック/式全体を入力する必要がある場合、キーボードが消耗することを恐れるからです。個人的に私はそれがちょっとしたアンチパターンだと思います。この場合、キーの下に格納された「偽の」値と、格納されていないキーとを区別できないという事実は、望ましい振る舞いではなく、無視されているコーナーケース(バグ)である可能性が高いと思います。 – Ben

答えて

6

この特定の例では、まず、「test」が実際にはdictの例で有効なキーであることを確認します。そうでない場合、KeyError例外が発生します。

str='test' 
example={'test':'value',} 
return example.get(str, None) or None 

を:この例は、単になかった場合などの値が[STR]試用版を偽

にそれは非常に簡単になる場合は、ロジックは、キーをチェックして、どちらかそれを返すように進行しない、またはなし更新()を取得するために余分のparamが必要とされていないため、

さらに簡単:

return example.get(str) or None 

アップデート2example[str]に関連する実際の値を生成しながら

example = { 
    'test' : 'value', 
    'test2': 0, 
    'test3': [], 
} 
test = lambda k: k in example and example[k] or None 
print test('test') 
# value 
print test('test2') 
# None 
print test('test3') 
# None 
+0

'return example.get(str、None)'を実行した方がさらに簡単になります。 – juliomalegria

+1

@ julio.alegria - 正しくありません。単純にそれを返すと、空の文字列、またはint 0、またはnull型を返すことができます。 OPsの例では、値がFalseと評価された場合はNoneを返します。 – jdi

+0

'get()'メソッドについて[もっと読む](http://docs.python.org/library/stdtypes.html#dict.get)をお勧めします。あなたが渡したキーが見つからない場合は、 'None'(' False'ではなく)またはデフォルト値(2番目のパラメータ)が返されます。だから、実際には、**同じことができればもっと簡単に 'return example.get(str)'を実行します。 – juliomalegria

3

まず、存在しないキーを検索している場合の動作が異なります(追加のテストでは、KeyErrorの例外がスローされません)。 はブール値のコンテキストではfalseになる可能性があるため、これ以上のことはありません。例えば、空の文字列であってもよい。

>>> str='test' 
>>> example={'test':[],} 
>>> str in example and example[str] or None 
>>> str in example or None 
True 

したがって、かなり冗長ではありません。 str in exampleはキーの存在をチェックしますが、and example[str]も値の正当性をチェックしています。

+0

もちろん、それが実際に正確なコードであれば、問題はコピー/ペースト操作の可能性が高いです。 – NotMe

0

str in example(コメントに基づいて)OPから真理テスト、ブール演算を破壊する、strexampleにキーであるかどうかを確認するためのブーリアンテストでありますその鍵で

2

Pythonはブーリアンを遅延評価しますので、簡単なテストでカッコを省略することができます。平易な英語で

(str in example and example[str]) or None 

を:これは、読みやすくするかもしれません

「辞書exampleはキーstrを持っており、鍵はまた、非Falseの値を持っていることを確認してくださいもしそうなら、戻ります。キーの値example[str]。そうでない場合は、None "

0

グレースフルエラーを返します。キーが存在しない場合、ルックアップ 'example [str]'は実行時に失敗します。あなたは欠陥を取得し、あなたのアプリを終了し、トレースバックを取得します。キーを最初にチェックすることで、代わりにNone値が返され、アプリケーションは気楽に進められます。

さらに一般的なアプローチは、例外をキャッチし、その結果としてNoneを返すことです。

def testfun(): 
    str='test2' 
    example={'test':'value',} 
    try: 
     return example[str] 
    except KeyError: 
     return None 
+0

これは、既存の値が評価されていないことをチェックするのと同じ保護を提供しません。 – jdi

+0

どういう意味ですか?どのような状況で出力が異なりますか? – Janne

+1

'example ['test'] == 0'の場合、0を返し、Noneを返します。 OPsの例では、値がFalseに評価されるかどうかもチェックされます。あなたはしません。 – jdi

0

キーは、それはあなたが例を返す `書くと英語と最近のPythonではKeyError exception

#!/usr/bin/python 

str='test' 
example={'test':'value',} 

if str in example and example[str]: 
    print example[str] 
else: 
    print False 
関連する問題