有人可以帮助我了解 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
the StopIteration
将被替换为RuntimeError
?
如果有人能阐明这一点,我将非常感激。
你的第一个循环应该仍然有效——StopIteration
当发电机耗尽时仍会升高。
不同之处在于有was歧义性,当StopIteration
是在发电机中长大的。它被引发(隐式)是因为生成器用完了要产生的东西 - 或者它被引发是因为委托生成器用完了要产生的东西(可能是由于next
调用)并且异常没有得到正确处理? PEP-0479 试图解决这种歧义。现在如果你得到一个StopIteration
,这意味着您正在使用的生成器已经耗尽了要产出的项目。换句话说,这意味着委托生成器didn't当物品用完时,处理不当。
为了支持此更改,您的生成器应该return
而不是提高StopIteration
明确地。
def gen():
yield from range(5)
return
如果您尝试使用以下命令,会发生以下情况StopIteration
and 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)