我要问has这个问题before,但是这些问题/答案没有提到我想知道的事情。
我记得几个月前,我有一个相当大的Python脚本,我使用的是if x:
,因为它更短,我很懒。我不记得哪个版本的Python,但我记得得到DeprecationWarning
(或PendingDeprecationWarning
?)与True
的隐式比较。
现在,我正在尝试编写something 其他人可能会阅读。我到处都在使用if x == True
和if x is not None
,pep8
和pylint
正在抱怨这一点,我说我应该使用if x:
。
我个人认为if x:
的可读性差得多,但pep8
(程序)和PEP 8(文档)都不同意。
谷歌在允许我确定哪个版本(如果有的话),Python为DeprecationWarning
提供了if x:
时,谷歌并不是很有帮助,所以我想知道SO社区是否可以提供洞察力。
我应该担心这件事吗?它真的重要吗?
答案 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)
我认为你有几个独立的问题困惑。
最好检查实际样式指南的内容,并仔细检查代码实际上的行为方式,而不仅仅依赖于记住的行为: - )
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的变量或参数是否设置为其他值时。