mirror of
https://github.com/python/cpython.git
synced 2026-06-28 13:50:17 -04:00
1c2daa08fb
gh-150319: Replace all documentation which says "See PEP 585" (GH-150325)
* Replace all documentation which says "See PEP 585"
The following classes in the stdlib get simple updates:
- array.array
- asyncio.Future
- asyncio.Task
- collections.defaultdict
- collections.deque
- contextvars.ContextVar
- contextvars.Token
- ctypes.Array
- os.DirEntry
- re.Match
- re.Pattern
- string.templatelib.Interpolation
- string.templatelib.Template
- types.MappingProxyType
- queue.SimpleQueue
- weakref.ref
The following classes are documented publicly as functions, and are
therefore updated internally (`__class_getitem__.__doc__`) but not in the
public docs:
- functools.partial
- itertools.chain
The following builtin types have updates to `__class_getitem__.__doc__`
but not to any documentation pages:
- BaseExceptionGroup
- coroutines (from generators)
- dict
- enumerate
- frozendict
- frozenset
- generators (and async generators)
- list
- memoryview
- set
- slice
- tuple
Special cases:
- union objects are now documented as "supporting class-level []",
rather than anything to do with generics.
- Templates might be generic over a single type (union, in theory) or
over a TypeVarTuple. As this is not currently fully settled, it is
marked with a comment and a mild hint that it is a single type is used
(namely, "type" is singular rather than "types", plural)
* Apply suggestions from code review
* Correct several class getitem docs
And expand the text for tuples.
* Add notes on generic typing of builtins
* Fix typo in tuple.__class_getitem__ docstring
* Typo fix: malformed refs
Fix `generic` links which weren't marked as `:ref:`.
* Strike unnecessary docs on generic-ness
* Apply suggestions from code review
These are applied at both the originally indicated locations and in the
corresponding docstring definitions.
* Update Doc/library/re.rst
* Update Objects/enumobject.c
* Remove tuple generic doc in 'stdtypes' page
This is covered in more detail in the cross-linked typing documentation.
The other copy of this documentation -- in the docstring for
`tuple.__class_getitem__` -- is left in place.
* Fix whitespace around new doc of generics
Per review, do not introduce or remove whitespace such that section
breaks are altered by the introduction of doc on various generic types.
In most cases, this is a removal of an extra line.
In one case (Arrays), it is the reintroduction of a line.
Additionally, two other minor fixes are included:
- incorrect indent on 'defaultdicts'
- make `mappingproxy.__class_getitem__.__doc__` consistent with other
mapping type generic docs
* Move placement of memoryview generic note
Previous placement was at the end of the main docstring, which is
consistent with other types but places it after a section on various
methods (which makes it read somewhat inconsistently). Moving it up
helps resolve.
* Ensure sphinxdoc does not start sentences lowercase
Lowercase class names at the start of sentences are marked out with the
`class` role. In the case of `deque`, documentation already refers to
these as `Deques`, so this form is preferred.
* Apply suggestions from code review
* Fix line endings and wrap more tightly
Line endings fixed by pre-commit ; also re-wrapped the MappingProxyType
text which was too long.
* Use 'ContextVars' style in sphinx doc
---------
(cherry picked from commit 50fe49c879)
Co-authored-by: Stephen Rosen <sirosen@globus.org>
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
Co-authored-by: Jelle Zijlstra <906600+JelleZijlstra@users.noreply.github.com>
Co-authored-by: Alex Waygood <66076021+AlexWaygood@users.noreply.github.com>
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
288 lines
8.7 KiB
ReStructuredText
288 lines
8.7 KiB
ReStructuredText
.. currentmodule:: asyncio
|
|
|
|
|
|
.. _asyncio-futures:
|
|
|
|
=======
|
|
Futures
|
|
=======
|
|
|
|
**Source code:** :source:`Lib/asyncio/futures.py`,
|
|
:source:`Lib/asyncio/base_futures.py`
|
|
|
|
-------------------------------------
|
|
|
|
*Future* objects are used to bridge **low-level callback-based code**
|
|
with high-level async/await code.
|
|
|
|
|
|
Future Functions
|
|
================
|
|
|
|
.. function:: isfuture(obj)
|
|
|
|
Return ``True`` if *obj* is either of:
|
|
|
|
* an instance of :class:`asyncio.Future`,
|
|
* an instance of :class:`asyncio.Task`,
|
|
* a Future-like object with a ``_asyncio_future_blocking``
|
|
attribute.
|
|
|
|
.. versionadded:: 3.5
|
|
|
|
|
|
.. function:: ensure_future(obj, *, loop=None)
|
|
|
|
Return:
|
|
|
|
* *obj* argument as is, if *obj* is a :class:`Future`,
|
|
a :class:`Task`, or a Future-like object (:func:`isfuture`
|
|
is used for the test.)
|
|
|
|
* a :class:`Task` object wrapping *obj*, if *obj* is a
|
|
coroutine (:func:`iscoroutine` is used for the test);
|
|
in this case the coroutine will be scheduled by
|
|
``ensure_future()``.
|
|
|
|
* a :class:`Task` object that would await on *obj*, if *obj* is an
|
|
awaitable (:func:`inspect.isawaitable` is used for the test.)
|
|
|
|
If *obj* is neither of the above a :exc:`TypeError` is raised.
|
|
|
|
.. important::
|
|
|
|
Save a reference to the result of this function, to avoid
|
|
a task disappearing mid-execution.
|
|
|
|
See also the :func:`create_task` function which is the
|
|
preferred way for creating new tasks or use :class:`asyncio.TaskGroup`
|
|
which keeps reference to the task internally.
|
|
|
|
.. versionchanged:: 3.5.1
|
|
The function accepts any :term:`awaitable` object.
|
|
|
|
.. deprecated:: 3.10
|
|
Deprecation warning is emitted if *obj* is not a Future-like object
|
|
and *loop* is not specified and there is no running event loop.
|
|
|
|
|
|
.. function:: wrap_future(future, *, loop=None)
|
|
|
|
Wrap a :class:`concurrent.futures.Future` object in a
|
|
:class:`asyncio.Future` object.
|
|
|
|
.. deprecated:: 3.10
|
|
Deprecation warning is emitted if *future* is not a Future-like object
|
|
and *loop* is not specified and there is no running event loop.
|
|
|
|
.. _asyncio-future-obj:
|
|
|
|
Future Object
|
|
=============
|
|
|
|
.. class:: Future(*, loop=None)
|
|
|
|
A Future represents an eventual result of an asynchronous
|
|
operation. Not thread-safe.
|
|
|
|
Future is an :term:`awaitable` object. Coroutines can await on
|
|
Future objects until they either have a result or an exception
|
|
set, or until they are cancelled. A Future can be awaited multiple
|
|
times and the result is same.
|
|
|
|
Typically Futures are used to enable low-level
|
|
callback-based code (e.g. in protocols implemented using asyncio
|
|
:ref:`transports <asyncio-transports-protocols>`)
|
|
to interoperate with high-level async/await code.
|
|
|
|
The rule of thumb is to never expose Future objects in user-facing
|
|
APIs, and the recommended way to create a Future object is to call
|
|
:meth:`loop.create_future`. This way alternative event loop
|
|
implementations can inject their own optimized implementations
|
|
of a Future object.
|
|
|
|
Futures are :ref:`generic <generics>` over the type of their results.
|
|
|
|
.. versionchanged:: 3.7
|
|
Added support for the :mod:`contextvars` module.
|
|
|
|
.. deprecated:: 3.10
|
|
Deprecation warning is emitted if *loop* is not specified
|
|
and there is no running event loop.
|
|
|
|
.. method:: result()
|
|
|
|
Return the result of the Future.
|
|
|
|
If the Future is *done* and has a result set by the
|
|
:meth:`set_result` method, the result value is returned.
|
|
|
|
If the Future is *done* and has an exception set by the
|
|
:meth:`set_exception` method, this method raises the exception.
|
|
|
|
If the Future has been *cancelled*, this method raises
|
|
a :exc:`CancelledError` exception.
|
|
|
|
If the Future's result isn't yet available, this method raises
|
|
an :exc:`InvalidStateError` exception.
|
|
|
|
.. method:: set_result(result)
|
|
|
|
Mark the Future as *done* and set its result.
|
|
|
|
Raises an :exc:`InvalidStateError` error if the Future is
|
|
already *done*.
|
|
|
|
.. method:: set_exception(exception)
|
|
|
|
Mark the Future as *done* and set an exception.
|
|
|
|
Raises an :exc:`InvalidStateError` error if the Future is
|
|
already *done*.
|
|
|
|
.. method:: done()
|
|
|
|
Return ``True`` if the Future is *done*.
|
|
|
|
A Future is *done* if it was *cancelled* or if it has a result
|
|
or an exception set with :meth:`set_result` or
|
|
:meth:`set_exception` calls.
|
|
|
|
.. method:: cancelled()
|
|
|
|
Return ``True`` if the Future was *cancelled*.
|
|
|
|
The method is usually used to check if a Future is not
|
|
*cancelled* before setting a result or an exception for it::
|
|
|
|
if not fut.cancelled():
|
|
fut.set_result(42)
|
|
|
|
.. method:: add_done_callback(callback, *, context=None)
|
|
|
|
Add a callback to be run when the Future is *done*.
|
|
|
|
The *callback* is called with the Future object as its only
|
|
argument.
|
|
|
|
If the Future is already *done* when this method is called,
|
|
the callback is scheduled with :meth:`loop.call_soon`.
|
|
|
|
An optional keyword-only *context* argument allows specifying a
|
|
custom :class:`contextvars.Context` for the *callback* to run in.
|
|
The current context is used when no *context* is provided.
|
|
|
|
:func:`functools.partial` can be used to pass parameters
|
|
to the callback, e.g.::
|
|
|
|
# Call 'print("Future:", fut)' when "fut" is done.
|
|
fut.add_done_callback(
|
|
functools.partial(print, "Future:"))
|
|
|
|
.. versionchanged:: 3.7
|
|
The *context* keyword-only parameter was added.
|
|
See :pep:`567` for more details.
|
|
|
|
.. method:: remove_done_callback(callback)
|
|
|
|
Remove *callback* from the callbacks list.
|
|
|
|
Returns the number of callbacks removed, which is typically 1,
|
|
unless a callback was added more than once.
|
|
|
|
.. method:: cancel(msg=None)
|
|
|
|
Cancel the Future and schedule callbacks.
|
|
|
|
If the Future is already *done* or *cancelled*, return ``False``.
|
|
Otherwise, change the Future's state to *cancelled*,
|
|
schedule the callbacks, and return ``True``.
|
|
|
|
The optional string argument *msg* is passed as the argument to the
|
|
:exc:`CancelledError` exception raised when a cancelled Future
|
|
is awaited.
|
|
|
|
.. versionchanged:: 3.9
|
|
Added the *msg* parameter.
|
|
|
|
.. method:: exception()
|
|
|
|
Return the exception that was set on this Future.
|
|
|
|
The exception (or ``None`` if no exception was set) is
|
|
returned only if the Future is *done*.
|
|
|
|
If the Future has been *cancelled*, this method raises a
|
|
:exc:`CancelledError` exception.
|
|
|
|
If the Future isn't *done* yet, this method raises an
|
|
:exc:`InvalidStateError` exception.
|
|
|
|
.. method:: get_loop()
|
|
|
|
Return the event loop the Future object is bound to.
|
|
|
|
.. versionadded:: 3.7
|
|
|
|
|
|
.. _asyncio_example_future:
|
|
|
|
This example creates a Future object, creates and schedules an
|
|
asynchronous Task to set result for the Future, and waits until
|
|
the Future has a result::
|
|
|
|
async def set_after(fut, delay, value):
|
|
# Sleep for *delay* seconds.
|
|
await asyncio.sleep(delay)
|
|
|
|
# Set *value* as a result of *fut* Future.
|
|
fut.set_result(value)
|
|
|
|
async def main():
|
|
# Get the current event loop.
|
|
loop = asyncio.get_running_loop()
|
|
|
|
# Create a new Future object.
|
|
fut = loop.create_future()
|
|
|
|
# Run "set_after()" coroutine in a parallel Task.
|
|
# We are using the low-level "loop.create_task()" API here because
|
|
# we already have a reference to the event loop at hand.
|
|
# Otherwise we could have just used "asyncio.create_task()".
|
|
loop.create_task(
|
|
set_after(fut, 1, '... world'))
|
|
|
|
print('hello ...')
|
|
|
|
# Wait until *fut* has a result (1 second) and print it.
|
|
print(await fut)
|
|
|
|
asyncio.run(main())
|
|
|
|
|
|
.. important::
|
|
|
|
The Future object was designed to mimic
|
|
:class:`concurrent.futures.Future`. Key differences include:
|
|
|
|
- unlike asyncio Futures, :class:`concurrent.futures.Future`
|
|
instances cannot be awaited.
|
|
|
|
- :meth:`asyncio.Future.result` and :meth:`asyncio.Future.exception`
|
|
do not accept the *timeout* argument.
|
|
|
|
- :meth:`asyncio.Future.result` and :meth:`asyncio.Future.exception`
|
|
raise an :exc:`InvalidStateError` exception when the Future is not
|
|
*done*.
|
|
|
|
- Callbacks registered with :meth:`asyncio.Future.add_done_callback`
|
|
are not called immediately. They are scheduled with
|
|
:meth:`loop.call_soon` instead.
|
|
|
|
- asyncio Future is not compatible with the
|
|
:func:`concurrent.futures.wait` and
|
|
:func:`concurrent.futures.as_completed` functions.
|
|
|
|
- :meth:`asyncio.Future.cancel` accepts an optional ``msg`` argument,
|
|
but :meth:`concurrent.futures.Future.cancel` does not.
|