[Python-Dev] closure semantics

Guido van Rossum guido at python.org
Thu Oct 23 19:22:44 EDT 2003


> >   def tee(iterable):
> >       "Return two independent iterators from a single iterable"
> >       data = {}
> >       cnt = 0
> >       def gen(next):
> >           global* cnt
> >           dpop = data.pop
> >           for i in count():
> >               if i == cnt:
> >                   item = data[i] = next()
> >                   cnt += 1
> >               else:
> >                   item = dpop(i)
> >               yield item
> >       next = iter(iterable).next
> >       return (gen(next), gen(next))
> >
> >which is IMO more readable.
> 
> it's a subtle piece of code. I wouldn't mind a more structured syntax with 
> both the outer function declaring that is ok for some inner function to 
> rebind some of its locals, and the inner function declaring that a local is 
> coming from an outer scope:
> 
>    def tee(iterable):
>        "Return two independent iterators from a single iterable"
>        data = {}
> 
>        # cnt = 0 here would be ok
> 
>       share cnt = 0:  # the assignment is opt,
>                        # inner functions in the suite can rebind cnt
>         def gen(next):
>           use cnt # OR outer cnt
>          dpop = data.pop
>            for i in count():
>                if i == cnt:
>                    item = data[i] = next()
>                    cnt += 1
>                else:
>                    item = dpop(i)
>                yield item
> 
>        # cnt = 0 here would be ok
> 
>       next = iter(iterable).next
>        return (gen(next), gen(next))
> 
> yes it's heavy and unpythonic, but it makes very clear that something 
> special is going on with cnt.

Might as well declare a class then. :-)

> no time to add anything else to the thread.

Ditto.

--Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-Dev mailing list