首页 > 解决方案 > 如何在 Python 中将信息与生成器的结尾一起传递?引发 StopIteration(myobj) 未被捕获

问题描述

对于生成器耗尽后返回最终信息的问题,我找到了一个优雅的解决方案,即将所需的内容放入 StopIteration 中。这需要在生成器函数结束时手动引发异常。 但是,似乎不可能从外面抓到。它工作的唯一方法是使用自定义异常,这会破坏对返回值不感兴趣的任何人的生成器协议(for例如在语句中)。

def generator():
    for i in range(3):
        print('inside', i)
        yield i
    print('raising...')
    raise StopIteration('<<Some accumulated result.>>')

p = generator()
try:
    while True:
        print('\n Trying...')
        print('outside', next(p))
except StopIteration as e:
    print('handling', e.arg

输出:

Trying...
inside 0
outside 0

Trying...
inside 1
outside 1

Trying...
inside 2
outside 2

Trying...
raising...
RuntimeError: generator raised StopIteration

预期输出:

Trying...
inside 0
outside 0

Trying...
inside 1
outside 1

Trying...
inside 2
outside 2

Trying...
raising...
handling ('<<Some accumulated result.>>')

标签: pythonpython-3.xexceptioniteratorgenerator

解决方案


实际上,生成器返回值似乎默认放在异常中

def generator():
    for i in range(3):
        print('inside', i)
        yield i
    print('raising...')
    return '<<Some accumulated result.>>'


p = generator()
try:
    while True:
        print('\n Trying...')
        print('outside', next(p))
except StopIteration as e:
    print('handling', e.args)

输出:

Trying...
inside 0
outside 0

Trying...
inside 1
outside 1

Trying...
inside 2
outside 2

Trying...
raising...
handling ('<<Some accumulated result.>>')

推荐阅读