`pass`关键字用来标记缩进的代码块的结束。

4

我最近注意到一些人在缩进代码块结尾时使用 pass 关键字,例如:

def f():
    for i in range(10):
        do_something(i)
        pass
    pass

我不明白为什么要这样做。它有什么优势吗?

我知道 pass 关键字并没有实际作用,等同于其他语言中的 { }。我的问题更多是关于惯例的。例如,也许人们喜欢在长代码块的末尾加上一些标记。


你的代码片段中的 pass 没有任何优点。 - James Sapam
3个回答

4
你认为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


2

没有优势。如果函数有主体,添加pass不会起到任何作用。即使没有主体,这个关键字也无用,只是帮助解析器知道空主体是故意的。

在实际代码中,通常最好使用文档字符串而不是pass来表示有意为空的代码:

class MyExtraException(Exception):
    """Just another exception"""

2

有什么优点吗?

没有。

在非空代码块的末尾放置pass只是浪费行数。请记住,pass在Python中是一个无操作占位符;它只应在您需要填充空代码块时使用。

如果您想了解何时使用pass的示例,请参见此SO问题以及此问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接