From 66f8828bfce4a05cb5e27ed89bba46cdfc64f995 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Wed, 24 Jun 2015 11:04:15 -0400 Subject: [PATCH] Issue #24439: Improve PEP 492 related docs. Patch by Martin Panter. --- Doc/glossary.rst | 21 ++++---- Doc/library/asyncio-task.rst | 88 +++++++++++++++++++------------ Doc/library/collections.abc.rst | 19 +++---- Doc/library/dis.rst | 8 +-- Doc/library/exceptions.rst | 6 ++- Doc/library/sys.rst | 5 +- Doc/library/tulip_coro.png | Bin 45565 -> 45021 bytes Doc/library/types.rst | 20 ++++--- Doc/reference/compound_stmts.rst | 25 +++++---- Doc/reference/datamodel.rst | 73 +++++++++++++++++++++---- Doc/reference/expressions.rst | 1 + Objects/genobject.c | 10 ++-- 12 files changed, 185 insertions(+), 91 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index bdbb272051d..d00185e386f 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -169,18 +169,19 @@ Glossary statement by defining :meth:`__enter__` and :meth:`__exit__` methods. See :pep:`343`. - coroutine function - A function which returns a :term:`coroutine` object. It is defined - with an :keyword:`async def` keyword, and may contain :keyword:`await`, - :keyword:`async for`, and :keyword:`async with` keywords. Introduced - by :pep:`492`. - coroutine Coroutines is a more generalized form of subroutines. Subroutines are - entered at one point and exited at another point. Coroutines, can be - entered, exited, and resumed at many different points. See - :keyword:`await` expressions, and :keyword:`async for` and - :keyword:`async with` statements. See also :pep:`492`. + entered at one point and exited at another point. Coroutines can be + entered, exited, and resumed at many different points. They can be + implemented with the :keyword:`async def` statement. See also + :pep:`492`. + + coroutine function + A function which returns a :term:`coroutine` object. A coroutine + function may be defined with the :keyword:`async def` statement, + and may contain :keyword:`await`, :keyword:`async for`, and + :keyword:`async with` keywords. These were introduced + by :pep:`492`. CPython The canonical implementation of the Python programming language, as diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index e7ff7d2e2d4..fa9e96a3dc6 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -8,17 +8,23 @@ Tasks and coroutines Coroutines ---------- -A coroutine is a generator that follows certain conventions. For -documentation purposes, all coroutines should be decorated with -``@asyncio.coroutine``, but this cannot be strictly enforced. +Coroutines used with :mod:`asyncio` may be implemented using the +:keyword:`async def` statement, or by using :term:`generators `. +The :keyword:`async def` type of coroutine was added in Python 3.5, and +is recommended if there is no need to support older Python versions. -Coroutines use the ``yield from`` syntax introduced in :pep:`380`, +Generator-based coroutines should be decorated with :func:`@asyncio.coroutine +`, although this is not strictly enforced. +The decorator enables compatibility with :keyword:`async def` coroutines, +and also serves as documentation. Generator-based +coroutines use the ``yield from`` syntax introduced in :pep:`380`, instead of the original ``yield`` syntax. The word "coroutine", like the word "generator", is used for two different (though related) concepts: -- The function that defines a coroutine (a function definition +- The function that defines a coroutine + (a function definition using :keyword:`async def` or decorated with ``@asyncio.coroutine``). If disambiguation is needed we will call this a *coroutine function* (:func:`iscoroutinefunction` returns ``True``). @@ -30,27 +36,28 @@ different (though related) concepts: Things a coroutine can do: -- ``result = yield from future`` -- suspends the coroutine until the +- ``result = await future`` or ``result = yield from future`` -- + suspends the coroutine until the future is done, then returns the future's result, or raises an exception, which will be propagated. (If the future is cancelled, it will raise a ``CancelledError`` exception.) Note that tasks are futures, and everything said about futures also applies to tasks. -- ``result = yield from coroutine`` -- wait for another coroutine to +- ``result = await coroutine`` or ``result = yield from coroutine`` -- + wait for another coroutine to produce a result (or raise an exception, which will be propagated). The ``coroutine`` expression must be a *call* to another coroutine. - ``return expression`` -- produce a result to the coroutine that is - waiting for this one using ``yield from``. + waiting for this one using :keyword:`await` or ``yield from``. - ``raise exception`` -- raise an exception in the coroutine that is - waiting for this one using ``yield from``. + waiting for this one using :keyword:`await` or ``yield from``. -Calling a coroutine does not start its code running -- it is just a -generator, and the coroutine object returned by the call is really a -generator object, which doesn't do anything until you iterate over it. -In the case of a coroutine object, there are two basic ways to start -it running: call ``yield from coroutine`` from another coroutine +Calling a coroutine does not start its code running -- +the coroutine object returned by the call doesn't do anything until you +schedule its execution. There are two basic ways to start it running: +call ``await coroutine`` or ``yield from coroutine`` from another coroutine (assuming the other coroutine is already running!), or schedule its execution using the :func:`async` function or the :meth:`BaseEventLoop.create_task` method. @@ -60,9 +67,15 @@ Coroutines (and tasks) can only run when the event loop is running. .. decorator:: coroutine - Decorator to mark coroutines. + Decorator to mark generator-based coroutines. This enables + the generator use :keyword:`!yield from` to call :keyword:`async + def` coroutines, and also enables the generator to be called by + :keyword:`async def` coroutines, for instance using an + :keyword:`await` expression. - If the coroutine is not yielded from before it is destroyed, an error + There is no need to decorate :keyword:`async def` coroutines themselves. + + If the generator is not yielded from before it is destroyed, an error message is logged. See :ref:`Detect coroutines never scheduled `. @@ -84,8 +97,7 @@ Example of coroutine displaying ``"Hello World"``:: import asyncio - @asyncio.coroutine - def hello_world(): + async def hello_world(): print("Hello World!") loop = asyncio.get_event_loop() @@ -111,6 +123,21 @@ using the :meth:`sleep` function:: import asyncio import datetime + async def display_date(loop): + end_time = loop.time() + 5.0 + while True: + print(datetime.datetime.now()) + if (loop.time() + 1.0) >= end_time: + break + await asyncio.sleep(1) + + loop = asyncio.get_event_loop() + # Blocking call which returns when the display_date() coroutine is done + loop.run_until_complete(display_date(loop)) + loop.close() + +The same coroutine implemented using a generator:: + @asyncio.coroutine def display_date(loop): end_time = loop.time() + 5.0 @@ -120,11 +147,6 @@ using the :meth:`sleep` function:: break yield from asyncio.sleep(1) - loop = asyncio.get_event_loop() - # Blocking call which returns when the display_date() coroutine is done - loop.run_until_complete(display_date(loop)) - loop.close() - .. seealso:: The :ref:`display the current date with call_later() @@ -139,15 +161,13 @@ Example chaining coroutines:: import asyncio - @asyncio.coroutine - def compute(x, y): + async def compute(x, y): print("Compute %s + %s ..." % (x, y)) - yield from asyncio.sleep(1.0) + await asyncio.sleep(1.0) return x + y - @asyncio.coroutine - def print_sum(x, y): - result = yield from compute(x, y) + async def print_sum(x, y): + result = await compute(x, y) print("%s + %s = %s" % (x, y, result)) loop = asyncio.get_event_loop() @@ -550,12 +570,14 @@ Task functions .. function:: iscoroutine(obj) - Return ``True`` if *obj* is a :ref:`coroutine object `. + Return ``True`` if *obj* is a :ref:`coroutine object `, + which may be based on a generator or an :keyword:`async def` coroutine. -.. function:: iscoroutinefunction(obj) +.. function:: iscoroutinefunction(func) - Return ``True`` if *func* is a decorated :ref:`coroutine function - `. + Return ``True`` if *func* is determined to be a :ref:`coroutine function + `, which may be a decorated generator function or an + :keyword:`async def` function. .. coroutinefunction:: sleep(delay, result=None, \*, loop=None) diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst index 8c710ef3807..0653d4e35c8 100644 --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -154,21 +154,22 @@ ABC Inherits from Abstract Methods Mixin .. class:: Awaitable - ABC for classes that provide ``__await__`` method. Instances - of such classes can be used in ``await`` expression. + ABC for :term:`awaitable` objects, which can be used in :keyword:`await` + expressions. Custom implementations must provide the :meth:`__await__` + method. - :term:`coroutine` objects and instances of - :class:`~collections.abc.Coroutine` are too instances of this ABC. + :term:`Coroutine` objects and instances of the + :class:`~collections.abc.Coroutine` ABC are all instances of this ABC. .. versionadded:: 3.5 .. class:: Coroutine - ABC for coroutine compatible classes that implement a subset of - generator methods defined in :pep:`342`, namely: - :meth:`~generator.send`, :meth:`~generator.throw`, - :meth:`~generator.close` methods. :meth:`__await__` must also be - implemented. All :class:`Coroutine` instances are also instances of + ABC for coroutine compatible classes. These implement the + following methods, defined in :ref:`coroutine-objects`: + :meth:`~coroutine.send`, :meth:`~coroutine.throw`, and + :meth:`~coroutine.close`. Custom implementations must also implement + :meth:`__await__`. All :class:`Coroutine` instances are also instances of :class:`Awaitable`. See also the definition of :term:`coroutine`. .. versionadded:: 3.5 diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 836c4c1ef7c..7a214edcc78 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -516,12 +516,14 @@ the original TOS1. Implements ``del TOS1[TOS]``. -**Coroutines opcodes** +**Coroutine opcodes** .. opcode:: GET_AWAITABLE - Implements ``TOS = get_awaitable(TOS)``; where ``get_awaitable(o)`` - returns ``o`` if ``o`` is a coroutine object; or resolved ``o.__await__``. + Implements ``TOS = get_awaitable(TOS)``, where ``get_awaitable(o)`` + returns ``o`` if ``o`` is a coroutine object or a generator object with + the CO_ITERABLE_COROUTINE flag, or resolves + ``o.__await__``. .. opcode:: GET_AITER diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index 2209f167ea3..1a9d0299d5f 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -162,7 +162,8 @@ The following exceptions are the exceptions that are usually raised. .. exception:: GeneratorExit - Raised when a :term:`generator`\'s :meth:`close` method is called. It + Raised when a :term:`generator` or :term:`coroutine` is closed; + see :meth:`generator.close` and :meth:`coroutine.close`. It directly inherits from :exc:`BaseException` instead of :exc:`Exception` since it is technically not an error. @@ -306,7 +307,8 @@ The following exceptions are the exceptions that are usually raised. given as an argument when constructing the exception, and defaults to :const:`None`. - When a generator function returns, a new :exc:`StopIteration` instance is + When a :term:`generator` or :term:`coroutine` function + returns, a new :exc:`StopIteration` instance is raised, and the value returned by the function is used as the :attr:`value` parameter to the constructor of the exception. diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 144c986ab19..545e6742c13 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1080,7 +1080,7 @@ always available. :func:`types.coroutine` or :func:`asyncio.coroutine` will not be intercepted). - *wrapper* must be either: + The *wrapper* argument must be either: * a callable that accepts one argument (a coroutine object); * ``None``, to reset the wrapper. @@ -1096,7 +1096,8 @@ always available. return wrap(coro) sys.set_coroutine_wrapper(wrapper) - async def foo(): pass + async def foo(): + pass # The following line will fail with a RuntimeError, because # `wrapper` creates a `wrap(coro)` coroutine: diff --git a/Doc/library/tulip_coro.png b/Doc/library/tulip_coro.png index 65b6951550e1e5313bdfad671ff6fd5538f24f1a..36ced8ddbfd91da7ac5cc1cba217c1ab185f9f05 100644 GIT binary patch literal 45021 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 literal 45565 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 y159*Pdiojb= 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 U)a!Zs8-r4K{9GpF diff --git a/Doc/library/types.rst b/Doc/library/types.rst index d7b14e7a3d9..ff75de1ef55 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -281,15 +281,23 @@ Additional Utility Classes and Functions .. versionadded:: 3.4 -Coroutines Utility Functions ----------------------------- +Coroutine Utility Functions +--------------------------- .. function:: coroutine(gen_func) - The function transforms a generator function to a :term:`coroutine function`, - so that it returns a :term:`coroutine` object. + This function transforms a :term:`generator` function into a + :term:`coroutine function` which returns a generator-based coroutine. + The generator-based coroutine is still a :term:`generator iterator`, + but is also considered to be a :term:`coroutine` object and is + :term:`awaitable`. However, it may not necessarily implement + the :meth:`__await__` method. - *gen_func* is modified in-place, hence the function can be used as a - decorator. + If *gen_func* is a generator function, it will be modified in-place. + + If *gen_func* is not a generator function, it will be wrapped. If it + returns an instance of :class:`collections.abc.Generator`, the instance + will be wrapped in an *awaitable* proxy object. All other types + of objects will be returned as is. .. versionadded:: 3.5 diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index c73e8862a64..76b3850543a 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -666,15 +666,9 @@ can be used to create instance variables with different implementation details. Coroutines ========== -.. index:: - statement: async def - statement: async for - statement: async with - keyword: async - keyword: await - .. versionadded:: 3.5 +.. index:: statement: async def .. _`async def`: Coroutine function definition @@ -683,14 +677,23 @@ Coroutine function definition .. productionlist:: async_funcdef: "async" `funcdef` +.. index:: + keyword: async + keyword: await + Execution of Python coroutines can be suspended and resumed at many points -(see :term:`coroutine`.) :keyword:`await` expressions, :keyword:`async for` -and :keyword:`async with` can only be used in their bodies. +(see :term:`coroutine`). In the body of a coroutine, any ``await`` and +``async`` identifiers become reserved keywords; :keyword:`await` expressions, +:keyword:`async for` and :keyword:`async with` can only be used in +coroutine bodies. However, to simplify the parser, these keywords cannot +be used on the same line as a function or coroutine (:keyword:`def` +statement) header. Functions defined with ``async def`` syntax are always coroutine functions, even if they do not contain ``await`` or ``async`` keywords. -It is a :exc:`SyntaxError` to use :keyword:`yield` expressions in coroutines. +It is a :exc:`SyntaxError` to use :keyword:`yield` expressions in +``async def`` coroutines. An example of a coroutine function:: @@ -699,6 +702,7 @@ An example of a coroutine function:: await some_coroutine() +.. index:: statement: async for .. _`async for`: The :keyword:`async for` statement @@ -742,6 +746,7 @@ It is a :exc:`SyntaxError` to use ``async for`` statement outside of an :keyword:`async def` function. +.. index:: statement: async with .. _`async with`: The :keyword:`async with` statement diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 508b4b519cd..2ca1194c5ee 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -624,7 +624,7 @@ Callable types a :dfn:`coroutine function`. Such a function, when called, returns a :term:`coroutine` object. It may contain :keyword:`await` expressions, as well as :keyword:`async with` and :keyword:`async for` statements. See - also :ref:`coroutines` section. + also the :ref:`coroutine-objects` section. Built-in functions .. index:: @@ -2264,26 +2264,25 @@ special methods (the special method *must* be set on the class object itself in order to be consistently invoked by the interpreter). -.. _coroutines: +.. index:: + single: coroutine Coroutines ========== -.. index:: - single: coroutine - Awaitable Objects ----------------- -An *awaitable* object can be one of the following: +An :term:`awaitable` object generally implements an :meth:`__await__` method. +:term:`Coroutine` objects returned from :keyword:`async def` functions +are awaitable. -* A :term:`coroutine` object returned from a :term:`coroutine function`. +.. note:: -* A :term:`generator` decorated with :func:`types.coroutine` - (or :func:`asyncio.coroutine`) decorator. - -* An object that implements an ``__await__`` method. + The :term:`generator iterator` objects returned from generators + decorated with :func:`types.coroutine` or :func:`asyncio.coroutine` + are also awaitable, but they do not implement :meth:`__await__`. .. method:: object.__await__(self) @@ -2296,6 +2295,58 @@ An *awaitable* object can be one of the following: .. seealso:: :pep:`492` for additional information about awaitable objects. +.. _coroutine-objects: + +Coroutine Objects +----------------- + +:term:`Coroutine` objects are :term:`awaitable` objects. +A coroutine's execution can be controlled by calling :meth:`__await__` and +iterating over the result. When the coroutine has finished executing and +returns, the iterator raises :exc:`StopIteration`, and the exception's +:attr:`~StopIteration.value` attribute holds the return value. If the +coroutine raises an exception, it is propagated by the iterator. Coroutines +should not directly raise unhandled :exc:`StopIteration` exceptions. + +Coroutines also have the methods listed below, which are analogous to +those of generators (see :ref:`generator-methods`). However, unlike +generators, coroutines do not directly support iteration. + +.. method:: coroutine.send(value) + + Starts or resumes execution of the coroutine. If *value* is ``None``, + this is equivalent to advancing the iterator returned by + :meth:`__await__`. If *value* is not ``None``, this method delegates + to the :meth:`~generator.send` method of the iterator that caused + the coroutine to suspend. The result (return value, + :exc:`StopIteration`, or other exception) is the same as when + iterating over the :meth:`__await__` return value, described above. + +.. method:: coroutine.throw(type[, value[, traceback]]) + + Raises the specified exception in the coroutine. This method delegates + to the :meth:`~generator.throw` method of the iterator that caused + the coroutine to suspend, if it has such a method. Otherwise, + the exception is raised at the suspension point. The result + (return value, :exc:`StopIteration`, or other exception) is the same as + when iterating over the :meth:`__await__` return value, described + above. If the exception is not caught in the coroutine, it propagates + back to the caller. + +.. method:: coroutine.close() + + Causes the coroutine to clean itself up and exit. If the coroutine + is suspended, this method first delegates to the :meth:`~generator.close` + method of the iterator that caused the coroutine to suspend, if it + has such a method. Then it raises :exc:`GeneratorExit` at the + suspension point, causing the coroutine to immediately clean itself up. + Finally, the coroutine is marked as having finished executing, even if + it was never started. + + Coroutine objects are automatically closed using the above process when + they are about to be destroyed. + + Asynchronous Iterators ---------------------- diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 9d3fdf26fc0..d3face7f6a7 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -390,6 +390,7 @@ on the right hand side of an assignment statement. to sub-generators easy. .. index:: object: generator +.. _generator-methods: Generator-iterator methods ^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Objects/genobject.c b/Objects/genobject.c index 40340b48742..3311c4e0e75 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -793,11 +793,11 @@ static PyMemberDef coro_memberlist[] = { PyDoc_STRVAR(coro_send_doc, "send(arg) -> send 'arg' into coroutine,\n\ -return next yielded value or raise StopIteration."); +return next iterated value or raise StopIteration."); PyDoc_STRVAR(coro_throw_doc, "throw(typ[,val[,tb]]) -> raise exception in coroutine,\n\ -return next yielded value or raise StopIteration."); +return next iterated value or raise StopIteration."); PyDoc_STRVAR(coro_close_doc, "close() -> raise GeneratorExit inside coroutine."); @@ -908,9 +908,9 @@ coro_wrapper_traverse(PyCoroWrapper *cw, visitproc visit, void *arg) } static PyMethodDef coro_wrapper_methods[] = { - {"send",(PyCFunction)coro_wrapper_send, METH_O, send_doc}, - {"throw",(PyCFunction)coro_wrapper_throw, METH_VARARGS, throw_doc}, - {"close",(PyCFunction)coro_wrapper_close, METH_NOARGS, close_doc}, + {"send",(PyCFunction)coro_wrapper_send, METH_O, coro_send_doc}, + {"throw",(PyCFunction)coro_wrapper_throw, METH_VARARGS, coro_throw_doc}, + {"close",(PyCFunction)coro_wrapper_close, METH_NOARGS, coro_close_doc}, {NULL, NULL} /* Sentinel */ };