代码之家  ›  专栏  ›  技术社区  ›  Tom Rijntjes

用于延迟展平大型数据源的自定义生成器对象

  •  0
  • Tom Rijntjes  · 技术社区  · 6 年前

    我正在寻找此函数的面向对象等效项:

    def lazy_gen_func(path):
        for line in open(path): 
            for token in line.split():
                yield token
    

    Related answers 建议以下方法:

    class eager_gen_obj(object):
        def __init__(self, path):
            f = open(path)
            self.text = [token for line in f for token in line.split()]
            self.index = 0
    
        def __iter__(self):
            return self
    
        def __next__(self):
            try:
                result = self.text[self.index]
            except IndexError:
                raise StopIteration
            self.index += 1
            return result
    

    缺点是调用\uu init\uuuuu时,必须将完整的源文件加载到内存中。

    如何创建自定义生成器对象以缓慢展平嵌套的源数据?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ry-    6 年前

    可以从原始函数包装生成器 self._generator = lazy_gen_func(path) 或来自等效生成器表达式:

    class LazyGenObj:
        def __init__(self, path):
            f = open(path)
            self._generator = (token for line in f for token in line.split())
    
        def __iter__(self):
            return self
    
        def __next__(self):
            return next(self._generator)
    

    最好将文件对象传递给该对象,而不是传递路径,这样调用者就可以自由地显式关闭它。