是否有 Python 标准库函数可以通过重复调用函数来创建生成器?
Is there a Python standard library function to create a generator from repeatedly calling a functional?
我有一个方法想要重复调用以迭代,它会在完成时引发 StopIteration
(在本例中是 pyarrow.csv.CSVStreamingReader 循环遍历大文件的实例)。我可以像这样在 for 循环中使用它:
def batch_generator():
while True:
try:
yield reader.read_next_batch()
except StopIteration:
return
for batch in batch_generator():
writer.write_table(batch)
可以使用用户定义的函数以通用方式完成:
def make_generator(f):
def gen():
while True:
try:
yield f()
except StopIteration:
return
return gen()
for batch in make_generator(reader.read_next_batch):
writer.write_table(batch)
...但我想知道这样的事情是否可以通过标准库函数或一些晦涩的语法来实现?
我假设 normal iter()
function 及其第二个参数应该做你想做的。如:
for batch in iter(reader.read_next_batch, None):
...
关于如何迭代 CSVStreamingReader 的基本问题的答案是:CSVStreamingReader
is iterable and does just the thing you want:
reader = pyarrow.csv.open_csv(...)
for batch in reader:
...
一般来说,python 库确实很少 return “可迭代”的东西不是 python-可迭代的。这始终是明智的第一件事。
我有一个方法想要重复调用以迭代,它会在完成时引发 StopIteration
(在本例中是 pyarrow.csv.CSVStreamingReader 循环遍历大文件的实例)。我可以像这样在 for 循环中使用它:
def batch_generator():
while True:
try:
yield reader.read_next_batch()
except StopIteration:
return
for batch in batch_generator():
writer.write_table(batch)
可以使用用户定义的函数以通用方式完成:
def make_generator(f):
def gen():
while True:
try:
yield f()
except StopIteration:
return
return gen()
for batch in make_generator(reader.read_next_batch):
writer.write_table(batch)
...但我想知道这样的事情是否可以通过标准库函数或一些晦涩的语法来实现?
我假设 normal iter()
function 及其第二个参数应该做你想做的。如:
for batch in iter(reader.read_next_batch, None):
...
关于如何迭代 CSVStreamingReader 的基本问题的答案是:CSVStreamingReader
is iterable and does just the thing you want:
reader = pyarrow.csv.open_csv(...)
for batch in reader:
...
一般来说,python 库确实很少 return “可迭代”的东西不是 python-可迭代的。这始终是明智的第一件事。