pass 语句

你为什么要告诉解释器明确无所作为?Python 具有语法要求,即代码块(在 ifexceptdefclass 等之后)不能为空。

但有时空代码块本身就很有用。一个空的 class 块可以定义一个新的,不同的类,例如可以捕获的异常。如果没有任何要求宽恕的话,空的 except 区块可以是表达请求宽恕的最简单方式。如果迭代器完成了所有繁重的操作,那么只运行迭代器的空 for 循环可能很有用。

因此,如果在代码块中没有发生任何事情,则需要 pass 来使这样的块不产生 IndentationError。或者,可以使用任何语句(包括仅仅要评估的术语,如 Ellipsis 文字 ... 或字符串,通常是文档字符串),但是 pass 清楚地表明确实没有任何事情发生,并且不需要实际评估并(至少暂时)存储在内存中。这是一个小的注释集合,最常用的 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
    
  • 在类或函数定义中,通常已经存在 docstring 作为要执行的强制语句作为块中的唯一事物。在这种情况下,除了文档字符串之外,块还可以包含 pass *,*以便说“这确实是无意义的。”,例如在 pebl 中:

     class ParsingError(Exception): 
         """Error encountered while parsing an ill-formed datafile."""
         pass
    
  • 在某些情况下,pass 用作占位符来说“这个方法/类/ if-block / …还没有实现,但这将是它的地方”,尽管我个人更喜欢 Ellipsis literal ... (注意:仅限 python-3)以便在前面的例子中严格区分它和故意的“no-op”。例如,如果我用大笔书写一个模型,我可能会写

     def update_agent(agent):
         ... 
    

    别人可能有的地方

     def update_agent(agent):
         pass
    

    之前

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

    作为提示在稍后填写 update_agent 函数,但是已经运行了一些测试以查看代码的其余部分是否按预期运行。 (这种情况的第三个选项是 raise NotImplementedError。这特别适用于两种情况: “这个抽象方法应该由每个子类实现,在这个基类中没有通用的方法来定义它” ,或者 “这个函数,使用此名称,尚未在此版本中实现,但这是它的签名看起来像“