【问题标题】:DeprecationWarning for "if x:"?“如果 x:”的弃用警告?
【发布时间】:2016-10-22 14:03:17
【问题描述】:

我要在这里问的问题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(文档)都不同意。

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

我应该担心这个吗?真的有那么重要吗?

【问题讨论】:

  • 你试过if 1:吗? if 条件仍然成立。我更喜欢if x==True.Explicit is better than implicit
  • 在发出警告的脚本中,x 的类型是什么?可能是定义该类型的库已弃用转换为bool。
  • @BhargavRao 我知道== 和is 以及与True 和None 的比较工作,这不是我要问的。跨度>
  • 嗯,这几乎是关于品味的争论。 PEP-8 是一种风格建议,而且是一个很好的建议。但这绝不是要求,所以如果你觉得它提高了可读性,你绝对可以偏离。只要保持一致!来自import this:可读性很重要。
  • if x: 是完全标准的 Python,当x 是布尔值时,首选形式。它必须是某种产生错误的类。

标签: python pep8


【解决方案1】:

关于使用什么条件的正确答案首先是语义问题,而不是风格问题。除非 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(或 string 或 ...)或 None 时,它​​通常是正确的。在许多其他情况下,它通常是错误的。

【讨论】:

  • 我知道技术的区别;这不是我的问题。
【解决方案2】:

它是非常好的 Python,而且 Python 3.+ 版本不会发出警告,所以如果你正在编写代码供其他人使用,使用 if x: 非常好。顺便说一句,我代表每个不得不维护难以阅读的代码的开发人员,感谢您考虑代码的可读性。

【讨论】:

    【解决方案3】:

    我认为您对几个不同的问题感到困惑。

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

    布尔表达式已经是真或假

    if 语句中的表达式总是被解释为布尔值;无论如何,任何阅读 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 说:

    与 None 等单例的比较应该始终使用 is 或 not 来完成,而不是相等运算符。

    None 不是唯一的布尔值 false

    在布尔上下文中有很多值为 false 的值,因此仅使用 if x: 不足以判断对象是否实际上是 None。

    这就是为什么 PEP 8 说:

    当你真正的意思是如果 x 不是 None 时,请注意写 if x - 例如在测试默认为 None 的变量或参数是否设置为其他值时。

    【讨论】:

      猜你喜欢
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多