[Python-ideas] Cofunctions - Back to Basics

Nick Coghlan ncoghlan at gmail.com
Thu Oct 27 04:53:47 CEST 2011

On Thu, Oct 27, 2011 at 12:09 PM, Greg Ewing
<greg.ewing at canterbury.ac.nz> wrote:
> So, I've gone right back to my initial idea. The current version
> of the draft PEP can be found here:
> http://www.cosc.canterbury.ac.nz/greg.ewing/python/generators/cd_current/cofunction-pep-rev5.txt

Certain objects that wrap other callable objects, notably bound methods,
will be given __cocall__ implementations that delegate to the underlying

That idea doesn't work when combined with the current idea in the PEP
for implicit cocall support inside cofunction definitions. Simple
method calls will see "Oh, this has __cocall__" and try to treat it
like a cofunction, when the underlying object is actually an ordinary

To make it work, you'll need some kind of explicit conversion API
(analogous to __iter__). Then, the expansion of calls in a cofunction
would look something like:

  _cofunc = obj.__cofunction__()
  if _cofunc is None:
    result = obj.__call__(*args, **kwds)
    result = yield from _cofunc(*args, **kwds)

However, you still potentially have some pretty serious ambiguity
problems - what happens inside an *actual* yield from clause? Or a for
loop iterator expression?


Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia

More information about the Python-ideas mailing list