【问题标题】:Is there any reason using pass in favourable over None as empty statement是否有任何理由使用 pass 优于 None 作为空语句
【发布时间】:2018-08-10 11:22:11
【问题描述】:

我遇到了一个遗留代码库,它使用 passNone 交换作为空语句。

if True:
    pass

if True:
    None

由于我们更喜欢在我们的代码库上拥有一致的风格,因此我们希望坚持一个共同的标准。我们需要在passNone 之间进行选择。

Python 社区大多推荐使用pass 作为空语句。

https://stackoverflow.com/a/15081801/1051441

但是,如果我们使用None,会有什么副作用吗?

是否有任何理由使用pass 优于None 作为空语句?

What is the difference between Pass and None in Python 谈到了 2 之间的区别。但是,它没有提到为什么 passNone 更可取作为空语句。

【问题讨论】:

  • pass 为此目的而明确存在。 None 存在于不同的目的。使用pass
  • None 是一个创建并立即丢弃 None 值的语句。 pass 只是一个 NOOP。
  • @deceze 好吧,None 实际上是一个单例,所以,没有创建/删除。它只是将一个常量加载到堆栈中。
  • @juanpa 很公平,但同样的区别。 :)

标签: python


【解决方案1】:

使用pass 更好。

从技术上讲,在您的示例中,没有区别。两个 sn-ps 具有相同的反汇编:

(请注意,该函数实际上什么都不做。LOAD CONST None 用于隐式返回语句,返回None。)

>>> def f():
...     if True:
...         pass
...
>>> def g():
...     if True:
...         None
...
>>> dis.dis(f)
  3           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE
>>> dis.dis(g)
  3           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE

但是,考虑代码的可读性很重要。声明Nonepass 本质上意味着不同的东西。 passplaceholderNonedata valueNone 本身没有任何作用,这只是一个巧合。最好按你的意思编写代码

【讨论】:

  • 这不是我说的吗?
  • 感谢您的解释,不胜感激!
【解决方案2】:

正如其他答案所述,代码的含义没有区别。此外,最新版本的 CPython 可以消除此类示例的死代码,并且 OP 示例中的字节码完全相同。

但是,性能差异很小,尤其是在没有优化的早期版本中。也就是说,当 Python 遇到 pass 关键字 statement 时,它会跳过它。但是当它遇到None 表达式 时,它会加载该值,然后丢弃它,并隐含引用计数的递增和递减。因此,后者应该稍微慢一些。

例子:

$ python -m timeit -r 10 -n 10000000 -s 'def f(): None' 'f()' 
10000000 loops, best of 10: 0.209 usec per loop
$ python -m timeit -r 10 -n 10000000 -s 'def f(): pass' 'f()' 
10000000 loops, best of 10: 0.178 usec per loop

【讨论】:

  • 感谢您的解释和计时统计,谢谢!
  • @shuwnyuantee 很高兴能提供帮助。应该注意的是,分析统计信息高度依赖于版本、设备和平台。
【解决方案3】:

pass 明确说明您想要什么。 Python 哲学:显式优于隐式。,见Zen of Python

如果您在pass 之后编写了一些代码,但在None 之后没有,某些 IDE 会警告您,因此您需要进行额外检查。我不知道为什么python代码没有警告如此明显的用户错误(我认为用户不会使用pass并编写其他指令)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2016-01-27
    • 2013-01-29
    • 1970-01-01
    相关资源
    最近更新 更多