mirror of
https://github.com/python/cpython.git
synced 2025-11-01 18:51:43 +00:00
Issue 24180: Documentation for PEP 492 changes.
This commit is contained in:
parent
548de2b210
commit
f3e40fac10
11 changed files with 483 additions and 8 deletions
|
|
@ -51,6 +51,9 @@ Summarizing:
|
|||
: | `with_stmt`
|
||||
: | `funcdef`
|
||||
: | `classdef`
|
||||
: | `async_with_stmt`
|
||||
: | `async_for_stmt`
|
||||
: | `async_funcdef`
|
||||
suite: `stmt_list` NEWLINE | NEWLINE INDENT `statement`+ DEDENT
|
||||
statement: `stmt_list` NEWLINE | `compound_stmt`
|
||||
stmt_list: `simple_stmt` (";" `simple_stmt`)* [";"]
|
||||
|
|
@ -660,6 +663,112 @@ can be used to create instance variables with different implementation details.
|
|||
:pep:`3129` - Class Decorators
|
||||
|
||||
|
||||
Coroutines
|
||||
==========
|
||||
|
||||
.. _`async def`:
|
||||
|
||||
Coroutine function definition
|
||||
-----------------------------
|
||||
|
||||
.. productionlist::
|
||||
async_funcdef: "async" `funcdef`
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
|
||||
.. _`async for`:
|
||||
|
||||
The :keyword:`async for` statement
|
||||
----------------------------------
|
||||
|
||||
.. productionlist::
|
||||
async_for_stmt: "async" `for_stmt`
|
||||
|
||||
An :term:`asynchronous iterable` is able to call asynchronous code in its
|
||||
*iter* implementation, and :term:`asynchronous iterator` can call asynchronous
|
||||
code in its *next* method.
|
||||
|
||||
The ``async for`` statement allows convenient iteration over asynchronous
|
||||
iterators.
|
||||
|
||||
The following code::
|
||||
|
||||
async for TARGET in ITER:
|
||||
BLOCK
|
||||
else:
|
||||
BLOCK2
|
||||
|
||||
Is semantically equivalent to::
|
||||
|
||||
iter = (ITER)
|
||||
iter = await type(iter).__aiter__(iter)
|
||||
running = True
|
||||
while running:
|
||||
try:
|
||||
TARGET = await type(iter).__anext__(iter)
|
||||
except StopAsyncIteration:
|
||||
running = False
|
||||
else:
|
||||
BLOCK
|
||||
else:
|
||||
BLOCK2
|
||||
|
||||
See also :meth:`__aiter__` and :meth:`__anext__` for details.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
|
||||
.. _`async with`:
|
||||
|
||||
The :keyword:`async with` statement
|
||||
-----------------------------------
|
||||
|
||||
.. productionlist::
|
||||
async_with_stmt: "async" `with_stmt`
|
||||
|
||||
An :term:`asynchronous context manager` is a :term:`context manager` that is
|
||||
able to suspend execution in its *enter* and *exit* methods.
|
||||
|
||||
The following code::
|
||||
|
||||
async with EXPR as VAR:
|
||||
BLOCK
|
||||
|
||||
Is semantically equivalent to::
|
||||
|
||||
mgr = (EXPR)
|
||||
aexit = type(mgr).__aexit__
|
||||
aenter = type(mgr).__aenter__(mgr)
|
||||
exc = True
|
||||
|
||||
VAR = await aenter
|
||||
try:
|
||||
BLOCK
|
||||
except:
|
||||
if not await aexit(mgr, *sys.exc_info()):
|
||||
raise
|
||||
else:
|
||||
await aexit(mgr, None, None, None)
|
||||
|
||||
See also :meth:`__aenter__` and :meth:`__aexit__` for details.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
.. seealso::
|
||||
|
||||
:pep:`492` - Coroutines with async and await syntax
|
||||
|
||||
|
||||
.. rubric:: Footnotes
|
||||
|
||||
.. [#] The exception is propagated to the invocation stack unless
|
||||
|
|
|
|||
|
|
@ -616,6 +616,16 @@ Callable types
|
|||
exception is raised and the iterator will have reached the end of the set of
|
||||
values to be returned.
|
||||
|
||||
Coroutine functions
|
||||
.. index::
|
||||
single: coroutine; function
|
||||
|
||||
A function or method which is defined using :keyword:`async def` is called
|
||||
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.
|
||||
|
||||
Built-in functions
|
||||
.. index::
|
||||
object: built-in function
|
||||
|
|
@ -2254,6 +2264,104 @@ special methods (the special method *must* be set on the class
|
|||
object itself in order to be consistently invoked by the interpreter).
|
||||
|
||||
|
||||
.. _coroutines:
|
||||
|
||||
Coroutines
|
||||
==========
|
||||
|
||||
.. index::
|
||||
single: coroutine
|
||||
|
||||
|
||||
Awaitable Objects
|
||||
-----------------
|
||||
|
||||
An *awaitable* object can be one of the following:
|
||||
|
||||
* A :term:`coroutine` object returned from a :term:`coroutine function`.
|
||||
|
||||
* A :term:`generator` decorated with :func:`types.coroutine`
|
||||
(or :func:`asyncio.coroutine`) decorator.
|
||||
|
||||
* An object that implements an ``__await__`` method.
|
||||
|
||||
.. method:: object.__await__(self)
|
||||
|
||||
Must return an :term:`iterator`. Should be used to implement
|
||||
:term:`awaitable` objects. For instance, :class:`asyncio.Future` implements
|
||||
this method to be compatible with the :keyword:`await` expression.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
.. seealso:: :pep:`492` for additional information about awaitable objects.
|
||||
|
||||
|
||||
Asynchronous Iterators
|
||||
----------------------
|
||||
|
||||
An *asynchronous iterable* is able to call asynchronous code in its
|
||||
``__aiter__`` implementation, and an *asynchronous iterator* can call
|
||||
asynchronous code in its ``__anext__`` method.
|
||||
|
||||
Asynchronous iterators can be used in a :keyword:`async for` statement.
|
||||
|
||||
.. method:: object.__aiter__(self)
|
||||
|
||||
Must return an *awaitable* resulting in an *asynchronous iterator* object.
|
||||
|
||||
.. method:: object.__anext__(self)
|
||||
|
||||
Must return an *awaitable* resulting in a next value of the iterator. Should
|
||||
raise a :exc:`StopAsyncIteration` error when the iteration is over.
|
||||
|
||||
An example of an asynchronous iterable object::
|
||||
|
||||
class Reader:
|
||||
async def readline(self):
|
||||
...
|
||||
|
||||
async def __aiter__(self):
|
||||
return self
|
||||
|
||||
async def __anext__(self):
|
||||
val = await self.readline()
|
||||
if val == b'':
|
||||
raise StopAsyncIteration
|
||||
return val
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
|
||||
Asynchronous Context Managers
|
||||
-----------------------------
|
||||
|
||||
An *asynchronous context manager* is a *context manager* that is able to
|
||||
suspend execution in its ``__aenter__`` and ``__aexit__`` methods.
|
||||
|
||||
Asynchronous context managers can be used in a :keyword:`async with` statement.
|
||||
|
||||
.. method:: object.__aenter__(self)
|
||||
|
||||
This method is semantically similar to the :meth:`__enter__`, with only
|
||||
difference that it must return an *awaitable*.
|
||||
|
||||
.. method:: object.__aexit__(self, exc_type, exc_value, traceback)
|
||||
|
||||
This method is semantically similar to the :meth:`__exit__`, with only
|
||||
difference that it must return an *awaitable*.
|
||||
|
||||
An example of an asynchronous context manager class::
|
||||
|
||||
class AsyncContextManager:
|
||||
async def __aenter__(self):
|
||||
await log('entering context')
|
||||
|
||||
async def __aexit__(self, exc_type, exc, tb):
|
||||
await log('exiting context')
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
|
||||
.. rubric:: Footnotes
|
||||
|
||||
.. [#] It *is* possible in some cases to change an object's type, under certain
|
||||
|
|
|
|||
|
|
@ -811,6 +811,20 @@ a class instance:
|
|||
if that method was called.
|
||||
|
||||
|
||||
.. _await:
|
||||
|
||||
Await expression
|
||||
================
|
||||
|
||||
Suspend the execution of :term:`coroutine` on an :term:`awaitable` object.
|
||||
Can only be used inside a :term:`coroutine function`.
|
||||
|
||||
.. productionlist::
|
||||
await: ["await"] `primary`
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
|
||||
.. _power:
|
||||
|
||||
The power operator
|
||||
|
|
@ -820,7 +834,7 @@ The power operator binds more tightly than unary operators on its left; it binds
|
|||
less tightly than unary operators on its right. The syntax is:
|
||||
|
||||
.. productionlist::
|
||||
power: `primary` ["**" `u_expr`]
|
||||
power: `await` ["**" `u_expr`]
|
||||
|
||||
Thus, in an unparenthesized sequence of power and unary operators, the operators
|
||||
are evaluated from right to left (this does not constrain the evaluation order
|
||||
|
|
@ -1362,6 +1376,8 @@ precedence and have a left-to-right chaining feature as described in the
|
|||
+-----------------------------------------------+-------------------------------------+
|
||||
| ``**`` | Exponentiation [#]_ |
|
||||
+-----------------------------------------------+-------------------------------------+
|
||||
| ``await`` ``x`` | Await expression |
|
||||
+-----------------------------------------------+-------------------------------------+
|
||||
| ``x[index]``, ``x[index:index]``, | Subscription, slicing, |
|
||||
| ``x(arguments...)``, ``x.attribute`` | call, attribute reference |
|
||||
+-----------------------------------------------+-------------------------------------+
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue