2015-11-05 3 views
0

При взгляде на то, что нового в python 3.5, я нашел PEP 0479. В своем обосновании он представляет пример с помощью @ contextlib.contextmanager. Я посмотрел на источнике этого декоратора, и обнаружил, что исключение передается в выходе метода выбрасываются в это генераторе:Почему обработчики @ textmanager's __exit__ передаются в исключение?

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

Интересно, почему исключения, сгенерированные в с блоком должны быть приняты в этом внутреннем генераторе. Я думаю, что правильным способом является закрытие генератора и распространение исключения.

ответ

1

Если @contextmanager работал в соответствии с предложенным вами способом, было бы разумно (выборочно) подавлять исключения с помощью диспетчера контекстов, написанного с помощью @contextmanager. Поскольку @contextmanager является универсальным инструментом, такое произвольное ограничение менее полезно, чем позволять клиентскому коду делать то, что ему нравится.

Теперь вы можете быть уверены, что менеджеры контекста не должны в первую очередь исключать исключения, но это явно разрешено и even used by the standard library, так что уже слишком поздно, чтобы запретить его сейчас.

+0

Ну, это разумно. Но я все же думаю, что способ PEP0479 изменить StopIteration на RuntimeError внутри генератора немного странный. Думаю, мне лучше узнать больше о программировании языка программирования. –