str='test'
example={'test':'value',}
return str in example and example[str] or None
example
のキーstr
のように見える余分なテストはなぜですか?この(冗長な)Python式の意味は何ですか?
str='test'
example={'test':'value',}
return str in example and example[str] or None
example
のキーstr
のように見える余分なテストはなぜですか?この(冗長な)Python式の意味は何ですか?
この特定の例では、まず、「test」が実際にはdictの例で有効なキーであることを確認します。そうでない場合、KeyError例外が発生します。
str='test'
example={'test':'value',}
return example.get(str, None) or None
を:この例は、単になかった場合などの値が[STR]試用版を偽
にそれは非常に簡単になる場合は、ロジックは、キーをチェックして、どちらかそれを返すように進行しない、またはなし更新()を取得するために余分のparamが必要とされていないため、
さらに簡単:
return example.get(str) or None
アップデート2:example[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
'return example.get(str、None)'を実行した方がさらに簡単になります。 – juliomalegria
@ julio.alegria - 正しくありません。単純にそれを返すと、空の文字列、またはint 0、またはnull型を返すことができます。 OPsの例では、値がFalseと評価された場合はNoneを返します。 – jdi
'get()'メソッドについて[もっと読む](http://docs.python.org/library/stdtypes.html#dict.get)をお勧めします。あなたが渡したキーが見つからない場合は、 'None'(' False'ではなく)またはデフォルト値(2番目のパラメータ)が返されます。だから、実際には、**同じことができればもっと簡単に 'return example.get(str)'を実行します。 – juliomalegria
まず、存在しないキーを検索している場合の動作が異なります(追加のテストでは、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]
も値の正当性をチェックしています。
もちろん、それが実際に正確なコードであれば、問題はコピー/ペースト操作の可能性が高いです。 – NotMe
str in example
(コメントに基づいて)OPから真理テスト、ブール演算を破壊する、str
はexample
にキーであるかどうかを確認するためのブーリアンテストでありますその鍵で
Pythonはブーリアンを遅延評価しますので、簡単なテストでカッコを省略することができます。平易な英語で
(str in example and example[str]) or None
を:これは、読みやすくするかもしれません
「辞書example
はキーstr
を持っており、鍵はまた、非Falseの値を持っていることを確認してくださいもしそうなら、戻ります。キーの値example[str]
。そうでない場合は、None
"
グレースフルエラーを返します。キーが存在しない場合、ルックアップ 'example [str]'は実行時に失敗します。あなたは欠陥を取得し、あなたのアプリを終了し、トレースバックを取得します。キーを最初にチェックすることで、代わりにNone値が返され、アプリケーションは気楽に進められます。
さらに一般的なアプローチは、例外をキャッチし、その結果としてNoneを返すことです。
def testfun():
str='test2'
example={'test':'value',}
try:
return example[str]
except KeyError:
return None
キーは、それはあなたが例を返す `書くと英語と最近のPythonではKeyError exception
#!/usr/bin/python
str='test'
example={'test':'value',}
if str in example and example[str]:
print example[str]
else:
print False
を取得しますが存在しない場合は、[STR] strの例では、他のNONE' –
@JochenRitzel場合 - この私の答えには、もう一度、その点がありません。彼の例に基づいて真理テストの値をFalseにキャッチする必要があります。 – jdi
@ jdi:2つの値のうちの1つを返すために 'または'が使用されると、ほとんどの場合、意図は0を防ぐのではなく、 []などが返されるのを避けるために、デフォルトのための単なる「巧妙な」1ライナーです。なぜなら、人々は、 'if'ブロック/式全体を入力する必要がある場合、キーボードが消耗することを恐れるからです。個人的に私はそれがちょっとしたアンチパターンだと思います。この場合、キーの下に格納された「偽の」値と、格納されていないキーとを区別できないという事実は、望ましい振る舞いではなく、無視されているコーナーケース(バグ)である可能性が高いと思います。 – Ben