3 回答
TA贡献1789条经验 获得超10个赞
假设您正在设计一个新类,其中包含一些您不想实现的方法。
class MyClass(object): def meth_a(self): pass def meth_b(self): print "I'm meth_b"
如果你遗漏了pass
,代码将无法运行。
然后你会得到一个:
IndentationError: expected an indented block
总而言之,该pass
声明没有任何特别之处,但它可以充当占位符,如此处所示。
TA贡献1829条经验 获得超7个赞
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
。这特别适用于两种情况:“这个抽象方法应该由每个子类实现,在这个基类中没有通用的方法来定义它”,或者“这个函数,带有此名称尚未在此版本中实现,但这是它的签名看起来像“)
添加回答
举报