gpt4 book ai didi

Python PEP479 更改生成器内部的 StopIteration 处理

转载 作者:太空狗 更新时间:2023-10-29 20:51:26 25 4
gpt4 key购买 nike

谁能帮我理解 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 时, 存在歧义。它被引发(隐式地)是因为生成器用完了要产生的东西——或者它被引发是因为委托(delegate)生成器用完了要产生的东西(可能是由于 next 调用)和异常处理不当? PEP-0479 试图解决这种歧义。现在,如果您得到一个 StopIteration,这意味着您正在使用的生成器用完了要生成的项目。换句话说,这意味着委托(delegate)生成器没有在项目用完时得到错误处理。

为支持此更改,您的生成器应返回,而不是显式引发StopIteration

def gen():
yield from range(5)
return

如果您在启用 StopIterationgenerator_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

关于Python PEP479 更改生成器内部的 StopIteration 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37707187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com