pep-0492: Mention PEP 3152.

This commit is contained in:
Yury Selivanov 2015-04-19 23:07:15 -04:00
parent 268a2226aa
commit ebbbbd4463
1 changed files with 51 additions and 1 deletions

View File

@ -61,7 +61,7 @@ are still based on generators.
It is strongly suggested that the reader understands how coroutines are
implemented in Python (PEP 342 and PEP 380). It is also recommended to read
PEP 3156 (asyncio framework).
PEP 3156 (asyncio framework) and PEP 3152 (Cofunctions).
From this point in this document we use the word *coroutine* to refer to
functions declared using the new syntax. *generator-based coroutine* is used
@ -659,6 +659,56 @@ The required changes are mainly:
Design Considerations
=====================
PEP 3152
--------
PEP 3152 by Gregory Ewing proposes a different mechanism for coroutines
(called "cofunctions"). Some key points:
1. A new keyword ``codef`` to declare a *cofunction*. *Cofunction* is always a
generator, even if there is no ``cocall`` expressions inside it. Maps to
``async def`` in this proposal.
2. A new keyword ``cocall`` to call a *cofunction*. Can only be used inside a
*cofunction*. Maps to ``await`` in this proposal (with some differences,
see below.)
3. It is not possible to call a *cofunction* without a ``cocall`` keyword.
4. ``cocall`` grammatically requires parentheses after it::
atom: cocall | <existing alternatives for atom>
cocall: 'cocall' atom cotrailer* '(' [arglist] ')'
cotrailer: '[' subscriptlist ']' | '.' NAME
5. ``cocall f(*args, **kwds)`` is semantically equivalent to
``yield from f.__cocall__(*args, **kwds)``.
Differences from this proposal:
1. There is no equivalent of ``__cocall__`` in this PEP, which is called and
its result is passed to ``yield from`` in the ``cocall`` expression.
``await`` keyword expects an *awaitable* object, validates the type, and
executes ``yield from`` on it. Although, ``__await__`` method is similar to
``__cocall__``, but is only used to define *Future-like* objects.
2. ``await`` is defined in the same way as ``yield`` in the grammar (it is
later enforced that ``await`` can only be inside ``async def``).
3. To make asyncio work with PEP 3152 it would be required to modify
``@asyncio.coroutine`` decorator to wrap all functions in an object with a
``__cocall__`` method. To call *cofunctions* from existing generator-based
coroutines it would be required to use ``costart`` built-in. In this
proposal ``@asyncio.coroutine`` simply sets ``CO_ASYNC`` on the wrapped
function's code object and everything works automatically.
4. Since it is impossible to call a *cofunction* without a ``cocall`` keyword,
it automatically prevents the common mistake of forgetting to use
``yield from`` on generator-based coroutines.
5. There are no equivalents of ``async for`` and ``async with`` in PEP 3152.
No implicit wrapping in Futures
-------------------------------