pep 492: Sync with the current implementation and new features.

This commit is contained in:
Yury Selivanov 2015-06-25 21:41:14 -04:00
parent f6601f6a7f
commit f03fd0ff7b
1 changed files with 32 additions and 17 deletions

View File

@ -117,8 +117,6 @@ Key properties of *coroutines*:
coroutines* compatible with *native coroutines* (set by coroutines* compatible with *native coroutines* (set by
`types.coroutine()`_ function). `types.coroutine()`_ function).
All coroutines have ``CO_GENERATOR`` flag set.
* Regular generators, when called, return a *generator object*; * Regular generators, when called, return a *generator object*;
similarly, coroutines return a *coroutine* object. similarly, coroutines return a *coroutine* object.
@ -135,7 +133,7 @@ Key properties of *coroutines*:
types.coroutine() types.coroutine()
----------------- -----------------
A new function ``coroutine(gen)`` is added to the ``types`` module. It A new function ``coroutine(fn)`` is added to the ``types`` module. It
allows interoperability between existing *generator-based coroutines* allows interoperability between existing *generator-based coroutines*
in asyncio and *native coroutines* introduced by this PEP:: in asyncio and *native coroutines* introduced by this PEP::
@ -147,8 +145,9 @@ in asyncio and *native coroutines* introduced by this PEP::
The function applies ``CO_ITERABLE_COROUTINE`` flag to generator- The function applies ``CO_ITERABLE_COROUTINE`` flag to generator-
function's code object, making it return a *coroutine* object. function's code object, making it return a *coroutine* object.
The function can be used as a decorator, since it modifies generator- If ``fn`` is not a *generator function*, it is wrapped. If it returns
functions in-place and returns them. a *generator*, it will be wrapped in an *awaitable* proxy object
(see below the definition of awaitable objects).
Note, that the ``CO_COROUTINE`` flag is not applied by Note, that the ``CO_COROUTINE`` flag is not applied by
``types.coroutine()`` to make it possible to separate *native ``types.coroutine()`` to make it possible to separate *native
@ -176,8 +175,8 @@ can be one of:
* A *native coroutine* object returned from a *native coroutine * A *native coroutine* object returned from a *native coroutine
function*. function*.
* A *generator-based coroutine* object returned from a *generator * A *generator-based coroutine* object returned from a function
function* decorated with ``types.coroutine()``. decorated with ``types.coroutine()``.
* An object with an ``__await__`` method returning an iterator. * An object with an ``__await__`` method returning an iterator.
@ -204,7 +203,7 @@ can be one of:
It is a ``TypeError`` if ``__await__`` returns anything but an It is a ``TypeError`` if ``__await__`` returns anything but an
iterator. iterator.
* Objects defined with CPython C API with a ``tp_as_async->am_await`` * Objects defined with CPython C API with a ``tp_as_async.am_await``
function, returning an *iterator* (similar to ``__await__`` method). function, returning an *iterator* (similar to ``__await__`` method).
It is a ``SyntaxError`` to use ``await`` outside of an ``async def`` It is a ``SyntaxError`` to use ``await`` outside of an ``async def``
@ -413,11 +412,13 @@ An *asynchronous iterable* is able to call asynchronous code in its
asynchronous code in its *next* method. To support asynchronous asynchronous code in its *next* method. To support asynchronous
iteration: iteration:
1. An object must implement an ``__aiter__`` method returning an 1. An object must implement an ``__aiter__`` method (or, if defined
with CPython C API, ``tp_as_async.am_aiter`` slot) returning an
*awaitable* resulting in an *asynchronous iterator object*. *awaitable* resulting in an *asynchronous iterator object*.
2. An *asynchronous iterator object* must implement an ``__anext__`` 2. An *asynchronous iterator object* must implement an ``__anext__``
method returning an *awaitable*. method (or, if defined with CPython C API, ``tp_as_async.am_anext``
slot) returning an *awaitable*.
3. To stop iteration ``__anext__`` must raise a ``StopAsyncIteration`` 3. To stop iteration ``__anext__`` must raise a ``StopAsyncIteration``
exception. exception.
@ -681,16 +682,24 @@ New Standard Library Functions
details. details.
* ``inspect.iscoroutine(obj)`` returns ``True`` if ``obj`` is a * ``inspect.iscoroutine(obj)`` returns ``True`` if ``obj`` is a
*coroutine* object. *native coroutine* object.
* ``inspect.iscoroutinefunction(obj)`` returns ``True`` if ``obj`` is a * ``inspect.iscoroutinefunction(obj)`` returns ``True`` if ``obj`` is a
*coroutine function*. *native coroutine function*.
* ``inspect.isawaitable(obj)`` returns ``True`` if ``obj`` can be used * ``inspect.isawaitable(obj)`` returns ``True`` if ``obj`` can be used
in ``await`` expression. See `Await Expression`_ for details. in ``await`` expression. See `Await Expression`_ for details.
* ``inspect.getcoroutinestate(coro)`` returns the current state of
a *native coroutine object* (mirrors
``inspect.getfgeneratorstate(gen)``).
* ``inspect.getcoroutinelocals(coro)`` returns the mapping of a
*native coroutine object's* local variables to their values
(mirrors ``inspect.getgeneratorlocals(gen)``).
* ``sys.set_coroutine_wrapper(wrapper)`` allows to intercept creation of * ``sys.set_coroutine_wrapper(wrapper)`` allows to intercept creation of
*coroutine* objects. ``wrapper`` must be either a callable that *native coroutine* objects. ``wrapper`` must be either a callable that
accepts one argument (a *coroutine* object), or ``None``. ``None`` accepts one argument (a *coroutine* object), or ``None``. ``None``
resets the wrapper. If called twice, the new wrapper replaces the resets the wrapper. If called twice, the new wrapper replaces the
previous one. The function is thread-specific. See `Debugging previous one. The function is thread-specific. See `Debugging
@ -1321,15 +1330,15 @@ List of high-level changes and new protocols
keyword. keyword.
2. New ``__await__`` method for Future-like objects, and new 2. New ``__await__`` method for Future-like objects, and new
``tp_as_async->am_await`` slot in ``PyTypeObject``. ``tp_as_async.am_await`` slot in ``PyTypeObject``.
3. New syntax for asynchronous context managers: ``async with``. And 3. New syntax for asynchronous context managers: ``async with``. And
associated protocol with ``__aenter__`` and ``__aexit__`` methods. associated protocol with ``__aenter__`` and ``__aexit__`` methods.
4. New syntax for asynchronous iteration: ``async for``. And 4. New syntax for asynchronous iteration: ``async for``. And
associated protocol with ``__aiter__``, ``__aexit__`` and new built- associated protocol with ``__aiter__``, ``__aexit__`` and new built-
in exception ``StopAsyncIteration``. New ``tp_as_async->am_aiter`` in exception ``StopAsyncIteration``. New ``tp_as_async.am_aiter``
and ``tp_as_async->am_anext`` slots in ``PyTypeObject``. and ``tp_as_async.am_anext`` slots in ``PyTypeObject``.
5. New AST nodes: ``AsyncFunctionDef``, ``AsyncFor``, ``AsyncWith``, 5. New AST nodes: ``AsyncFunctionDef``, ``AsyncFor``, ``AsyncWith``,
``Await``. ``Await``.
@ -1337,7 +1346,8 @@ List of high-level changes and new protocols
6. New functions: ``sys.set_coroutine_wrapper(callback)``, 6. New functions: ``sys.set_coroutine_wrapper(callback)``,
``sys.get_coroutine_wrapper()``, ``types.coroutine(gen)``, ``sys.get_coroutine_wrapper()``, ``types.coroutine(gen)``,
``inspect.iscoroutinefunction(func)``, ``inspect.iscoroutine(obj)``, ``inspect.iscoroutinefunction(func)``, ``inspect.iscoroutine(obj)``,
and ``inspect.isawaitable(obj)``. ``inspect.isawaitable(obj)``, ``inspect.getcoroutinestate(coro)``,
and ``inspect.getcoroutinelocals(coro)``.
7. New ``CO_COROUTINE`` and ``CO_ITERABLE_COROUTINE`` bit flags for code 7. New ``CO_COROUTINE`` and ``CO_ITERABLE_COROUTINE`` bit flags for code
objects. objects.
@ -1346,6 +1356,11 @@ List of high-level changes and new protocols
``collections.abc.Coroutine``, ``collections.abc.AsyncIterable``, and ``collections.abc.Coroutine``, ``collections.abc.AsyncIterable``, and
``collections.abc.AsyncIterator``. ``collections.abc.AsyncIterator``.
9. C API changes: new ``PyCoro_Type`` (exposed to Python as
``types.CoroutineType``) and ``PyCoroObject``.
``PyCoro_CheckExact(*o)`` to test if ``o`` is a *native coroutine*.
While the list of changes and new things is not short, it is important While the list of changes and new things is not short, it is important
to understand, that most users will not use these features directly. to understand, that most users will not use these features directly.
It is intended to be used in frameworks and libraries to provide users It is intended to be used in frameworks and libraries to provide users