协慌网

登录 贡献 社区

不是无测试在 Python

这些不是 “无” 测试。

if val != None:

if not (val is None):

if val is not None:

哪一个更可取,为什么?

答案

if val is not None:
    # ...

是用于测试变量未设置为None的 Pythonic 习惯用法。在用默认参数声明关键字函数的情况下,该惯用法有特殊用途。 is Python 中的测试身份。因为在运行的 Python 脚本 / 程序中None is是最佳测试。正如Johnsyweb 指出的那样,这在PEP 8 中的“编程建议” 中进行了讨论。

至于为什么这是首选

if not (val is None):
    # ...

这只是Python Zen 的一部分:“可读性很重要”。好的 Python 通常接近好的伪代码

来自 PEP 8编程建议:

与单例(如 None)的比较应该始终使用isis not ,永远不要使用相等运算符进行。

另外,当您真正要表达if x is not None时,要当心写if x ,例如,在测试是否将默认为 None 的变量或参数设置为其他值时。另一个值可能具有在布尔上下文中可能为 false 的类型(例如容器)!

对于任何 Python 程序员来说,PEP 8 都是必不可少的书籍。

这些类型问题的最佳选择是确切地了解 python 的功能。dis模块提供了令人难以置信的信息:

>>> import dis
>>> dis.dis("val != None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               3 (!=)
              6 RETURN_VALUE
>>> dis.dis("not (val is None)")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("val is not None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE

请注意,最后两种情况归结为相同的操作顺序,Python 读取not (val is None)并使用is not运算符None比较时,第一个使用!=运算符

正如其他答案所指出的那样,在与None !=是一个坏主意。