Python PEP479 更改生成器内部的 StopIteration 处理
Python PEP479 Change StopIteration handling inside generators
有人可以帮助我了解 PEP479 的内容吗?我正在阅读文档,但无法理解它。
摘要说:
This PEP proposes a change to generators: when StopIteration is raised inside a generator, it is replaced it with RuntimeError. (More precisely, this happens when the exception is about to bubble out of the generator's stack frame.)
例如,像这样的循环是否仍然有效?
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
有人可以帮助我了解 PEP479 的内容吗?我正在阅读文档,但无法理解它。
摘要说:
This PEP proposes a change to generators: when StopIteration is raised inside a generator, it is replaced it with RuntimeError. (More precisely, this happens when the exception is about to bubble out of the generator's stack frame.)
例如,像这样的循环是否仍然有效?
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