2016-01-22 123 views
4

来检查None PEP8国家应该使用is None进行。一般来说,单身人士也是如此。但PEP8还指出,不应该使用操作符,is是甚至不如==进行平等真假:为什么使用“is”运算符比较True/False不好?

Yes: if greeting: 
No: if greeting == True: 
Worse: if greeting is True: 

我明白,第一个是最漂亮的,最Python的方式,但有时我发现自己的情况下,我想明确表明,我正在比较TrueFalseis在那种情况下如何比==差?

回答

4

等于运算符==可以通过类来实现的(以及所有其他的比较操作),但is不能。

可以定义一个类,使它的一些实例等于True,但它们仍然总是会失败is True比较。考虑一个bool状类,例如:

class MyBool: 
    def __init__(self, is_true): 
     self.is_true = bool(is_true) 

    def __eq__(self, other): 
     return self.is_true == bool(other) 

    def __bool__(self): 
     return self.is_true 

这个类可以确保一个实例a = MyBool(True),所有的if a:bool(a)a == True将表现正常。但是,a is True将返回False

+1

请注意'__bool__'是Python 3.X,Python 2.X等价物是'__nonzero__'。另外,如果你经历了定义'__bool__'的麻烦,那么'如果MyBool()'仍然是最pythonic真实性测试。 –

3

is是在这种情况下“雪上加霜”,因为需要确切的对象。第一个建议允许最大的鸭子打字,第二个允许一些典型的truthy值,最后一个不允许任何鸭子打字。只有True单身人士会通过比较。

这种比较是成功的:

1 == True 

这种比较是不成功的:

1 is True 
+0

但是人们会严重怀疑你的能力,如果你写的'如果COND ==真:'如果不是'如果COND:'或'如果COND ==错误:',而不是'如果不是COND:'。 – kay

+0

这是上面评论中可能重复问题中提到的最相关的事情。似乎最大的鸭子打字的原则是指导PEP8规范。 –

+0

@Kay坏习惯有深刻的根源。我发现自己也在其他语言中也这样做。我会尽量记住避免这种情况,如果我觉得有必要在将来与真/假进行明确比较,可能会重新考虑我的变量/函数名称。 –

相关问题