Можно ли восстановить итератор и можно ли присвоить его значение / статус? - PullRequest
2 голосов
/ 09 июля 2010

У меня есть фрагмент ниже, который использует генератор, чтобы дать новый идентификатор

...

    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

мой вопрос: предположим, у меня есть существующий номер, такой как int (99), который нужно принять во время выполнения и нужен _generator для генерации идентификатора, начиная с 99. выглядит так:

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

как я могу отправить его обратно в _generator? Просто используйте self._generator = itertools.count(99) или есть лучший способ?

Более того, смущение может быть более обобщенным: как я могу запоминать / назначать генератор статус / значение, если оно не для типа int?

Спасибо!

1 Ответ

1 голос
/ 09 июля 2010

Нет, генераторы просто генерируют элементы, вы не можете устанавливать или сохранять их состояние после их создания. Так что self._generator = itertools.count(99) действительно лучший путь.

Что вы можете сделать, это продублировать генератор с itertools.tee, который запоминает выходную последовательность из первой итерации и передает ее новым генераторам.

Вы также можете написать генератор, который рисует из источника, который вы можете изменить:

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
...