[Python-Dev] accumulator display syntax

Phillip J. Eby pje at telecommunity.com
Fri Oct 17 19:06:22 EDT 2003


At 03:47 PM 10/17/03 -0700, Guido van Rossum wrote:
> > Hm.  What if list comprehensions returned a "lazy list", that if you took
> > an iterator of it, you'd get a generator-iterator, but if you tried to use
> > it as a list, it would populate itself?  Then there'd be no need to ever
> > *not* use a listcomp, and only one syntax would be necessary.
> >
> > More specifically, if all you did with the list was iterate over it, and
> > then throw it away, it would never actually populate itself.  The 
> principle
> > drawback to this idea from a semantic viewpoint is that listcomps can be
> > done over expressions that have side-effects.  :(
>
>I don't think this can be done without breaking b/w compatibility.  Example:
>
>   a = [x**2 for x in range(10)]
>   for i in a: print i
>   print a
>
>Your proposed semantics would throw away the values in the for loop,
>so what would it print in the third line?

I should've been more specific...  some pseudocode:

class LazyList(list):

     materialized = False

     def __init__(self, generator_func):
         self.generator = generator_func

     def __iter__(self):
         # When iterating, use the generator, unless
         # we've already computed contents.
         if self.materialized:
             return super(LazyList,self).__iter__()
         else:
             return self.generator()

     def __getitem__(self,index):
         if not self.materialized:
             self[:] = list(self.generator())
             self.materialized = True
         return super(LazyList,self).__getitem__(index)

     def __len__(self):
         if not self.materialized:
             self[:] = list(self.generator())
             self.materialized = True
         return super(LazyList,self).__len__()

     # etc.

So, the problem isn't that the code you posted would fail on 'print a', 
it's that the generator function would be run *twice*, which would be a 
no-no if it had side effects, and would also take longer.

It was just a throwaway idea, in the hopes that maybe it would lead to an 
idea that would actually work.  Ah well, maybe in Python 3.0, there'll just 
be itercomps, and we'll use list(itercomp) when we want a list.




More information about the Python-Dev mailing list