Python 如何在异常后继续迭代?
我对Python-2迭代器和异常之间的交互感到困惑 具体而言,鉴于以下代码:Python 如何在异常后继续迭代?,python,python-2.7,iterator,Python,Python 2.7,Iterator,我对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
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)
(请假设上述情况超出我的控制!),我写道
希望恢复由gen\u 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
问题是:
如何修改genu-all
,以便genu-test
将打印top
下面的所有整数?
显然,gen_odd
中的异常作为return
——它将迭代器标记为耗尽。真的是这样吗?是否有解决方法?在块中重新分配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
一旦出现ValueError
异常,发电机功能停止。在前一个gen function对象停止后,必须调用该函数才能创建另一个gen function对象gen_odd
从停止的位置拾取,因为从gen_int
生成的值绑定到函数对象;状态被保存,否则这将不起作用
您可以在try/中使用pass或continueexcept@tinySandy:你能说得更具体一点吗?你为什么在gen\u odd
中首先提出一个ValueError
?@Chris\u Rands:正如我所说,gen\u odd
是我无法控制的gen\u int
是一个奇怪的生成器。它保存每个新实例使用的全局状态。野外的其他99.99%的生成器不是这样工作的。这是一个很好的答案,但它只起作用,因为gen_int
是在单个gen_int.x
上工作的,这意味着它正在生成器外部保存状态。这对大多数引发异常的生成器都不起作用。@tdelaney是的,我认为生成的值是绑定到函数对象的,否则会非常不同,可能会更困难
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_test(5)
1
('gen_odd', 2)
2
3
('gen_odd', 4)
4
5
('gen_odd', 6)
6