弃用警告“if x:”?

时间:2016-01-12 14:29:13

标签: python pep8

我要问has这个问题before,但是这些问题/答案没有提到我想知道的事情。

我记得几个月前,我有一个相当大的Python脚本,我使用的是if x:,因为它更短,我很懒。我不记得哪个版本的Python,但我记得得到DeprecationWarning(或PendingDeprecationWarning?)与True的隐式比较。

现在,我正在尝试编写something 其他人可能会阅读。我到处都在使用if x == Trueif x is not Nonepep8pylint正在抱怨这一点,我说我应该使用if x:

我个人认为if x:的可读性差得多,但pep8(程序)和PEP 8(文档)都不同意。

谷歌在允许我确定哪个版本(如果有的话),Python为DeprecationWarning提供了if x:时,谷歌并不是很有帮助,所以我想知道SO社区是否可以提供洞察力。

我应该担心这件事吗?它真的重要吗?

3 个答案:

答案 0 :(得分:2)

关于使用什么条件的正确答案首先是语义而不是风格。除非x是布尔值,0 / False或1 / True,您的问题未指定,if x:if x == True:在语义上是不同的条件,并且通常会给出不同的结果。你应该使用正确的情况。 if x:通常是正确的选择,但并非总是如此。如果x被指定(已知)为布尔值,那么添加== True是多余的,浪费时间给作者,读者和翻译者。

在幕后,if x:表示(实现为)此if bool(x) is True的正常含义,if x == True:表示if bool(x == True) is True。由于x == True返回bool而bool(a_bool)是a_bool,后者减少为if (x == True) is True。通常,bool(x)x == True不同。

当且仅当这是正确的条件时,才应使用

if x is None:(或not None)。当测试函数的输出返回int(或字符串或...)或None时,它通常是正确的。在许多其他情况下,通常是错误的。

答案 1 :(得分:1)

这是非常好的Python,并且Python 3. +版本不会发出警告,所以如果你将来为其他人编写代码,那么使用if x:就完全没问了。顺便说一句,代表每个必须维护非常难以理解的代码的开发人员,感谢您考虑代码的可读性。

答案 2 :(得分:0)

我认为你有几个独立的问题困惑。

最好检查实际样式指南的内容,并仔细检查代码实际上的行为方式,而不仅仅依赖于记住的行为: - )

布尔表达式已经为true或false

if语句中的表达式始终被解释为boolean;无论如何,阅读Python代码的人都需要知道。

所以以下所有内容都意味着完全相同的事情,并且== True上的打桩不会提高可读性:

if x + y:
    …

if (x + y) == True:
    …

if ((x + y) == True) == True:
    …

if (((x + y) == True) == True) == True:
    …

这就是PEP 8说的原因:

  

请勿使用True将布尔值与False==进行比较。

应使用身份

比较单身人士

对象与None的比较意味着值被特别处理;它通常用作特殊处理的哨兵。它是一个单例,因此比较一个对象是否只是等于 None是不明确的。

因此,如果您的目的是测试None的值,则应通过测试其身份来测试对象是否为

if x is None:
    …

if x is not None:
    …

这就是PEP 8说的原因:

  

比较像单一的单身人士应该总是使用is或者不是,而不是相等的运算符。

None不是唯一的布尔值为

的值

布尔上下文中有许多值为false,因此仅仅if x:仅仅判断对象是否实际为None

这就是为什么PEP 8说:

  

当你真正意味着x不是无时,要小心写x,例如在测试默认为None的变量或参数是否设置为其他值时。