有人可以帮我理解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
?
如果有人能够对此有所了解,我将非常感激。
答案 0 :(得分:11)
你的第一个循环应该仍然有效 - 当发电机耗尽时,StopIteration
仍会被引发。
不同之处在于,当在生成器中引发StopIteration
时, 歧义。它是否被提升(隐式)是因为生成器耗尽了产生 - 或者是因为委托生成器耗尽而导致产生(可能是由于next
调用)并且异常不是&# 39; t处理得当吗? 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