为什么@contextmanager 的 __exit__ 处理异常传递?
Why @contextmanager's __exit__ handles passed in exception?
在查看 python 3.5 中的新功能时,我发现了 PEP 0479。在其基本原理中,它提供了一个使用@contextlib.contextmanager 的示例。我查看了这个装饰器的源代码,发现在它的 exit 方法中传递的异常在它的生成器中被抛出:
self.gen.throw(type, value, traceback)
我想知道为什么要在这个内部生成器中传递在 with 块中引发的异常。我认为正确的方法是关闭生成器并让异常传播。
如果 @contextmanager
以您建议的方式工作,则使用 @contextmanager
编写的上下文管理器(选择性地)抑制异常是不合理的。由于 @contextmanager
是一个通用工具,这种任意限制不如允许客户端代码做它喜欢的事情有用。
现在,您可能认为上下文管理器不应该首先抑制异常,但这是明确允许的 even used by the standard library,所以现在禁止它已经太晚了。
在查看 python 3.5 中的新功能时,我发现了 PEP 0479。在其基本原理中,它提供了一个使用@contextlib.contextmanager 的示例。我查看了这个装饰器的源代码,发现在它的 exit 方法中传递的异常在它的生成器中被抛出:
self.gen.throw(type, value, traceback)
我想知道为什么要在这个内部生成器中传递在 with 块中引发的异常。我认为正确的方法是关闭生成器并让异常传播。
如果 @contextmanager
以您建议的方式工作,则使用 @contextmanager
编写的上下文管理器(选择性地)抑制异常是不合理的。由于 @contextmanager
是一个通用工具,这种任意限制不如允许客户端代码做它喜欢的事情有用。
现在,您可能认为上下文管理器不应该首先抑制异常,但这是明确允许的 even used by the standard library,所以现在禁止它已经太晚了。