[Python-Dev] PEP 334 - Simple Coroutines via SuspendIteration
Clark C. Evans
cce at clarkevans.com
Wed Sep 8 15:26:03 CEST 2004
On Wed, Sep 08, 2004 at 09:07:59AM -0400, Jp Calderone wrote:
|
| def somefunc():
| raise SuspendIteration()
| return 'foo'
|
| def genfunc():
| yield somefunc()
Interesting, but:
- somefunc is a function, thus SuspendIteration() should
terminate the function; raising an exception
- somefunc is not a generator, so it cannot be yielded.
However, perhaps something like...
def suspend(*args,**kwargs):
raise SuspendIteration(*args,**kwargs)
# never ever returns
def myProducer():
yeild "one"
suspend()
yield "two"
Regardless, this is a side point. The authors of iterators that
raise a SuspendIterator() will be low-level code, like a next()
which reads the next block from a socket or row from a database
query. In these cases, the class style iterator is sufficient.
The real point, is that user-level generators, such as this example
from the PEP (which is detailed as a class-based iterator), should
transparently handle SuspendIteration() by passing it up the generator
chain without killing the current scope.
| def ListAlbums(cursor):
| cursor.execute("SELECT title, artist FROM album")
| yield '<html><body><table><tr><td>Title</td><td>Artist</td></tr>'
| for (title, artist) in cursor:
| yield '<tr><td>%s</td><td>%s</td></tr>' % (title, artist)
| yield '</table></body></html>'
For those who say that this iterator should be invalidated when
cursor.next() raises SuspendIteration(), I point out that it is not
invalided when cursor.next() raises StopIteration().
Kind Regards,
Clark
--
Clark C. Evans Prometheus Research, LLC.
http://www.prometheusresearch.com/
o office: +1.203.777.2550
~/ , mobile: +1.203.444.0557
//
(( Prometheus Research: Transforming Data Into Knowledge
\\ ,
\/ - Research Exchange Database
/\ - Survey & Assessment Technologies
` \ - Software Tools for Researchers
~ *
More information about the Python-Dev
mailing list