样式指南的最后一点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.
隐式转换掩盖了逻辑错误。那么为什么风格指南鼓励这个呢?
答案 0 :(得分:7)
这意味着你应该写
if greeting:
而不是:
if greeting == True:
同样,你不应该写这个:
if (greeting == True) == True:
额外测试是多余的,不会为代码添加任何值,因此应删除它们。
答案 1 :(得分:2)
恕我直言,风格指南的目的是以一种有意义的方式标准化一些常见的结构,这样你就不会得到最终做同样事情的疯狂不同的陈述。更多的,不寻常的形式可能表明程序员有一些理由以不同的方式做事,也许他试图实现与语句不同的东西。
如果您想测试一个陈述的真实性或虚假性,只需使用该陈述本身或在not
之前。如果你必须确保语句评估为True
或False
(不仅仅是一个真值/假值),你可以使用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)
)。