我想编写一个生成器,它可以接受来自产量的有限数量的输入,然后优雅地处理更多输入。捕获 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
我是一名优秀的程序员,十分优秀!