【问题标题】:Return value of __exit____exit__ 的返回值
【发布时间】:2017-05-12 21:02:17
【问题描述】:

我明白了

  • __enter____exit__ 用于实现上下文管理器。

  • 如果with 语句中发生异常,则将异常的类型、值和回溯传递给__exit__ 方法。

  • __exit__可以处理异常:

    1. 返回True:异常处理得当。
    2. 返回任何其他内容:with 语句引发异常

我遇到了以下__exit__ 方法。 return 语句是多余的吗?

def __exit__(self, type, value, traceback):
    self.close()
    return type == None

因为在我看来,

  • 如果没有发生异常,type自然会是None,所以__exit__返回true。没有提出任何问题。
  • 如果确实发生了异常,type 将设置为实际的异常类型,因此__exit__ 返回 false。按原样引发异常。

【问题讨论】:

  • 这在不止一个层面上是一个令人困惑的return 声明。当您可以使用 is None 时,切勿使用 == None。但是,是的,只要完全删除 return 行就可以了。
  • 当你将方法参数命名为type 时也会让人困惑。因为type 已经是内置关键字。最好使用exc_type,因为它不会混淆并且不会影响内置关键字。

标签: python with-statement contextmanager


【解决方案1】:

是的,return 语句是多余的。只有当type 不是 None 时,返回值才重要。

来自object.__exit__() documentation

如果提供了一个异常,并且该方法希望抑制异常(即阻止它被传播),它应该返回一个真值。否则,异常会在退出该方法时正常处理。

注意 true 值 将抑制异常;所以1"Handled!" 也可以工作,而不仅仅是True

删除return 行将导致None 被返回,并且功能将保持不变。然而,可读性会有所提高,因为 return type == None 语句在多个层面上只是令人困惑(例如,为什么不使用 type is None?)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多