Iterators & generators & coroutines

Aahz Maruch aahz at netcom.com
Thu Feb 17 16:38:26 CET 2000


In article <sajm45t62pd47 at corp.supernews.com>,
Evan Simpson <evan at 4-am.com> wrote:
>
>BinTree is a normal class, which produces ordinary instances which
>implement a binary tree.  BinTree has a method 'traverser', which
>returns an object.  This object steps along the binary tree and
>returns a node each time its __getitem__ is called, then raises an
>exception when it runs out of tree.  Instead of maintaining some kind
>of explicit state in the object, it simply uses continuations to
>implement __getitem__ in a clear, natural fashion.  The only data in
>the object is the continuation for __getitem__ and a reference to the
>BinTree instance.
>
>Calling b.traverser() twice, as above, just creates two traversal
>objects which independently walk the tree.

Hmmmm....  On second thought, I guess what you're suggesting would work,
as long as BinTree.traverser() returns a generator object (instead of
returning a list) and the for construct understands how to use generator
objects.

(I was still stuck in my original idea when I disagreed with you, where
I was thinking that BinTree.traverser() was an ordinary method that
required a keyword to create a generator object.  I now think that's a
Bad Idea and that BinTree.traverser() should be unusable as anything
other than the creator of generator objects, which requires a keyword
when defining BinTree.traverser().)

>Aahz Maruch <aahz at netcom.com> wrote in message
>news:88cg9r$10t$1 at nntp9.atl.mindspring.net...
>>
>> I would much rather create the generator frames explicitly as in the
>> following (I'm now assuming my later idea that a call to a generator
>> creates a generator frame that can be used like a function)
>>
>> b = BinTree()
>> g1 = b.traverser()
>> for node in g1():
>> 	g2 = b.traverser()
>> 	for node in g2():
>
>So g1 and g2 are generators, and g1() and g2() are 'generator frames', yes?

Not quite.  g1 and g2 are generator objects (aka "generator frames");
g1() and g2() are calls to the generator that either return a value or
raise an exception.

>So what is a 'generator frame'?  Perhaps that is what I'm not getting.

"Generator frame" is functionally equivalent to "generator object"; I
prefer to use "frame" in analogy with "stack frame" to make clear that
the object has a local namespace and program counter.  If nothing else,
generators will guarantee the demise of Python's "two namespace" rule.
(Sort of.  Each frame will still maintain the two namespace rule.)
--
                      --- Aahz (Copyright 2000 by aahz at netcom.com)

Androgynous poly kinky vanilla queer het    <*>     http://www.rahul.net/aahz/
Hugs and backrubs -- I break Rule 6

Our society has become so fractured that the pendulum is swinging
several different directions at the same time



More information about the Python-list mailing list