可以恢复迭代器并且可以分配其值/状态吗?

时间:2010-07-09 09:44:21

标签: python iterator duplicates generator restore

我有以下代码片段,它使用生成器来提供新ID

...

    def __init__(self, id_generator = None):
        if id_generator is None: id_generator = 0

        if isinstance(id_generator, int):
            import itertools
            self._generator = itertools.count(id_generator)

        else:
            self._generator = id_generator
...

    id = self._generator.next()  #0
    id = self._generator.next()  #1
    id = self._generator.next()  #2
    id = self._generator.next()  #3

我的问题是,假设我有一个现有的id号,比如int(99)需要被接受 在运行时期间需要_generator从99开始生成ID。 看起来像:

0
1
2
3
4
             <---- new id number 99 be given in somehow
99
100
101

如何将它反馈回_generator? 只需使用self._generator = itertools.count(99)或者有更好的方法吗?

更多,这可能会更加笼统:我如何备忘/分配发电机 如果不是int类型的状态/值?

谢谢!

1 个答案:

答案 0 :(得分:1)

不,生成器只生成项目,一旦创建它们就无法设置或保存它们的状态。所以self._generator = itertools.count(99)确实是最好的方式。

你可以做的是用itertools.tee复制一个生成器,它记住第一个iterable的输出序列并将它传递给新的生成器。

您还可以编写一个可以从您可以更改的来源绘制的生成器:

class counter(object):
    def __init__(self, current=0):
        self.current = current

    def __iter__(self):
        def iter():
            while True:
                yield self.current
                self.current += 1 # 
        return iter()

    def set(self,x):
        self.current = x

s = counter()
t = iter(s)
print t.next() # 0
s.set(20)
print t.next() # 21