__exit __

时间:2017-05-12 21:02:17

标签: python with-statement contextmanager

我理解

  • __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。异常是按原样引发的。

1 个答案:

答案 0 :(得分:13)

是的,该退货声明是多余的。仅当type None时,返回值才有意义。

来自object.__exit__() documentation

  

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

请注意, true value 会抑制异常;因此1"Handled!"也可以,而不只是True

删除return行将导致返回None,并且功能将保持不变。然而,可读性会得到改善,因为return type == None语句只会在多个级别上混淆(例如,为什么不使用type is None?)。