为什么使用"比较为真/假是"操作员不好?

时间:2016-01-22 15:40:10

标签: python

PEP8声明应使用None执行is None的检查。一般来说,单身人士也是如此。但PEP8还指出,不应使用运算符执行与True和False的相等,is甚至比==更差:

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

我理解第一个是最漂亮和最pythonic的方式,但有时我发现自己处于一种情况,我想明确表明我正在与TrueFalse进行比较。在这种情况下,is如何比==更差?

2 个答案:

答案 0 :(得分: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 :(得分:3)

history ^1.17.0 → ^2.0.0-rc2 react-router ^1.0.3 → ^2.0.0-rc5 在这种情况下更“糟糕”,因为需要精确的对象。第一个建议允许最大的鸭子打字,第二个允许一些典型的truthy值,最后一个允许你进行任何鸭子打字。只有is单身人士会通过比较。

这种比较是成功的:

True

这种比较不成功:

1 == True