Python PEP479生成器内部的更改停止迭代处理

Python PEP479生成器内部的更改停止迭代处理,python,runtime-error,stopiteration,Python,Runtime Error,Stopiteration,有人能帮我理解PEP479是关于什么的吗?我在看医生,脑子都转不过来了 摘要说: 此PEP建议对生成器进行更改:当在生成器中引发StopIteration时,将其替换为RuntimeError。(更准确地说,当异常即将从生成器的堆栈帧中冒泡时,就会发生这种情况。) 例如,像这样的循环还能工作吗 it = iter([1,2,3]) try: i = next(it) while True: i = next(it) except 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
时存在歧义。它是因为生成器没有要生成的东西而被(隐式地)引发的,还是因为委托生成器没有要生成的东西而被引发的(可能是由于
下一个
调用),并且异常没有得到正确处理?PEP-0479试图解决这种模糊性。现在,如果您得到一个
StopIteration
,这意味着您正在使用的生成器将生成已用完的项。换句话说,这意味着委托生成器在项目用完时不会被错误处理

要支持此更改,您的生成器应该
返回
,而不是显式地提出
停止迭代

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

以下是在启用了
StopIteration
generator\u stop
的情况下进行尝试时会发生的情况(当python3.7出现时,这将成为默认设置):

>>>来自未来导入生成器停止
>>>def gen():
...     范围收益率(5)
...     提出停止迭代
... 
>>>列表(gen())
回溯(最近一次呼叫最后一次):
文件“”,第3行,在gen中
停止迭代
上述异常是以下异常的直接原因:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
运行时错误:生成器引发了StopIteration

我明白了。我在阅读有关
StopAsyncIteration
的文章时偶然发现了这一点。现在一切都有意义了。非常感谢。
>>> 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