pep8轻微的烦恼

时间:2014-01-09 12:06:51

标签: python boolean pep8

/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:'
  • 根据pep8本身
  • ,第一个建议是错误的/“更糟糕”
  • 第二个建议改变了代码的行为

如果您实际想要检查与True的平等,那么最佳做法是什么?是否使用True使用is进行身份检查?为什么pep8实用程序提供了一种在pep8本身明确不鼓励的替代方案?

4 个答案:

答案 0 :(得分:6)

如果您确实需要使用True检查相等,请使用==并忽略PEP8,但几乎任何可能的情况都不是您想要的。< / p>

如果您想知道您拥有的值是否为Python认为为真的值之一,请使用if cond:。如果您想知道您拥有的值是单身价值True然后使用is True,则布尔值TrueFalse是单身人士,因此使用{{{ 1}}在这种情况下。

如果您需要测试您的对象是否是单身is,但是linter或代码审核者抱怨True,那么is True是行为等同(但速度较慢)的替代品

检查isinstance(x, bool) and x是一个中途之家。 x == True为真时为真,对x is True的情况为假,但有些其他对象本身不是x=69但是True给出了意外真实的对象结果如x==True为真。 (感谢@Ant)。

所以把它放在一起:

1 == True

从该表中选择一行,给出您真正想要的结果(最后一行不是它)。

答案 1 :(得分:2)

无论你做什么,我认为需要评论,因为代码看起来很有趣。

如果要检查与True的相等性,那么写if n == 1可能会更清楚。阅读代码的人不太可能将其误解为试图测试逻辑真理。

当然,如果n具有用户定义的类型,那么可能定义n.__eq__以便(n == True) != (n == 1),但它会非常讨厌。所以你必须决定是否通过避免代码看起来像一个不正确的逻辑真值测试的好处来证明意义上的细微差别是合理的。

如果差异不合理,并且您绝对需要写入PEP8样式指南,则使用assertEqual或写expected_value = Trueif n == expected_value

如果代码是API的单元测试,由于某种原因特定地定义了返回文字True,那么您当然应该测试if n is True,而不是if n == True。和以前一样,需要注释或一些间接来阻止代码看错。

另一种选择是更改您正在测试的API。样式指南规则的部分原因是为了阻止人们发明或依赖专门定义返回值必须与文字True相同或相等的API,而是定义API并用术语编写代码逻辑真理。因此,如果您“修复”API,您可以“修复”测试它的代码。

答案 2 :(得分:1)

为什么需要明确测试True值?您很少需要将测试范围缩小到特定类型。我在这里重新考虑你的用例;如果您要构建的API会在带外条件下返回bool而不是int,那么请改用异常。

如果您执行必须仅测试True ,请使用

if n is True:

因为布尔值意味着像None这样的单例。请参阅Programming recommendations section

  

None等单身人士的比较应始终使用isis not,而不是等同运算符。

此外,因为issubtype(bool, int)是真的(由于历史原因; bool在Python中推出得相当晚),n == True对于n = 1也是如此,如果你只能在此接受True,然后您只能使用is True。您也可以使用isinstance(n, bool) and n,这将允许bool的子类,但我无法想象有这种类型的用途,并且在当前的实现中,bool explicitly prohibits being subclassed

关于使用不使用if cond is True:的PEP 8规则专门用于,因为它仅将cond的值限制为bool

最后但并非最不重要的是,PEP 8 starts with this

  

愚蠢的一致性是小思想的大地精

     

[...]但最重要的是:知道何时不一致 - 有时风格指南不适用。如有疑问,请使用您的最佳判断。查看其他示例并确定最佳效果。

如果符合您的需要,请仅遵循PEP 8。

答案 3 :(得分:-2)

第二条建议最符合您的需求。如果条件本身为真,则条件语句if cond:将返回true。它不会改变代码的行为,因为它只是if cond == True:的缩写。