Python中关键字pass的用法
我在Python中不太常见到关键词 pass
的使用,除了偶尔在一些例外情况下,比如这里提到的:为什么 "except: pass" 是一种不好的编程习惯? 还有没有其他可以接受的使用 pass
的例子呢?
5 个回答
pass
是个很有用的东西,特别是当你想要创建一个自定义的异常时:
>>> class MyException(Exception):
... pass
...
>>> raise MyException("error!")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.MyException: error!
>>>
>>>
>>> try:
... raise MyException
... except MyException:
... print("error!")
...
error!
>>>
在上面的例子中,MyException
这个类里面不需要放任何东西,因为我只想要一个叫这个名字的自定义异常。所以,我用 pass
作为一个占位符,这样就可以避免在 class MyException(Exception)
这一行下面不放东西而引发的 IndentationError
错误:
>>> class MyExcpetion(Exception):
...
File "<stdin>", line 2
^
IndentationError: expected an indented block
>>>
>>> class MyExcpetion(Exception):
... pass
...
>>>
这是为了防止默认行为的一种方法(举个例子)?
class myClass(MySuper):
def overriddenmethod(self):
pass # Calls to instances of this class will do nothing when this method is called.
为了补充其他好的回答,我想再说一个我使用 pass
的情况,那就是在一些流程比较复杂的函数里,我想加一些注释来说明流程。例如:
if A:
if B:
...
else: # (added only to make the comment below more readable)
# A and not B: nothing to do because ...
pass
在这个例子中,else
这个部分显然不是必须的,但我有时候会加上它,只是为了让我的注释看起来更清晰。
下面是我使用 pass
的几个场景:
重命名一个类
这是一个非常常见的用法。99%的情况下,我用它是在 Exception
类中,因为这样可以避免抛出或捕获通用异常的坏习惯。举个例子:
class MyModuleException(Exception):
pass
在父类中声明一个方法
如果所有子类都需要提供某个方法(而这个方法没有默认行为),我通常会在父类中定义它,主要是为了文档说明。举个例子:
class Lifeform(object):
def acquire_energy(source, amount):
"""
All Lifeforms must acquire energy from a source to survive, but they
all do it differently.
"""
pass
防止继承方法的默认行为:
我很少使用这个,因为一般来说,如果你不想要父类的方法,那就说明你应该重新考虑类的结构,或者应该有一个混入类来提供这个方法。举个例子:
class Pig(Animal):
def fly(destination):
"""Pigs can't fly!"""
pass
在这里,注意到一个更好的解决方案是添加一个 CapableOfFlight
的混入类,并移除 Animal.fly()
方法。
一个用法是定义一个“占位符”类或方法,它有名字但不执行任何操作。最常见的例子可能就是定义一个自定义的异常类:
class MyCustomException(Exception):
pass
现在你可以抛出和捕获这种类型的异常。这个类的存在只是为了被抛出和捕获,不需要任何其他的功能。
类似地,API(应用程序接口)可能会包含一些“无操作”的函数,这些函数是为了在子类中被重写的:
class SomeComplexAPI(object):
# This method may be overridden in subclasses, but the base-class implementation is a no-op
def someAPIHook(self):
pass
如果你根本没有定义这个方法,SomeComplexAPI().someAPIHook()
就会抛出一个异常,因为这个方法不存在。而用 pass
定义它,可以确保即使它什么都不做,你也可以安全地调用它。