Python中关键字pass的用法

1 投票
5 回答
2470 浏览
提问于 2025-04-17 22:22

我在Python中不太常见到关键词 pass 的使用,除了偶尔在一些例外情况下,比如这里提到的:为什么 "except: pass" 是一种不好的编程习惯? 还有没有其他可以接受的使用 pass 的例子呢?

5 个回答

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 作为一个占位符,这样就可以避免在 class MyException(Exception) 这一行下面不放东西而引发的 IndentationError 错误:

>>> class MyExcpetion(Exception):
...
  File "<stdin>", line 2

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

这是为了防止默认行为的一种方法(举个例子)?

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

为了补充其他好的回答,我想再说一个我使用 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 这个部分显然不是必须的,但我有时候会加上它,只是为了让我的注释看起来更清晰。

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

一个用法是定义一个“占位符”类或方法,它有名字但不执行任何操作。最常见的例子可能就是定义一个自定义的异常类:

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 定义它,可以确保即使它什么都不做,你也可以安全地调用它。

撰写回答