用于延迟展平大型数据源的自定义生成器对象
Custom generator object for lazily flattening large datasource
我正在寻找与此函数等效的面向对象的函数:
def lazy_gen_func(path):
for line in open(path):
for token in line.split():
yield token
建议采用以下方法:
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
缺点是调用 __init__ 时必须将完整的源文件加载到内存中。
如何创建自定义生成器对象以延迟展平嵌套源数据?
您可以包装一个生成器,可以来自原始函数 – 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)
将文件对象而不是路径传递给它也可能是个好主意,这样调用者就可以自由地显式关闭它。
我正在寻找与此函数等效的面向对象的函数:
def lazy_gen_func(path):
for line in open(path):
for token in line.split():
yield token
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
缺点是调用 __init__ 时必须将完整的源文件加载到内存中。
如何创建自定义生成器对象以延迟展平嵌套源数据?
您可以包装一个生成器,可以来自原始函数 – 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)
将文件对象而不是路径传递给它也可能是个好主意,这样调用者就可以自由地显式关闭它。