質問

この質問にはすでに答えがあります:

これらのうち、テストはありません。

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 オペレーター)。最初はを使用します != なしと比較する場合のオペレーター。

他の答えが指摘したように、使用しています != 何もない場合は悪い考えです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top