测试身份与测试是否在元组中不同吗?

Is testing identity different than testing whether in a tuple?

我需要检查是否由另一个团队编写的函数 returns TrueNone.

我想检查身份,而不是平等。

我不清楚使用 in 时会发生什么类型的检查。 if result in (True, None): 的行为类似于以下哪项?

  1. if result is True or result is None:

  2. 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

来自docs

For container types such as list, tuple, set, frozenset, dict, or collections.deque, the expression x in y is equivalent to any(x is e or x == e for e in y)

in 运算符同时测试相等性和同一性,任何一个为真都将 return True。我的印象是您只使用布尔值和 None。在这种有限的情况下,in 运算符的行为将与您的其他两个片段相同。

但是,您说要进行身份验证。所以我建议你明确地使用它,这样你的代码的意图和它的期望就很清楚了。此外,如果被调用函数中存在错误,并且它 return 不是布尔值或 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

您想使用 身份运算符 (is) 而不是成员资格运算符 (in):

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

这是对@skrrgwasme 回答的"TL;DR" 补充:)