python中关键字pass的用法[重复]

Posted

技术标签:

【中文标题】python中关键字pass的用法[重复]【英文标题】:usage of keyword pass in python [duplicate] 【发布时间】:2014-04-20 06:38:45 【问题描述】:

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

【问题讨论】:

except SomeException: pass 很好,它是光秃秃的except: pass 那是废话 【参考方案1】:

一种用途是定义一个“存根”类或方法,该类或方法具有名称但不执行任何操作。也许最常见的情况是定义一个自定义的异常类:

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 定义它可以确保您可以安全地调用它,即使它不执行任何操作。

【讨论】:

可以说,第二种情况(意味着子类化的“无操作函数”)应该有一个 docstring 代替。这样,您可以记录该函数在被覆盖后应该做什么。 是的,但即使它有一个文档字符串,我也看到有人在它下面写pass,只是为了表明它已经被删除了。 我在像这样的情况下经常使用它,例如,我正在写一些新的东西,我知道我需要有 function(),但我不知道我在那个函数中需要的所有东西然而。只需在其中输入一个 pass,它就会提供伪功能,您可以稍后返回并继续工作。 @BrenBarn -- 是的。我也喜欢在那里添加(不必要的)pass,但是在我工作的地方,他们会反对它,因为它是“不必要的”。如果确实需要 pass 语句,我通常会说它应该与“#TODO”类型的注释相结合。 IMO 更有用的替代方案是提出某种特定的exception。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

我希望这里有一个文档字符串,明确说明为什么这个类应该阻止MySuper的方法被调用。 我更喜欢重构MySuper,这样它就没有孩子必须阻止的方法。如果由于历史原因这是不可能的,那么我还需要一个文档字符串来解释这种情况。【参考方案4】:

以下是我发现自己使用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() 方法。

【讨论】:

【参考方案5】:

为了补充其他好的答案,我发现自己使用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 块显然不是必需的,但我有时添加它只是为了让我的评论更具可读性。

【讨论】:

有趣的事实:在 Python 3 中,声明 ... 是有效的,并且将产生与 pass 相同的字节码!

以上是关于python中关键字pass的用法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python关键字及其用法

Python老男孩 day09

unityShader CGINCLUDE关键字

关于pass在python编程里的作用

在 C# 中,我遇到了一个我不理解的关键字“this”的用法[重复]

C# var 关键字用法[重复]