在/tmp/spam.py中
n = 69
if n == True:
print 'potato'pep8实用程序抱怨这个条件:
wim@SDFA100461C:/tmp$ pep8 spam.py
spam.py:3:6: E712 comparison to True should be 'if cond is True:' or 'if cond:'对于实际想要检查与True是否相等的情况,最佳实践是什么?是否使用True使用is进行身份检查?为什么pep8实用程序提供了一种在pep8本身中被明确禁止的替代方法?
发布于 2014-01-09 12:12:49
如果您确实需要与True检查等式,那么使用==并忽略PEP8,但在几乎任何可能的情况下,这都不是您想要的。
如果您想知道您所拥有的值是否为Python认为为真的值之一,请使用if cond:。如果您想知道您所拥有的值是否为单例值True,那么请使用is True,布尔值True和False都是单例,因此在这种情况下使用is是正确的。
如果您需要测试您的对象是否是单例True,但是linter或代码审阅者抱怨is True,那么isinstance(x, bool) and x是一个行为等效(但更慢)的替代品。
检查x == True是一个中途之家。当x is True为true时是正确的,对于x=69的情况则为false,但是还有其他对象本身不是True,但是x==True给出了出乎意料的真结果,比如1 == True为true。(谢谢@Ant)。
所以把它加在一起:
value of n: True 1 69 False 0
-----------------------------------------------
expression result
-----------------------------------------------
if n: True True True False False
if n is True: True False False False False
if n==True: True True False False False从该表中选择行,这将给出您真正想要的结果(最后一个不是)。
发布于 2014-01-09 12:50:36
不管你做什么,我认为需要一个注释,因为代码看起来很有趣。
如果您想使用True检查等式,那么编写if n == 1可能会更清楚。阅读代码的人不太可能将其误解为试图测试逻辑真理。
当然,如果n有一个用户定义的类型,就可以定义n.__eq__这样的(n == True) != (n == 1),但这将是相当麻烦的。因此,您必须决定,避免代码看起来像是一个不正确的逻辑真理测试,是否可以证明含义上的细微差别是正确的。
如果这种差异是不合理的,而且如果绝对需要写入PEP8样式指南,那么要么使用assertEqual,要么编写expected_value = True,if n == expected_value。
如果代码是一个API的单元测试,由于某种原因,该API明确定义了返回文字True,那么当然您应该测试if n is True,而不是if n == True。和以前一样,需要一个注释或一些间接的指示来阻止代码看起来不对。
另一种选择是更改正在测试的API。样式指南规则的部分原因是为了阻止人们发明或依赖那些明确定义返回值必须与文字True相同或相等的API,而是定义API并按照逻辑真理编写代码。因此,如果您“修复”API,您可以“修复”测试它的代码。
发布于 2014-01-09 12:14:45
为什么需要显式测试True值?如果需要的话,您很少需要将测试缩小到特定类型。我会在这里重新考虑您的用例;如果您正在构建一个API,它将返回一个bool,而不是在int中返回一个带外条件,那么请使用异常。
如果do必须测试True only,则使用
if n is True:因为布尔值应该是像None这样的单变量。见方案拟订建议一节
与
None这样的单例比较应该始终使用is或is not,而不是相等的运算符。
此外,由于issubtype(bool, int)是真的(出于历史原因,bool在Python中引入得很晚),n == True对于n = 1也是正确的,如果您只能在这里接受True,那么只能使用is True。您也可以使用isinstance(n, bool) and n,这将允许bool的子类,但我无法想象这种类型和当前实现中的明确禁止子类会有什么用处。
关于不使用if cond is True:的PEP 8规则被专门称为,因为仅将cond的值限制在bool上。
最后但并非最不重要的是,PEP 8 从这个开始
愚蠢的一致性是小心灵的霍布林 ..。但最重要的是:知道什么时候不一致--有时风格指南根本不适用。当你有疑问的时候,用你最好的判断。看看其他的例子,并决定什么看起来最好。
如果符合您的需要,只需遵循PEP 8。
https://stackoverflow.com/questions/21019797
复制相似问题