【发布时间】:2014-04-20 06:38:45
【问题描述】:
我没有看到关键字pass 在 Python 中使用得很多,除了偶尔的例外,比如这里:Why is "except: pass" a bad programming practice? 是否还有其他可以接受/好的编程实践的 pass 示例用例?
【问题讨论】:
-
except SomeException: pass很好,它是光秃秃的except: pass那是废话
我没有看到关键字pass 在 Python 中使用得很多,除了偶尔的例外,比如这里:Why is "except: pass" a bad programming practice? 是否还有其他可以接受/好的编程实践的 pass 示例用例?
【问题讨论】:
except SomeException: pass 很好,它是光秃秃的except: pass 那是废话
一种用途是定义一个“存根”类或方法,该类或方法具有名称但不执行任何操作。也许最常见的情况是定义一个自定义的异常类:
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 定义它可以确保您可以安全地调用它,即使它不执行任何操作。
【讨论】:
pass,只是为了表明它已经被删除了。
pass,但是在我工作的地方,他们会反对它,因为它是“不必要的”。如果确实需要 pass 语句,我通常会说它应该与“#TODO”类型的注释相结合。
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
...
>>>
【讨论】:
作为一种防止默认行为的方法(例如)?
class myClass(MySuper):
def overriddenmethod(self):
pass # Calls to instances of this class will do nothing when this method is called.
【讨论】:
MySuper的方法被调用。
MySuper,这样它就没有孩子必须阻止的方法。如果由于历史原因这是不可能的,那么我还需要一个文档字符串来解释这种情况。
以下是我发现自己使用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() 方法。
【讨论】:
为了补充其他好的答案,我发现自己使用pass 的另一种情况是在具有复杂流程的函数中,我想添加 cmets 来澄清流程。例如:
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 相同的字节码!