Python PEP479生成器内部的更改停止迭代处理
有人能帮我理解PEP479是关于什么的吗?我在看医生,脑子都转不过来了 摘要说: 此PEP建议对生成器进行更改:当在生成器中引发StopIteration时,将其替换为RuntimeError。(更准确地说,当异常即将从生成器的堆栈帧中冒泡时,就会发生这种情况。) 例如,像这样的循环还能工作吗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:
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