如何从子代捕获StopIteration

2024-05-21 04:02:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个生成器,它可以接受来自yields的有限数量的输入,然后优雅地处理进一步的输入。抓到你最好的方法是什么

我曾经尝试过在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。最好的解决方案是什么


Tags: 方法infromfordefrangemaxwriter
1条回答
网友
1楼 · 发布于 2024-05-21 04:02:22

如果您想graceful_writer继续接受通过其.send()方法发送给它的数据,它需要无限期地继续产生。您当前拥有的try/except块实际上没有做任何事情,yield from语句已经从limited_writer中吸收了StopIteration。您在顶层看到的一个来自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

相关问题 更多 >