Python标准库是否有重复调用函数生成迭代器直至抛出StopIteration的方法?
解决方案
你要的效果可以直接用Python内置的iter()函数的双参数重载实现,不需要自定义工具函数,也不需要引入第三方依赖:
# 先定义一个全局唯一的哨符对象,保证不会和方法返回的有效值重复 _sentinel = object() for batch in iter(reader.read_next_batch, _sentinel): writer.write_table(batch)
原理解释
Python内置的iter(callable, sentinel)会返回一个迭代器,迭代逻辑是:
- 重复调用传入的无参可调用对象(这里就是
reader.read_next_batch) - 默认情况下当调用返回值等于传入的
sentinel时终止迭代 - 如果调用过程中可调用对象主动抛出
StopIteration,迭代也会直接终止,和你自定义的生成器逻辑完全一致
我们这里传入自定义的object()实例作为哨符,因为它是内存中唯一的对象,永远不可能和read_next_batch返回的pyarrow批次对象相等,所以完全不会出现提前误终止的问题,所有终止逻辑都由read_next_batch抛出的StopIteration控制。
如果你确认read_next_batch永远不会返回None,也可以直接简化写法:
for batch in iter(reader.read_next_batch, None): writer.write_table(batch)
内容的提问来源于stack exchange,提问作者Tarquinnn
相关产品推荐
相关产品推荐

