我想编写一个生成器,它可以从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/