【发布时间】:2017-06-02 12:31:22
【问题描述】:
我在使用使用可再填充迭代器的生成器时遇到问题。
这是我的简单生成器:
def hi(iterable):
for val in iterable:
yield val
我传递给 hi 生成器的可迭代对象是来自 functional_pipes repo 的 Reservoir 类,它可以在其元素耗尽后重新填充。
我想使用 hi 生成器,直到 StopIteration 被引发,然后重新填充 iterable,然后再次使用它
refillable = Reservoir((1, 2, 3, 4))
hi_iter = hi(refillable)
print(tuple(hi_iter))
refillable((5, 6, 7, 8))
print(tuple(hi_iter))
但这会打印出来
(1, 2, 3, 4)
()
第二个元组也应该是 (5, 6, 7, 8)。
我找到的唯一解决方案是用一个类包装 hi 生成器
def super_gener(function):
class wrapper_class:
def __init__(self, iterable):
self.iterable = iterable
self.zipped = None
def __iter__(self):
return self
def __next__(self):
try:
return next(self.zipped)
except TypeError:
self.zipped = function(self.iterable)
return next(self)
except StopIteration as err:
self.zipped = None
raise err
return wrapper_class
hi_iter = super_gener(hi)(refillable)
print(tuple(hi_iter))
refillable(data)
print(tuple(hi_iter))
这个解决方案似乎有点过分,我正在寻找一个更简单的解决方案。感谢您的帮助。
回应 Ptank: 我无法将 iterable 保存到元组,因为 iterable 并不总是产生相同的项目,并且在第二次填充 refillable 之前这些项目是未知的。
【问题讨论】: