別のチームによって作成された関数が or を返すTrue
かどうかを確認する必要がありますNone
。
平等ではなく、同一性を確認したい。
を使用すると、どのようなチェックが行われるのかわかりませんin
。次のうち、どのif result in (True, None):
ような振る舞いをしますか?
if result is True or result is None:
if result or result == None:
別のチームによって作成された関数が or を返すTrue
かどうかを確認する必要がありますNone
。
平等ではなく、同一性を確認したい。
を使用すると、どのようなチェックが行われるのかわかりませんin
。次のうち、どのif result in (True, None):
ような振る舞いをしますか?
if result is True or result is None:
if result or result == None:
いいえ、同一性検査はin
オペレーターが行うことのサブセットであるため、それらは同じではありません。
if result in (True, None):
これと同じです:
if result == True or result is True or result == None or result is None:
# notice that this is both #1 and #2 OR'd together
ドキュメントから:
list、tuple、set、frozenset、dict、または collections.deque などのコンテナー タイプの場合、式 x in y は any(x is e または x == e for e in y) と同等です。
in 演算子は等価性と同一性の両方をテストし、どちらかが true であれば を返しTrue
ます。ブール値とNone
. その限られたケースでは、in
オペレーターは他の両方のスニペットと同じように動作します。
ただし、身元確認が必要だと言いました。したがって、コードの意図とそれが何を期待しているかが明確になるように、それを明示的に使用することをお勧めします。さらに、呼び出された関数にバグがあり、それが boolean または 以外のものを返す場合、演算子None
を使用するin
とそのバグを隠すことができます。
最初の選択肢をお勧めします:
if result is True or result is None:
# do stuff
else:
# do other stuff
または、守備を感じている場合:
if result is True or result is None:
# do stuff
elif result is False:
# do other stuff
else:
# raise exception or halt and catch fire
メンバーシップ演算子 (in) ではなく、同一性演算子(is)を使用したい場合:
> 1 == True
True
> 1 is True
False
> 1 in (True, None)
True
これは@skrrgwasmeの回答を「TL;DR」で補完するものです:)