我遇到了一个遗留代码库,它使用Content-Transfer-Encoding: binary
和application/octet-stream
交换作为空语句。
application/pdf
image/jpeg
由于我们希望在代码库中采用一致的样式,因此我们希望坚持使用一个通用标准。我们需要在pass
和None
之间进行选择。
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
作为空语句。
答案 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
但是,考虑代码的可读性非常重要。声明None
和pass
本质上意味着不同的东西。 pass
是placeholder,None
是data 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
并写下其他指令)。