[Python-Dev] Generator enhancements patch available
Phillip J. Eby
pje at telecommunity.com
Sun Jun 19 01:16:25 CEST 2005
I've just submitted patch 1223381 (http://python.org/sf/1223381), which
implements code and test changes for:
* yield expressions
* bare yield (short for yield None)
* yield in try/finally
* generator.send(value) (send value into generator; substituted for PEP
342's next(arg))
* generator.throw(typ[,val[,tb]]) (raise error in generator)
* generator.close()
* GeneratorExit built-in exception type
* generator.__del__ (well, the C equivalent)
* All necessary mods to the compiler, parser module, and Python 'compiler'
package to support these changes.
It was necessary to change a small part of the eval loop (well, the
initialization, not the loop) and the gc module's has_finalizer() logic in
order to support a C equivalent to __del__. Specialists in these areas
should probably scrutinize this patch!
There is one additional implementation detail that was not contemplated in
either PEP. in order to prevent used-up generators from retaining
unnecessary references to their frame's contents, I set the generator's
gi_frame member to None whenever the generator finishes normally or with an
error. Thus, an exhausted generator cannot be part of a cycle, and it
releases its frame object sooner than in previous Python versions. For
generators used only in a direct "for" loop, this makes no difference, but
for generators used with the iterator protocol (i.e. "gen.next()") from
Python, this avoids stranding the generator's frame in a traceback cycle.
Anyway, your comments/questions/feedback/bug reports are welcome.
More information about the Python-Dev
mailing list