Python PEP479更改生成器内部的StopIteration处理
问题内容:
有人可以帮助我了解PEP479的含义吗?我正在阅读该文档,无法理解。
摘要说:
该PEP建议对生成器进行更改:在生成器内部引发StopIteration时,将其替换为RuntimeError。(更准确地说,当异常将要从生成器的堆栈框架冒出时,会发生这种情况。)
例如,这样的循环是否仍然有效?
it = iter([1,2,3])
try:
i = next(it)
while True:
i = next(it)
except StopIteration:
pass
还是说如果我有这样的生成器定义:
def gen():
yield from range(5)
raise StopIteration
在StopIteration
将要被替换RuntimeError
?
如果有人能对此有所阐明,我将非常感激。
问题答案:
您的第一个循环应该仍然有效-StopIteration
发电机用完后仍会上升。
所不同的是,有 是 歧义时,StopIteration
以发电机长大。是因为生成器用尽了所有要产生的东西而被隐式地提出-
还是因为委托生成器用尽了要产生的东西(可能是由于next
调用了)而没有正确处理异常而被提出了?PEP-0479试图解决这种歧义。现在,如果得到一个StopIteration
,则意味着您正在使用的生成器用完了要产生的项目。换句话说,这意味着委托生成器
在 项目用尽时 不会 被错误处理。
为了支持此更改,您的生成器应该return
而不是StopIteration
显式提高。
def gen():
yield from range(5)
return
如果您尝试使用StopIteration
和generator_stop
启用它,则会发生以下情况(当python3.7出现时,它将成为默认值):
>>> from __future__ import generator_stop
>>> def gen():
... yield from range(5)
... raise StopIteration
...
>>> list(gen())
Traceback (most recent call last):
File "<stdin>", line 3, in gen
StopIteration
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration