为什么不是True == True:

时间:2012-04-19 06:07:43

标签: python

样式指南的最后一点http://www.python.org/dev/peps/pep-0008

读取......

不要使用==。

将布尔值与True或False进行比较

为什么?

编辑 只是为了清楚说明我在问什么(并且它表明了问题本身),当你写作时

if something:
    print "something is true"

你正在隐式转换为布尔值,根据真实的含义,它可能有效,也可能无效。恕我直言,这种形式的编程是不鼓励的,因为它可能导致副作用。

numberOfApples = -1
if numberOfApples:
    print "you have apples" # is not what is intended.

if numberOfApples == True:
    print "you have apples" # is also not what is intended.

iHaveApples = numberOfApples > 0
if iHaveApples is True:    # Edit:  corrected this.. the "is" is better than the ==
  print  "you have apples" # is correct.

隐式转换掩盖了逻辑错误。那么为什么风格指南鼓励这个呢?

4 个答案:

答案 0 :(得分:7)

这意味着你应该写

if greeting:

而不是:

if greeting == True:

同样,你不应该写这个:

if (greeting == True) == True:

额外测试是多余的,不会为代码添加任何值,因此应删除它们。

答案 1 :(得分:2)

恕我直言,风格指南的目的是以一种有意义的方式标准化一些常见的结构,这样你就不会得到最终做同样事情的疯狂不同的陈述。更多的,不寻常的形式可能表明程序员有一些理由以不同的方式做事,也许他试图实现与语句不同的东西。

如果您想测试一个陈述的真实性或虚假性,只需使用该陈述本身或在not之前。如果你必须确保语句评估为TrueFalse(不仅仅是一个真值/假值),你可以使用statement is True - 尽管样式指南不鼓励它 - 或者可能检查它的类型(使用isinstance)。但这通常是糟糕的设计,你应该避免这种情况,除非你有充分的理由这样做。

使用statement == True是危险的,原因有很多:1)仅与True一起使用,与其他“真实”值失败(如[1]); 2)如果语句返回的值重新定义__eq__,则可能会产生意外结果; 3)如果参数的顺序发生变化等,可能会产生不同的结果。请注意,如果值实现__nonzero____len__,仅使用该语句也可能为truehood / falsehood返回不同的值,但是经常使用,这通常不是问题。

一些例子显示了如果你偏离风格,事情会变得混乱:

if True: print True # True
if 1: print True    # True
if [1]: print True  # True

True is True # True
1 is True    # False
[1] is True  # False

True == True # True
1 == True    # True
[1] == True  # False

编辑:更多:

if 1: print True # True
if 2: print True # True

1 == True # True
2 == True # False

1 is True # False
2 is True # False

更新,正如@Marcin指出的那样,您可以使用bool将值强制转换为True / False,保证只有这些值才会当下。该函数的结果与值的默认truehood / falsehood一致(因此__nonzero____len__被考虑在内)。一些例子:

if bool(1): print True # True
bool(1) == True        # True
bool(1) is True        # True

if bool(2): print True # True
bool(2) == True        # True
bool(2) is True        # True

1 or 2              # 1
1 and 2             # 2
bool(1) or bool(2)  # True
bool(1) and bool(2) # True

bool(1) == bool(2)  # True
bool(1) is bool(2)  # True

答案 2 :(得分:1)

因为它是多余的。

if hasChildren:

相同
if hasChildren == True:

但更简洁,更容易阅读。

答案 3 :(得分:0)

排序:

# A, Good:
if numberOfApples > 0:
    print "you have apples"

# B, Also good:
iHaveApples = numberOfApples > 0
if iHaveApples:
  print  "you have apples"

# C, Bad:
iHaveApples = numberOfApples > 0
if iHaveApples == True:
  print  "you have apples"

为什么你会选择C超过A或B?

更新

我认为你在某些角落的情况下会出汗,但如果你的项目中的角落情况很重要,请使用适当的比较。一般来说,我们对iHaveApples的类型有所了解,例如我们知道它是使用>进行比较的结果。我相信,在您的代码中使用该信息是合理的,也是一种良好的做法。如果你问,“如果我认为它是一个bool,结果是一个int或其他东西。”我会说你的代码中有一个错误,你应该找到它,修复它,并写一个测试,以防再次犯同样的错误。不要依赖python在运行时找到你的错误。

我会断言,并留下你来证明你是否愿意,if iHaveApples:行为完全相同,但运行速度更快,if iHaveApples is True:当你确定iHaveApples时是一个布尔。最后,我将举例说明is何时会导致不良行为,至少在我看来是这样。

>>> import numpy
>>> totalApples = numpy.sum([1, 2, 3]) == 6
>>> totalApples
True
>>> totalApples is True
False

如果你愿意,我会告诉你为什么不起作用(提示,请检查type(totalApples))。