【问题标题】:How to catch StopIteration from subgenerator如何从子生成器中捕获 StopIteration
【发布时间】:2020-01-06 16:16:28
【问题描述】:

我想编写一个生成器,它可以从收益中接受有限数量的输入,然后优雅地处理进一步的输入。捕捉 StopIteration 的最佳方法是什么?

我尝试使用 try-except 块中的 yield from 表达式将内部生成器与外部生成器进行包装,但无论如何都会引发 StopIteration...

def limited_writer(max_writes):
    for i in range(max_writes):
        x = yield
        print(x) #

def graceful_writer(l):
    try:
        yield from l
    except StopIteration:
        # Ideally will have additional handling logic here
        raise Exception("Tried to write too much")

l_w = limited_writer(4)
g_w = graceful_writer(w)

g_w.send(None)

for i in range(5):
    g_w.send(i)

我希望上面引发异常(但更普遍地提供了一种处理提供过多数据的好方法),但实际上它仍然引发了 StopIteration。最好的解决方案是什么?

【问题讨论】:

  • 你的意思是g_w = graceful_writer(l_w)

标签: python


【解决方案1】:

如果您希望graceful_writer 继续接受通过其.send() 方法发送给它的数据,它需要无限期地继续让步。您当前拥有的try/except 块实际上并没有做任何事情,yield from 语句已经吸收了来自limited_writerStopIteration。您在顶层看到的来自graceful_writer 本身,当它到达其代码的末尾时。

为避免这种情况,请尝试使用无限循环,如下所示:

def graceful_writer(gen):
    yield from gen    # send values to wrapped generator for as long as it will take them
    while True:           
        yield         # then loop forever, discarding any additional values sent in

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2016-08-05
    • 2013-05-24
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多