使用`pass`关键字标记缩进代码块结束

4 投票
3 回答
937 浏览
提问于 2025-04-18 01:35

我最近注意到,有些人会用 pass 这个关键词来标记缩进代码块的结束,比如:

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

我不太明白这样做的原因。这样做有什么好处吗?

我知道 pass 这个关键词其实什么都不做,它在其他编程语言中相当于 { }。我想问的其实是关于一种习惯。例如,也许人们喜欢用某种方式来标记一个长代码块的结束。

3 个回答

2

没有什么好处。如果一个函数有内容,添加 pass 是没有任何作用的。即使函数没有内容,使用 pass 也只是为了让解析器知道这个空的函数体是故意的。

在实际编程中,通常用文档字符串(docstring)来表示故意留空的代码,比用 pass 更好:

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

这样做有什么好处吗?

没有。

在非空的代码块末尾放一个 pass 其实就是浪费行数。记住,pass 在 Python 中是一个什么都不做的占位符;它只应该在你需要填充一个空的代码块时使用。

如果你想看看什么时候使用 pass,可以参考这个 问题 和这个 问题

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

撰写回答