2016-11-29 65 views
1

我需要检查其他团队编写的函数是否返回TrueNone正在测试的身份不同于测试是否在一个元组中?

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

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

  1. if result is True or result is None:

  2. if result or result == None:

+0

该函数可以返回除boolean或None之外的任何内容吗? – skrrgwasme

回答

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 

docs

对于容器类型,如列表,元组,集合frozenset,字典,或collections.deque, y中的表达式x相当于任何(x是e或x == e for y)

in运算符测试等式和身份,并且其中一个为true将返回True。我得到的印象是你只使用布尔值和None。在这种有限的情况下,in运算符将与其他两个片段的行为相同。

但是,你说你想要身份检查。所以我建议你明确地使用它,这样你的代码的意图和期望是清楚的。此外,如果被调用函数中存在一个错误,并返回布尔值或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 
+3

“'如果(True,None)中的结果与其他两个代码示例的行为相同”。 - 不,它不会。它的行为不像第一个片段,因为其他的东西可以等于“真”和“无”。例如,'1.0 == True'。它不会像第二个片段那样工作,因为该片段直接将'result'作为布尔值对待,而不是将它与'=='与'True'进行比较。 – user2357112

+0

我认为明确检查身份而不是使用成员操作符会更直观。 –

+2

@ user2357112我得到的印象是,唯一可能的返回值是“True”,“False”和“None”。如果是这样的话,那么他们的表现会一样。 – skrrgwasme

0

您要使用的身份操作(是),而不是隶属运算符(in):

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

这是“TL; DR”co mplement to @skrrgwasme answer :)

+0

对不起,如果你的意思是我复制了你的原创作品,但是我发布的时间相差不多,在我发布的时候,你的回答并没有完整的版本;) –

+0

我在控制台上写了这个。无论如何看到删除评论的历史?我真的不记得任何人发布这个代码片段在线程上不超过两个答案。 –

+0

公平 - 对于指责抱歉。如果您进行小编辑,我会删除downvote。 (我不能改变我的投票,直到它被编辑。) – skrrgwasme

相关问题