如何使用“pass”语句?

新手上路,请多包涵

我正在学习 Python 的过程中,我已经到达了有关 pass 语句的部分。我使用的指南将其定义为通常用作占位符的空语句。

我仍然不完全理解这意味着什么。将使用 pass 语句的简单/基本情况是什么?为什么需要它?

原文由 Capurnicus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 299
2 个回答

假设您正在设计一个新类,其中包含一些您不想实现的方法。

 class MyClass(object):
    def meth_a(self):
        pass

    def meth_b(self):
        print "I'm meth_b"

如果您要省略 pass ,代码将不会运行。

然后你会得到一个:

 IndentationError: expected an indented block

总而言之, pass 语句没有做任何特别的事情,但它可以充当占位符,如此处所示。

原文由 sebastian_oe 发布,翻译遵循 CC BY-SA 4.0 许可协议

Python has the syntactical requirement that code blocks (after if , except , def , class etc.) cannot be empty.然而,空代码块在各种不同的上下文中都很有用,例如下面的示例,这是我见过的最常见的用例。

因此,如果代码块中不应该发生任何事情,则需要 pass 才能使这样的块不产生 IndentationError 。或者,可以使用任何语句(仅包括要评估的术语,如 Ellipsis 文字 ... 或字符串,通常是文档字符串),但 pass 清楚地表明实际上什么都不应该发生,并且不需要实际评估和(至少暂时)存储在内存中。

  • 忽略(全部或)某种类型的 Exception (示例来自 xml ):
    try:
       self.version = "Expat %d.%d.%d" % expat.version_info
   except AttributeError:
       pass # unknown

注意: 忽略所有类型的加注,如以下来自 pandas 的示例,通常被认为是不好的做法,因为它还会捕获可能应该传递给调用者的异常,例如 KeyboardInterruptSystemExit (甚至 HardwareIsOnFireError – 你怎么知道你没有在定义了特定错误的自定义框上运行,某些调用应用程序想知道这些错误?)。

    try:
       os.unlink(filename_larry)
   except:
       pass

而至少使用 except Error: 或者在这种情况下最好使用 except OSError: 被认为是更好的做法。快速分析我安装的所有 Python 模块后,我发现超过 10% 的 except ...: pass 语句捕获所有异常,因此它仍然是 Python 编程中的常见模式。

  • 派生一个不添加新行为的异常类(例如,在 SciPy 中):
    class CompileError(Exception):
       pass

类似地,用作抽象基类的类通常有一个显式的空 __init__ 或子类应该派生的其他方法(例如, pebl ):

    class _BaseSubmittingController(_BaseController):
       def submit(self, tasks): pass
       def retrieve(self, deferred_results): pass

  • 测试代码在一些测试值下是否正常运行,而不关心结果(来自 mpmath ):
    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                            norm=lambda x: norm(x, inf)):
       pass

  • 在类或函数定义中,文档字符串通常已经存在,作为块中唯一要执行的 _强制性语句_。在这种情况下,该块可能包含 pass 除了 文档字符串之外,以便说“这确实打算什么都不做。”,例如 pebl
    class ParsingError(Exception):
       """Error encountered while parsing an ill-formed datafile."""
       pass

  • 在某些情况下, pass 用作占位符,表示“此方法/类/if-block/… 尚未实现,但这将是实现它的地方”,尽管我个人更喜欢 Ellipsis 文字 ... 以便严格区分这和前面示例中的故意“无操作”。 ( 请注意,省略号文字仅在 Python 3 中是有效表达式

例如,如果我粗略地写一个模型,我可能会写

   def update_agent(agent):
       ...

其他人可能有的地方

   def update_agent(agent):
       pass

   def time_step(agents):
       for agent in agents:
           update_agent(agent)

提醒您稍后填写 update_agent 函数,但已经运行一些测试以查看其余代码是否按预期运行。 (这种情况的第三个选项是 raise NotImplementedError 。这在两种情况下特别有用:要么 “这个抽象方法应该由每个子类实现,并且没有通用的方法来定义它基类” ,或 “这个函数,这个名字,还没有在这个版本中实现,但它的签名看起来像这样”

原文由 Anaphory 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏