我没有看到Python中使用的关键字pass
,除了偶然的例外,例如在这里:Why is "except: pass" a bad programming practice?是否有任何其他示例用例可以接受/好的编程实践?
答案 0 :(得分:2)
一种用途是定义具有名称但不执行任何操作的“存根”类或方法。也许最常见的情况是定义一个自定义的Exception类:
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
定义它可确保即使它不执行任何操作也可以安全地调用它。
答案 1 :(得分:2)
以下是我发现自己使用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()
方法。
答案 2 :(得分:1)
为了补充其他好的答案,我发现自己使用pass
的另一个案例是复杂流程的函数,我想在其中添加澄清流程的注释。 E.g:
if A:
if B:
...
else: # (added only to make the comment below more readable)
# A and not B: nothing to do because ...
pass
此示例中的else
块显然不是必需的,但我有时会添加它只是为了让我的评论更具可读性。
答案 3 :(得分:0)
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
作为占位符,以防止因IndentationError
行不放置任何内容而引发的class MyException(Exception)
:
>>> class MyExcpetion(Exception):
...
File "<stdin>", line 2
^
IndentationError: expected an indented block
>>>
>>> class MyExcpetion(Exception):
... pass
...
>>>
答案 4 :(得分:0)
作为防止默认行为的一种方法(例如)?
class myClass(MySuper):
def overriddenmethod(self):
pass # Calls to instances of this class will do nothing when this method is called.