是否有任何理由使用有利于无效的传递作为空语句

时间:2018-03-02 09:04:48

标签: python

我遇到了一个遗留代码库,它使用Content-Transfer-Encoding: binaryapplication/octet-stream交换作为空语句。

application/pdf
image/jpeg

由于我们希望在代码库中采用一致的样式,因此我们希望坚持使用一个通用标准。我们需要在passNone之间进行选择。

Python社区主要建议使用if True: pass 作为空语句。

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

但是,如果我们使用if True: None 会有副作用吗?

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

What is the difference between Pass and None in Python讨论了2之间的区别。但是,它没有提到为什么pass优于None作为空语句。

3 个答案:

答案 0 :(得分:2)

使用pass会更好。

从技术上讲,在你的例子中,没有区别。两个片段都有相同的反汇编:

(请注意,事实上,该函数绝对没有。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 value。让None本身没有做任何事只是巧合。最好编码您的意思

答案 1 :(得分:1)

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

但是,这里的性能差异很小,特别是在没有优化的早期版本中。也就是说,当Python点击pass关键字语句时,它就会跳过它。但是当它到达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

答案 2 :(得分:0)

pass明确指出您想要什么。 Python哲学:显式优于隐式。,请参阅Zen of Python

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