千巷猫影
Python有句法的要求,即代码块(后if,except,def,class等等)不能为空。然而,空代码块在各种不同的上下文中都是有用的,例如下面的示例,这是我见过的最常见的用例。因此,如果在代码块中不应该发生任何事情,pass则需要a 来使这样的块不产生IndentationError。或者,可以使用任何语句(包括只需要评估的术语,如Ellipsis文字...或字符串,通常是文档字符串),但是pass清楚地表明确实没有任何事情应该发生,并且不需要实际评估和(至少暂时)存储在内存中。忽略(全部或)某种类型Exception(例如xml):try:
self.version = "Expat %d.%d.%d" % expat.version_infoexcept 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文字...以便在前面的例子中严格区分这个和故意的“无操作”。例如,如果我用大笔书写一个模型,我可能会写def update_agent(agent):
...别人可能有的地方def update_agent(agent):
pass之前def time_step(agents):
for agent in agents:
update_agent(agent)作为update_agent稍后填写函数的提示,但是已经运行了一些测试以查看代码的其余部分是否按预期运行。(这种情况的第三种选择是raise NotImplementedError。这特别适用于两种情况:“这个抽象方法应该由每个子类实现,在这个基类中没有通用的方法来定义它”,或者“这个函数,带有此名称尚未在此版本中实现,但这是它的签名看起来像“)