pass 语句
你为什么要告诉解释器明确无所作为?Python 具有语法要求,即代码块(在 if
,except
,def
,class
等之后)不能为空。
但有时空代码块本身就很有用。一个空的 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
的示例,通常被认为是不好的做法,因为它还捕获可能传递给调用者的异常,例如KeyboardInterrupt
或SystemExit
(甚至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
。这特别适用于两种情况: “这个抽象方法应该由每个子类实现,在这个基类中没有通用的方法来定义它” ,或者 “这个函数,使用此名称,尚未在此版本中实现,但这是它的签名看起来像“ )