2015-11-05 53 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的方式有點奇怪。我想我最好更多地學習編程語言設計。 –