質問
この質問にはすでに答えがあります:
これらのうち、テストはありません。
if val != None:
if not (val is None):
if val is not None:
どちらが望ましいのか、そしてなぜですか?
解決
if val is not None:
# ...
変数がに設定されていないことをテストするためのPythonicイディオムは None
. 。このイディオムには、次の場合に特別な用途があります デフォルトのパラメーターを使用してキーワード関数を宣言します. is
PythonでIDをテストします。 1つのインスタンスが1つしかないからです None
実行中のPythonスクリプト/プログラムに存在する、 is
これは最適なテストです。として Johnsywebは指摘します, 、これはで議論されています PEP 8 「プログラミングの推奨」の下。
なぜこれが好まれるのか
if not (val is None):
# ...
これは単にその一部です Pythonの禅: :「読みやすさが重要です。」良いPythonはしばしば良いものに近いです 擬似コード.
他のヒント
プログラミングの推奨事項から、 PEP 8:
「is」または「is not」で常に行われるべきであるようなシングルトンとの比較は、平等オペレーターではありません。
また、「Xが非存在ではない場合」を本当に意味するときに「X」と書くことに注意してください。他の値には、ブールのコンテキストで偽である可能性のあるタイプ(コンテナなど)がある場合があります。
PEP 8は、Pythonプログラマーにとって不可欠な読み取りです。
後者の2つのいずれかのいずれかです val
潜在的に定義するタイプの可能性があります __eq__()
渡されたときにtrueを返す None
.
これらのタイプの質問で最善の策は、Pythonが何をするかを正確に確認することです。 dis
モジュールは非常に有益です:
>>> def f(val):
... if val != None:
... return True
... return False
...
>>> def g(val):
... if not (val is None):
... return True
... return False
...
>>> def h(val):
... if val is not None:
... return True
... return False
...
>>> import dis
>>> dis.dis(f)
2 0 LOAD_FAST 0 (val)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 3 (!=)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_GLOBAL 1 (True)
15 RETURN_VALUE
4 >> 16 LOAD_GLOBAL 2 (False)
19 RETURN_VALUE
>>> dis.dis(g)
2 0 LOAD_FAST 0 (val)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_GLOBAL 1 (True)
15 RETURN_VALUE
4 >> 16 LOAD_GLOBAL 2 (False)
19 RETURN_VALUE
>>> dis.dis(h)
2 0 LOAD_FAST 0 (val)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_GLOBAL 1 (True)
15 RETURN_VALUE
4 >> 16 LOAD_GLOBAL 2 (False)
19 RETURN_VALUE
最後の2つのケースが同じ操作のシーケンスに減少することに注意してください(Python読み取り not (val is None)
を使用します is not
オペレーター)。最初はを使用します !=
なしと比較する場合のオペレーター。
他の答えが指摘したように、使用しています !=
何もない場合は悪い考えです