1

別のチームによって作成された関数が or を返すTrueかどうかを確認する必要がありますNone

平等ではなく、同一性を確認したい。

を使用すると、どのようなチェックが行われるのかわかりませんin。次のうち、どのif result in (True, None):ような振る舞いをしますか?

  1. if result is True or result is None:

  2. if result or result == None:

4

2 に答える 2

3

いいえ、同一性検査は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
于 2016-11-29T00:49:31.323 に答える
0

メンバーシップ演算子 (in) ではなく、同一性演算子(is)を使用したい場合:

> 1 == True
True
> 1 is True
False
> 1 in (True, None)
True

これは@skrrgwasmeの回答を「TL;DR」で補完するものです:)

于 2016-11-29T00:58:18.277 に答える