gpt4 book ai didi

python - 如何从子生成器捕获 StopIteration

转载 作者:太空宇宙 更新时间:2023-11-03 20:26:29 27 4
gpt4 key购买 nike

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

我尝试使用内部生成器与外部生成器进行包装,使用 try- except block 内的表达式的yield,但 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。最好的解决方案是什么?

最佳答案

如果您希望 Graceful_writer 继续接受通过其 .send() 方法发送给它的数据,它需要继续无限期地产生。您当前拥有的 try/ except block 实际上没有执行任何操作,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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com