【问题标题】:Is there a Python standard library function to create a generator from repeatedly calling a functional?是否有 Python 标准库函数可以通过重复调用函数来创建生成器?
【发布时间】:2021-12-21 09:19:32
【问题描述】:

我有一个方法想要重复调用以进行迭代,完成后会引发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)

...但我想知道这样的事情是否可以通过标准库函数或一些晦涩的语法来实现?

【问题讨论】:

  • while True: writer.write_table(reader.read_next_batch()) 有什么问题?
  • 你必须手动捕捉StopIteration
  • 什么StopIterationread_next_batch() 不是返回值的函数吗?如果您有 StopIteration,那么您的问题就解决了 - 只需使用 for 循环...
  • 你是对的,我错过了 Chronial 的回答中的 iter 电话。

标签: python generator


【解决方案1】:

我会假设 normal iter() function 及其第二个参数应该做你想做的事。如:

for batch in iter(reader.read_next_batch, None):
    ...

【讨论】:

  • 好吧,现在我觉得很傻......我之前错过了 None,有没有解释为什么需要它?
  • iter 是一个奇怪的函数。它基本上是两个不同的函数,参数的数量决定了它的实际作用。 iter(f, x) 是由f() 生成的一系列值,直到f() 返回x
【解决方案2】:

关于如何迭代 CSVStreamingReader 的基本问题的答案是:CSVStreamingReader 是可迭代的,并且 just the thing you want 可以:

reader = pyarrow.csv.open_csv(...)
for batch in reader:
    ...

一般来说,python 库很少会返回不是 python 可迭代的“可迭代”事物。这始终是明智的尝试。

【讨论】:

猜你喜欢
  • 2020-11-25
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多