Iterator class to allow self-restarting generator expressions?

John O'Hagan mail at johnohagan.com
Sun Mar 1 22:33:14 EST 2009


On Sun, 1 Mar 2009, Mark Tolonen wrote:
> "John O'Hagan" <research at johnohagan.com> wrote in message
> news:200903011520.29405.research at johnohagan.com...
>
> > Inspired by some recent threads here about using classes to extend the
> > behaviour of iterators, I'm trying to replace some some top-level
> > functions
> > aimed at doing such things with a class.
> >
> > So far it's got a test for emptiness, a non-consuming peek-ahead method,
> > and
> > an extended next() which can return slices as well as the normal mode,
> > but one thing I'm having a little trouble with is getting generator
> > expressions
> > to restart when exhausted. This code works for generator functions:
>
> [snip code]
>
> The Python help shows the Python-equivalent code (or go to the source) for
> things like itertools.islice and itertools.icycle, which sound like what
> you are re-implementing.  It looks like to handle generators icycle saves
> the items as they are generated in another list, then uses the list to
> generate successive iterations.
>

Thanks for your reply Mark; I've looked at the itertools docs (again, this 
time I understood more of it!), but because the generators in question 
produce arbitrarily many results (which i should have mentioned), it would 
not always be practical to hold them all in memory. 

So I've used a "buffer" instance attribute in my iterator class, which only 
holds as many items as are required by the peek(), next() and __nonzero__() 
methods, in order to minimize memory use (come to think of it, I should add a 
clear() method as well...).  

But the islice() function looks very useful and could replace some code in my  
generator functions, as could some of the ingenious recipes at the end of the 
itertools chapter. It's always good to go back to the docs!

As for restarting the iterators, it seems from other replies that I must use 
generator function calls rather than expressions in order to do that.

Thanks,

John 



More information about the Python-list mailing list