关于python:`pass`关键字来标记缩进代码块的结尾

`pass` keyword to mark end of indented code block

我最近注意到,有些人用pass关键字标记缩进代码块的结尾,例如:

1
2
3
4
5
def f():
    for i in range(10):
        do_something(i)
        pass
    pass

我不明白为什么。有什么好处吗?

我知道pass关键字什么也不做,它在其他语言中等同于{ }。我的问题与惯例更为相关。例如,也许人们喜欢用一些东西来标记一个长代码块的结尾。


你认为python对缩进敏感的语法有害吗?

如果您的回答是"否",然后用pass标记一个端点,只会使清洁变得杂乱无章。由python的缩进敏感语法引入。

如果您的回答是"是",然后使用pass标记一个结束,这是一个解决歧义的方法。由python的缩进敏感语法引入。

在python中,没有{}end,而是语义空白。

例如,考虑以下Ruby代码:

1
2
3
4
5
6
def f
    for i in 0...10
        i = i * 2
        print(i)
    end
end

以及等效的python代码:

1
2
3
4
def f():
    for i in range(10):
        i = i * 2
        print(i)

一次击错键(TAB):

1
2
3
4
def f():
    for i in range(10):
        i = i * 2
    print(i)

上述代码同样有效。

为了避免这种错误,我们可以在python中对end使用pass

1
2
3
4
5
6
def f():
    for i in range(10):
        i = i * 2
        print(i)
        pass
    pass

一次击错键(TAB):

1
2
3
4
5
6
def f():
    for i in range(10):
        i = i * 2
    print(i)
        pass
    pass

Python将拒绝工作:

1
IndentationError: unexpected indent

但是,即使使用pass,python也不会总是捕获意外的缩进。

假设我们打算写:

1
2
3
4
5
6
def g():
    for i in range(10):
        i = i * 2
        pass
    print(i)
    pass

一次击错键(TAB):

1
2
3
4
5
6
def g():
    for i in range(10):
        i = i * 2
        pass
        print(i)
    pass

Python不会拒绝工作。

但是使用pass仍然有两个优点:

  • 它仍然提供视觉提示。

    如果您认为pass是缩进块的最后一个子句,在上面的代码中,print(i)看起来很奇怪。

  • 如果键入pass,一个合适的编辑器/ide将正确缩进。

对于第二个pass,如果f()是一个顶级函数,您的代码遵循PEP8:

Surround top-level function and class definitions with two blank lines.

您可以省略第二个pass

但佩普8也表示:

Extra blank lines may be used (sparingly)
to separate groups of related functions.

因此我更喜欢pass


没有优势。如果函数有一个主体,那么添加pass什么都不做。如果没有主体,它甚至不做任何事情,只是帮助解析器知道空主体是有意的。

在实际代码中,使用docstring比使用pass表示故意空的代码要好:

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


Is there any advantages?

不。

把EDOCX1[0]放在非空代码块的末尾,这样只会浪费行。记住,pass是Python中的一个不做任何事情的占位符;它只应在需要填充空代码块时使用。

如果您想要一些何时使用pass的示例,请参阅这个问题和这个问题。