"if x:" 的弃用警告?
DeprecationWarning for "if x:"?
我要在这里问的问题has been asked before,但是那些questions/answers没有提到我想知道的。
我记得几个月前,我有一个相当大的 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(文档)都不同意。
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.
我要在这里问的问题has been asked before,但是那些questions/answers没有提到我想知道的。
我记得几个月前,我有一个相当大的 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(文档)都不同意。
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
orFalse
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.