"if x:" 的弃用警告?

DeprecationWarning for "if x:"?

我要在这里问的问题has been asked before,但是那些questions/answers没有提到我想知道的。

我记得几个月前,我有一个相当大的 Python 脚本,我正在使用 if x: 因为它更短而且我很懒。我不记得 Python 的哪个版本,但我确实记得 DeprecationWarning(或 PendingDeprecationWarning?)关于与 True.

的隐式比较

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

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

Google 对让我确定哪个版本没有太大帮助,如果有的话,Python 为 if x: 给出了 DeprecationWarning,所以我想知道是否也许 SO 社区可以提供见解。

我应该为此担心吗?真的有那么重要吗?

非常好Python,并且Python 3.+ 版本不会给出警告,所以如果您正在为其他人编写代码以供将来使用,请使用if x: 完全没问题。顺便说一下,我代表所有不得不维护可怕的不可读代码的开发人员,感谢您考虑代码的可读性。

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

在幕后,if x: 表示(实现为)此表达式的正常含义中的 if bool(x) is True,而 if x == True: 表示 if bool(x == True) is True。由于 x == True return a bool 和 bool(a_bool) 是 a_bool,后者减少到 if (x == True) is True。一般来说,bool(x)x == True是不一样的。

if x is None:(或not None)当且仅当这是适当的条件时才应该使用。在测试函数 return 的输出时,它通常是正确的,无论是 int(或字符串或...)或 None。在许多其他情况下,通常是错误的。

我认为您混淆了几个不同的问题。

最好查看样式指南 actually 所说的内容,并仔细检查您的代码 actually 的行为方式,而不是仅依赖于记住的行为:-)

布尔表达式已经为真或假

if 语句中的表达式总是 解释为布尔值;任何阅读 Python 代码的人都需要知道这一点。

所以下面的意思完全一样,堆砌== True并不能提高可读性:

if x + y:
    …

if (x + y) == True:
    …

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

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

这就是为什么 PEP 8 说:

Don't compare boolean values to True or False using == .

应使用身份比较单身人士

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

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

if x is None:
    …

if x is not None:
    …

这就是为什么 PEP 8 说:

Comparisons to singletons like None should always be done with is or is not , never the equality operators.

None 不是唯一的布尔值 false

在布尔上下文中有很多值是假的,所以仅仅 if x: 不足以判断一个对象是否实际上是 None.

这就是为什么 PEP 8 说:

beware of writing if x when you really mean if x is not None -- e.g. when testing whether a variable or argument that defaults to None was set to some other value.