gpt4 book ai didi

python - 如何在异常后继续迭代?

转载 作者:行者123 更新时间:2023-11-28 22:33:07 24 4
gpt4 key购买 nike

我对 Python-2 迭代器和异常之间的交互感到困惑。

具体来说,给定以下代码:

def gen_int():
if not hasattr(gen_int,"x"):
gen_int.x = 0
while True:
gen_int.x += 1
yield gen_int.x

def gen_odd():
for x in gen_int():
if x % 2:
yield x
else:
raise ValueError("gen_odd",x)

(请假设以上内容不在我的控制范围内!),我写

def gen_all():
it = gen_odd()
while True:
try:
yield it.next()
except ValueError as exn:
print exn
func_name, x = exn
assert func_name == "gen_odd"
yield x

希望恢复 gen_int 生成的完整流。

但是,迭代在第一个异常之后停止:

def gen_test(top):
for x in gen_all():
print x
if x > top:
break

这里有 3 个调用:

>>> gen_test(20)
1
('gen_odd', 2)
2
>>> gen_test(20)
3
('gen_odd', 4)
4
>>> gen_test(20)
5
('gen_odd', 6)
6

问题是:我如何修改 gen_all 以便 gen_test 打印 所有 top 下的整数?

附言。显然,gen_odd 中的异常作为 return 工作——它将迭代器标记为耗尽。真的是这样吗?有解决方法吗?

最佳答案

except block 中重新分配 gen_odd():

def gen_all():
it = gen_odd()
while True:
try:
yield it.next()
except ValueError as exn:
print exn
func_name, x = exn
assert func_name == "gen_odd"
yield x
it = gen_odd() # here

生成器函数 gen_odd 一旦出现 ValueError 异常就会停止。您必须在前一个停止后调用该函数以创建另一个 gen 函数对象。 gen_odd 从它停止的地方开始,因为从 gen_int 产生的值被绑定(bind)到函数对象;状态已保存,否则这将无法工作。


>>> gen_test(5)
1
('gen_odd', 2)
2
3
('gen_odd', 4)
4
5
('gen_odd', 6)
6

关于python - 如何在异常后继续迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40267192/

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