[Python-checkins] peps: pep-0492: Mention PEP 3152.
yury.selivanov
python-checkins at python.org
Mon Apr 20 05:07:34 CEST 2015
https://hg.python.org/peps/rev/428c7c753500
changeset: 5775:428c7c753500
user: Yury Selivanov <yselivanov at sprymix.com>
date: Sun Apr 19 23:07:15 2015 -0400
summary:
pep-0492: Mention PEP 3152.
files:
pep-0492.txt | 52 +++++++++++++++++++++++++++++++++++++++-
1 files changed, 51 insertions(+), 1 deletions(-)
diff --git a/pep-0492.txt b/pep-0492.txt
--- a/pep-0492.txt
+++ b/pep-0492.txt
@@ -61,7 +61,7 @@
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 @@
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
-------------------------------
--
Repository URL: https://hg.python.org/peps
More information about the Python-checkins
mailing list