我发现通过谷歌搜索找到__enter__和__exit__方法的python文档非常困难,所以这里有链接来帮助其他人:
https://docs.python.org/2/reference/datamodel.html#with-statement-context-managers
https://docs.python.org/3/reference/datamodel.html#with-statement-context-managers
(两个版本的细节相同)
object.__enter__(自我)
输入与此对象相关的运行时上下文。with语句将该方法的返回值绑定到语句的as子句中指定的目标(如果有的话)。
对象。__exit__(self, exc_type, exc_value, traceback)
退出与此对象相关的运行时上下文。参数描述了导致退出上下文的异常。如果没有异常退出上下文,所有三个参数都将为None。
如果提供了一个异常,而该方法希望抑制该异常(即防止它被传播),它应该返回一个真值。否则,异常将在退出此方法时正常处理。
注意__exit__()方法不应该重新引发传入的异常;这是调用者的责任。
我希望清楚地描述__exit__方法参数。这是缺乏的,但我们可以推断他们…
假定exc_type是异常的类。
它说你不应该重新引发传入异常。这提示我们,其中一个参数可能是一个实际的异常实例…或者你应该自己从类型和值实例化它?
我们可以看看这篇文章来回答:
http://effbot.org/zone/python-with-statement.htm
例如,下面的__exit__方法接受任何TypeError,但允许所有其他异常通过:
def __exit__(self, type, value, traceback):
return isinstance(value, TypeError)
…所以value显然是一个Exception实例。
traceback大概是一个Python回溯对象。
注意这里还有更多的文档:
https://docs.python.org/3/library/stdtypes.html#context-manager-types
...他们对__enter__和__exit__方法有稍微详细的解释。特别是__exit__应该返回一个布尔值(尽管true或falsy也可以,例如,一个隐式的None返回将给出传播异常的默认行为)。