Iterators & generators (RE: Real Problems with Python)

Aahz Maruch aahz at netcom.com
Sun Feb 13 21:22:09 EST 2000


In article <slrn8aeoh8.o7u.kc5tja at garnet.armored.net>,
Samuel A. Falvo II <kc5tja at garnet.armored.net> wrote:
>In article <000001bf768e$48e40580$45a0143f at tim>, Tim Peters wrote:
>>
>>class BinTree:
>>   # with members .left and .right of type BinTree (& None means none),
>>   # and .data of an arbitrary type
>>   ...
>>   def traverse_post(self):
>>       for child in self.left, self.right:
>>           if child is not None:
>>               suspend child.traverse_post()
>>       suspend self.data
>>
>>b = BinTree()
>>...
>>for leaf in b.traverse_post():
>>    process(leaf)
>
>I'm sorry, but I can't follow this code at all.  What are the precise
>semantics of suspend here?  How does it return?

suspend *is* a return.  It also -- at the same time -- stores the
program counter for b.traverse_post(), so that the next call to
b.traverse_post() starts at the line of execution immediately following
the suspend.  This means that, should someone be foolish enough to call
b.traverse_post() inside the loop "for leaf...", the loop will probably
return incorrect results, just like modifying a list while you iterate
over it.

Using suspend means that people no longer have to hack __getitem__() to
"do the right thing" for a class.  Doing this in a threaded environment
is dangerous, but no more so than dealing with any other class.
--
                      --- 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

Have you coined a word today?



More information about the Python-list mailing list