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

我尝试使用try-except块内的表达式的收益率通过内部生成器与外部生成器进行包装,但无论如何都会提高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)


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

最佳答案

如果希望graceful_writer继续接受通过其.send()方法发送给它的数据,则它需要无限期地继续屈服。您当前拥有的try / except块实际上没有任何作用,yield from语句已经吸收了StopIteration中的limited_writer。当它到达代码末尾时,您在顶层看到的来自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

关于python - 如何从子生成器捕获StopIteration,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57777055/

10-13 03:30