使用`pass`关键字标记缩进代码块结束
我最近注意到,有些人会用 pass
这个关键词来标记缩进代码块的结束,比如:
def f():
for i in range(10):
do_something(i)
pass
pass
我不太明白这样做的原因。这样做有什么好处吗?
我知道 pass
这个关键词其实什么都不做,它在其他编程语言中相当于 { }
。我想问的其实是关于一种习惯。例如,也许人们喜欢用某种方式来标记一个长代码块的结束。
3 个回答
没有什么好处。如果一个函数有内容,添加 pass
是没有任何作用的。即使函数没有内容,使用 pass
也只是为了让解析器知道这个空的函数体是故意的。
在实际编程中,通常用文档字符串(docstring)来表示故意留空的代码,比用 pass
更好:
class MyExtraException(Exception):
"""Just another exception"""
你觉得Python的缩进敏感语法有害吗?
如果你的答案是“没有”,那么用pass
来标记结束只会让Python本身的缩进清晰性变得杂乱。
如果你的答案是“有”,那么用pass
来标记结束就是为了应对Python缩进语法带来的模糊性。
在Python中,没有像{}
和end
这样的符号,只有语义上的空白。
比如,看看下面这段Ruby代码:
def f for i in 0...10 i = i * 2 print(i) end end
以及对应的Python代码:
def f(): for i in range(10): i = i * 2 print(i)
如果按错一个键(比如TAB
):
def f(): for i in range(10): i = i * 2 print(i)
上面的代码也是有效的。
为了避免这种错误,我们可以在Python中用pass
来代替end
:
def f(): for i in range(10): i = i * 2 print(i) pass pass
如果按错一个键(比如TAB
):
def f(): for i in range(10): i = i * 2 print(i) pass pass
Python会拒绝执行:
IndentationError: unexpected indent
不过,即使使用pass
,Python也不总能捕捉到意外的缩进错误。
假设我们想写的是:
def g(): for i in range(10): i = i * 2 pass print(i) pass
如果按错一个键(比如TAB
):
def g(): for i in range(10): i = i * 2 pass print(i) pass
Python将不会拒绝执行。
但是使用pass
仍然有两个好处:
它提供了视觉提示。
如果你把
pass
看作是缩进块的最后一条语句,那么在上面的代码中,print(i)
看起来就很奇怪。一个好的编辑器或IDE在你输入
pass
时会正确缩进。
对于第二个pass
,如果f()
是一个顶层函数,并且你的代码遵循PEP8规范:
顶层函数和类定义之间要用两个空行隔开。
你可以省略第二个pass
。
但PEP8也说:
可以适度使用额外的空行来分隔相关函数的组。
所以我还是更喜欢用pass
。