【问题标题】:`pass` keyword to mark end of indented code block`pass` 关键字标记缩进代码块的结束
【发布时间】:2014-05-18 16:30:42
【问题描述】:

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

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

我不明白为什么。有什么优势吗?

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

【问题讨论】:

  • 你的 sn-p 中的 pass 没有任何 adv。

标签: python coding-style


【解决方案1】:

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

如果您的回答是“否”, 然后使用pass 来标记结束只会使 cleanness 变得混乱 由 Python 的缩进敏感语法引入。

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

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

例如,考虑以下 Ruby 代码:

定义 对于我在 0...10 我 = 我 * 2 打印(一) 结尾 结尾

以及等效的 Python 代码:

定义 f(): 对于范围内的 i (10): 我 = 我 * 2 打印(一)

一键错误 (TAB):

定义 f(): 对于范围内的 i (10): 我 = 我 * 2 打印(一)

上面的代码也是有效的。

为避免此类错误,我们可以在 Python 中将pass 用于end

定义 f(): 对于范围内的 i (10): 我 = 我 * 2 打印(一) 经过 经过

一键错误 (TAB):

定义 f(): 对于范围内的 i (10): 我 = 我 * 2 打印(一) 经过 经过

Python 将拒绝工作:

IndentationError:意外缩进

然而,即使使用pass,python 也不会总是捕捉到意外的缩进。

假设我们打算写:

定义 g(): 对于范围内的 i (10): 我 = 我 * 2 经过 打印(一) 经过

一键错误 (TAB):

定义 g(): 对于范围内的 i (10): 我 = 我 * 2 经过 打印(一) 经过

Python不会拒绝工作。

但是使用pass还是有两个好处:

  • 它仍然提供视觉提示。

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

  • 如果您键入 pass,一个不错的编辑器/IDE 将正确缩进。

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

用两个空行包围顶级函数和类定义。

您可以省略第二个pass

但是PEP8也说:

可以使用额外的空行(谨慎) 将相关功能组分开。

所以我更喜欢pass

【讨论】:

    【解决方案2】:

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

    在实际代码中,使用文档字符串通常比使用pass 表示故意空代码更好:

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

    【讨论】:

      【解决方案3】:

      有什么优势吗?

      没有。

      像这样将pass 放在非空代码块的末尾只会浪费行。请记住,pass 在 Python 中是一个无所事事的占位符;只有当你需要填写一个空的代码块时才应该使用它。

      如果您想了解何时使用pass 的一些示例,请参阅此SO question 以及此one

      【讨论】:

        猜你喜欢
        • 2019-06-15
        • 1970-01-01
        • 2015-04-20
        • 2019-04-30
        • 1970-01-01
        • 1970-01-01
        • 2021-04-23
        • 2017-10-31
        • 1970-01-01
        相关资源
        最近更新 更多