On Fri, Oct 21, 2011 at 7:02 PM, Yingjie Lan <lany...@yahoo.com> wrote:
> What if the generator involves a variable from another scope,
> and before re-generating, the variable changed its value.
> Also, the generator could be passed in as an argument,
> so that we don't know its exact expression.
>

There's actually no way to know that the generator's even
deterministic. Try this, for instance:

>>> g=(input("Enter value %d or blank to stop: "%n) for n in range(1,11))
>>> for s in g:
        if not s: break
        print("Processing input: "+s)

It may not be particularly useful, but it's certainly legal. And this
generator cannot viably be restarted. The only way is to cast it to
list first, but that doesn't work when you have to stop reading
expressions from the generator part way.

What you could perhaps do is wrap the generator in something that
saves its values:

>>> class restartable(object):
        def __init__(self,gen):
                self.gen=gen
                self.yielded=[]
                self.iter=iter(self.yielded)
        def restart(self):
                self.iter=iter(self.yielded)
        def __iter__(self):
                return self
        def __next__(self): # Remove the underscores for Python 2
                try:
                        return self.iter.__next__()
                except StopIteration:
                        pass
                ret=self.gen.__next__()
                self.yielded.append(ret)
                return ret

>>> h=restartable(g)
>>> for i in h:
        if not i: break
        print("Using: ",i)
>>> h.restart()
>>> for i in h:
        if not i: break
        print("Using: ",i)

Complicated, but what this does is returns a value from its saved list
if there is one, otherwise returns a value from the original
generator. It can be restarted as many times as necessary, and any
time you read "past the end" of where you've read so far, the original
generator will be called upon.

Actually, this model might be useful for a repeatable random-number
generator. But those are more efficiently restarted by means of
reseeding the PRNG.

ChrisA
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to