关于异常:在python中使用关键字pass

usage of keyword pass in python

本问题已经有最佳答案,请猛点这里访问。

我没有看到在python中使用的关键字pass,除了偶尔出现的异常,例如:为什么"except:pass"是一种糟糕的编程实践?是否有其他可接受/良好编程实践的pass用例示例?


以下是我发现自己使用pass的几个例子:

重命名类

这是一个很常见的用法。99%的时间是Exception类,因为这是避免提出/排除一般例外的坏做法的最简单方法。例子:

1
2
class MyModuleException(Exception):
    pass

在父类上声明方法

如果子类都需要提供某个方法(并且该方法没有默认行为),我通常会在父类上定义它,只是为了文档目的。例子:

1
2
3
4
5
6
7
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

防止继承方法的默认行为:

我谨慎地使用它,因为通常情况下,如果您不想要父类的方法,它是一个标志,表明您应该重构类层次结构,或者应该在提供该方法的类中混合使用该方法。例子:

1
2
3
4
class Pig(Animal):
    def fly(destination):
       """Pigs can't fly!"""
        pass

请注意,更好的解决方案是添加CapableOfFlight混合并删除Animal.fly()方法。


一种用法是定义一个"存根"类或方法,该类或方法有一个名称,但不做任何事情。可能最常见的情况是定义自定义异常类:

1
2
class MyCustomException(Exception):
    pass

现在您可以引发和捕获这种类型的异常。类只存在于提升和捕获中,不需要与它相关联的任何行为。

以类似的方式,API可以包含"不做任何事情"的函数,这些函数将在子类中被重写:

1
2
3
4
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定义它可以确保即使它不做任何事情也可以安全地调用它。


为了补充其他好的答案,我发现自己使用pass的另一个例子是具有复杂流的函数,我想在其中添加说明流的注释。例如。:

1
2
3
4
5
6
if A:
  if B:
    ...
  else:  # (added only to make the comment below more readable)
    # A and not B: nothing to do because ...
    pass

本例中的else块显然不是必需的,但有时我添加它只是为了使我的评论更具可读性。


作为防止默认行为的一种方法(例如)?

1
2
3
class myClass(MySuper):
  def overriddenmethod(self):
    pass  # Calls to instances of this class will do nothing when this method is called.


如果要进行自定义异常,pass非常有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> 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

1
2
3
4
5
6
7
8
9
10
11
>>> class MyExcpetion(Exception):
...
  File"<stdin>", line 2

    ^
IndentationError: expected an indented block
>>>
>>> class MyExcpetion(Exception):
...     pass
...
>>>