2015-11-05 28 views
0

在查看python 3.5的新功能时,我发现PEP 0479。在它的基本原理中,它提供了一个使用@ contextlib.contextmanager的例子。我看着这个装饰的来源,发现其出口方法传来的例外在它的发电机被抛出:为什么@ contextmanager的__exit__句柄在异常中传递?

self.gen.throw(type, value, traceback) 

我不知道为什么在与块引发的异常应在此发电机内部传递。我认为正确的方法是关闭生成器并让异常传播。

回答

1

如果@contextmanager以您建议的方式工作,那么使用用@contextmanager编写的上下文管理器来(有选择地)禁止异常是不合理的。由于@contextmanager是一种通用工具,因此这种任意限制比允许客户端代码执行其所喜欢的操作更为有用。

现在,您可能认为上下文管理者不应该首先抑制异常,但明确允许这样做,因此现在禁止它已为时过晚。

+0

这是合理的。但我仍然认为PEP0479在发电机内改变StopIteration为RuntimeError的方式有点奇怪。我想我最好更多地学习编程语言设计。 –