在python中使用关键字pass

时间:2014-03-14 19:25:17

标签: python exception keyword

我没有看到Python中使用的关键字pass,除了偶然的例外,例如在这里:Why is "except: pass" a bad programming practice?是否有任何其他示例用例可以接受/好的编程实践?

5 个答案:

答案 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.