blob: 6b1a6f0b01c3c16668934826d3e5002bdda88979 [file] [log] [blame]
Welcome to typing_extensions's documentation!
=============================================
``typing_extensions`` complements the standard-library :py:mod:`typing` module,
providing runtime support for type hints as specified by :pep:`484` and subsequent
PEPs. The module serves two related purposes:
- Enable use of new type system features on older Python versions. For example,
:py:data:`typing.TypeGuard` is new in Python 3.10, but ``typing_extensions`` allows
users on previous Python versions to use it too.
- Enable experimentation with type system features proposed in new PEPs before they are accepted and
added to the :py:mod:`typing` module.
New features may be added to ``typing_extensions`` as soon as they are specified
in a PEP that has been added to the `python/peps <https://github.com/python/peps>`_
repository. If the PEP is accepted, the feature will then be added to the
:py:mod:`typing` module for the next CPython release. No typing PEP that
affected ``typing_extensions`` has been rejected so far, so we haven't yet
figured out how to deal with that possibility.
Bugfixes and new typing features that don't require a PEP may be added to
``typing_extensions`` once they are merged into CPython's main branch.
Versioning and backwards compatibility
--------------------------------------
Starting with version 4.0.0, ``typing_extensions`` uses
`Semantic Versioning <https://semver.org>`_. A changelog is
maintained `on GitHub <https://github.com/python/typing_extensions/blob/main/CHANGELOG.md>`_.
The major version is incremented for all backwards-incompatible changes.
Therefore, it's safe to depend
on ``typing_extensions`` like this: ``typing_extensions >=x.y, <(x+1)``,
where ``x.y`` is the first version that includes all features you need.
In view of the wide usage of ``typing_extensions`` across the ecosystem,
we are highly hesitant to break backwards compatibility, and we do not
expect to increase the major version number in the foreseeable future.
Feature releases, with version numbers of the form 4.N.0, are made at
irregular intervals when enough new features accumulate. Before a
feature release, at least one release candidate (with a version number
of the form 4.N.0rc1) should be released to give downstream users time
to test. After at least a week of testing, the new feature version
may then be released. If necessary, additional release candidates can
be added.
Bugfix releases, with version numbers of the form 4.N.1 or higher,
may be made if bugs are discovered after a feature release.
Before version 4.0.0, the versioning scheme loosely followed the Python
version from which features were backported; for example,
``typing_extensions`` 3.10.0.0 was meant to reflect ``typing`` as of
Python 3.10.0. During this period, no changelog was maintained.
Runtime use of types
~~~~~~~~~~~~~~~~~~~~
We aim for complete backwards compatibility in terms of the names we export:
code like ``from typing_extensions import X`` that works on one
typing-extensions release will continue to work on the next.
It is more difficult to maintain compatibility for users that introspect
types at runtime, as almost any detail can potentially break compatibility.
Users who introspect types should follow these guidelines to minimize
the risk of compatibility issues:
- Always check for both the :mod:`typing` and ``typing_extensions`` versions
of objects, even if they are currently the same on some Python version.
Future ``typing_extensions`` releases may re-export a separate version of
the object to backport some new feature or bugfix.
- Use public APIs like :func:`get_origin` and :func:`get_original_bases` to
access internal information about types, instead of accessing private
attributes directly. If some information is not available through a public
attribute, consider opening an issue in CPython to add such an API.
Python version support
----------------------
``typing_extensions`` currently supports Python versions 3.7 and higher. In the future,
support for older Python versions will be dropped some time after that version
reaches end of life.
Module contents
---------------
As most of the features in ``typing_extensions`` exist in :py:mod:`typing`
in newer versions of Python, the documentation here is brief and focuses
on aspects that are specific to ``typing_extensions``, such as limitations
on specific Python versions.
Special typing primitives
~~~~~~~~~~~~~~~~~~~~~~~~~
.. data:: Annotated
See :py:data:`typing.Annotated` and :pep:`593`. In ``typing`` since 3.9.
.. versionchanged:: 4.1.0
``Annotated`` can now wrap :data:`ClassVar` and :data:`Final`.
.. data:: Any
See :py:data:`typing.Any`.
Since Python 3.11, ``typing.Any`` can be used as a base class.
``typing_extensions.Any`` supports this feature on older versions.
.. versionadded:: 4.4.0
Added to support inheritance from ``Any``.
.. data:: ClassVar
See :py:data:`typing.ClassVar` and :pep:`526`. In ``typing`` since 3.5.3.
.. data:: Concatenate
See :py:data:`typing.Concatenate` and :pep:`612`. In ``typing`` since 3.10.
The backport does not support certain operations involving ``...`` as
a parameter; see :issue:`48` and :issue:`110` for details.
.. data:: Final
See :py:data:`typing.Final` and :pep:`591`. In ``typing`` since 3.8.
.. data:: Literal
See :py:data:`typing.Literal` and :pep:`586`. In ``typing`` since 3.8.
:py:data:`typing.Literal` does not flatten or deduplicate parameters on Python <3.9.1, and a
caching bug was fixed in 3.10.1/3.9.8. The ``typing_extensions`` version
flattens and deduplicates parameters on all Python versions, and the caching
bug is also fixed on all versions.
.. versionchanged:: 4.6.0
Backported the bug fixes from :pr-cpy:`29334`, :pr-cpy:`23294`, and :pr-cpy:`23383`.
.. data:: LiteralString
See :py:data:`typing.LiteralString` and :pep:`675`. In ``typing`` since 3.11.
.. versionadded:: 4.1.0
.. class:: NamedTuple
See :py:class:`typing.NamedTuple`.
``typing_extensions`` backports several changes
to ``NamedTuple`` on Python 3.11 and lower: in 3.11,
support for generic ``NamedTuple``\ s was added, and
in 3.12, the ``__orig_bases__`` attribute was added.
.. versionadded:: 4.3.0
Added to provide support for generic ``NamedTuple``\ s.
.. versionchanged:: 4.6.0
Support for the ``__orig_bases__`` attribute was added.
.. data:: Never
See :py:data:`typing.Never`. In ``typing`` since 3.11.
.. versionadded:: 4.1.0
.. class:: NewType(name, tp)
See :py:class:`typing.NewType`. In ``typing`` since 3.5.2.
Instances of ``NewType`` were made picklable in 3.10 and an error message was
improved in 3.11; ``typing_extensions`` backports these changes.
.. versionchanged:: 4.6.0
The improvements from Python 3.10 and 3.11 were backported.
.. data:: NoReturn
See :py:data:`typing.NoReturn`. In ``typing`` since 3.5.4 and 3.6.2.
.. data:: NotRequired
See :py:data:`typing.NotRequired` and :pep:`655`. In ``typing`` since 3.11.
.. versionadded:: 4.0.0
.. class:: ParamSpec(name, *, default=...)
See :py:class:`typing.ParamSpec` and :pep:`612`. In ``typing`` since 3.10.
The ``typing_extensions`` version adds support for the
``default=`` argument from :pep:`696`.
On older Python versions, ``typing_extensions.ParamSpec`` may not work
correctly with introspection tools like :func:`get_args` and
:func:`get_origin`. Certain special cases in user-defined
:py:class:`typing.Generic`\ s are also not available (e.g., see :issue:`126`).
.. versionchanged:: 4.4.0
Added support for the ``default=`` argument.
.. versionchanged:: 4.6.0
The implementation was changed for compatibility with Python 3.12.
.. class:: ParamSpecArgs
.. class:: ParamSpecKwargs
See :py:class:`typing.ParamSpecArgs` and :py:class:`typing.ParamSpecKwargs`.
In ``typing`` since 3.10.
.. class:: Protocol
See :py:class:`typing.Protocol` and :pep:`544`. In ``typing`` since 3.8.
Python 3.12 improves the performance of runtime-checkable protocols;
``typing_extensions`` backports this improvement.
.. versionchanged:: 4.6.0
Backported the ability to define ``__init__`` methods on Protocol classes.
.. versionchanged:: 4.6.0
Backported changes to runtime-checkable protocols from Python 3.12,
including :pr-cpy:`103034` and :pr-cpy:`26067`.
.. data:: Required
See :py:data:`typing.Required` and :pep:`655`. In ``typing`` since 3.11.
.. versionadded:: 4.0.0
.. data:: Self
See :py:data:`typing.Self` and :pep:`673`. In ``typing`` since 3.11.
.. versionadded:: 4.0.0
.. class:: Type
See :py:class:`typing.Type`. In ``typing`` since 3.5.2.
.. data:: TypeAlias
See :py:data:`typing.TypeAlias` and :pep:`613`. In ``typing`` since 3.10.
.. class:: TypeAliasType(name, value, *, type_params=())
See :py:class:`typing.TypeAliasType` and :pep:`695`. In ``typing`` since 3.12.
.. versionadded:: 4.6.0
.. data:: TypeGuard
See :py:data:`typing.TypeGuard` and :pep:`647`. In ``typing`` since 3.10.
.. class:: TypedDict
See :py:class:`typing.TypedDict` and :pep:`589`. In ``typing`` since 3.8.
``typing_extensions`` backports various bug fixes and improvements
to ``TypedDict`` on Python 3.11 and lower.
:py:class:`TypedDict` does not store runtime information
about which (if any) keys are non-required in Python 3.8, and does not
honor the ``total`` keyword with old-style ``TypedDict()`` in Python
3.9.0 and 3.9.1. :py:class:`typing.TypedDict` also does not support multiple inheritance
with :py:class:`typing.Generic` on Python <3.11, and :py:class:`typing.TypedDict` classes do not
consistently have the ``__orig_bases__`` attribute on Python <3.12. The
``typing_extensions`` backport provides all of these features and bugfixes on
all Python versions.
.. versionchanged:: 4.3.0
Added support for generic ``TypedDict``\ s.
.. versionchanged:: 4.6.0
A :py:exc:`DeprecationWarning` is now emitted when a call-based
``TypedDict`` is constructed using keyword arguments.
.. versionchanged:: 4.6.0
Support for the ``__orig_bases__`` attribute was added.
.. class:: TypeVar(name, *constraints, bound=None, covariant=False,
contravariant=False, infer_variance=False, default=...)
See :py:class:`typing.TypeVar`.
The ``typing_extensions`` version adds support for the
``default=`` argument from :pep:`696`, as well as the
``infer_variance=`` argument from :pep:`695` (also available
in Python 3.12).
.. versionadded:: 4.4.0
Added in order to support the new ``default=`` and
``infer_variance=`` arguments.
.. versionchanged:: 4.6.0
The implementation was changed for compatibility with Python 3.12.
.. class:: TypeVarTuple(name, *, default=...)
See :py:class:`typing.TypeVarTuple` and :pep:`646`. In ``typing`` since 3.11.
The ``typing_extensions`` version adds support for the
``default=`` argument from :pep:`696`.
.. versionadded:: 4.1.0
.. versionchanged:: 4.4.0
Added support for the ``default=`` argument.
.. versionchanged:: 4.6.0
The implementation was changed for compatibility with Python 3.12.
.. data:: Unpack
See :py:data:`typing.Unpack` and :pep:`646`. In ``typing`` since 3.11.
In Python 3.12, the ``repr()`` was changed as a result of :pep:`692`.
``typing_extensions`` backports this change.
Generic type aliases involving ``Unpack`` may not work correctly on
Python 3.10 and lower; see :issue:`103` for details.
.. versionadded:: 4.1.0
.. versionchanged:: 4.6.0
Backport ``repr()`` changes from Python 3.12.
Generic concrete collections
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. class:: ChainMap
See :py:class:`typing.ChainMap`. In ``typing`` since 3.5.4 and 3.6.1.
.. class:: Counter
See :py:class:`typing.Counter`. In ``typing`` since 3.5.4 and 3.6.1.
.. class:: DefaultDict
See :py:class:`typing.DefaultDict`. In ``typing`` since 3.5.2.
.. class:: Deque
See :py:class:`typing.Deque`. In ``typing`` since 3.5.4 and 3.6.1.
.. class:: OrderedDict
See :py:class:`typing.OrderedDict`. In ``typing`` since 3.7.2.
Abstract Base Classes
~~~~~~~~~~~~~~~~~~~~~
.. class:: AsyncContextManager
See :py:class:`typing.AsyncContextManager`. In ``typing`` since 3.5.4 and 3.6.2.
.. class:: AsyncGenerator
See :py:class:`typing.AsyncGenerator`. In ``typing`` since 3.6.1.
.. class:: AsyncIterable
See :py:class:`typing.AsyncIterable`. In ``typing`` since 3.5.2.
.. class:: AsyncIterator
See :py:class:`typing.AsyncIterator`. In ``typing`` since 3.5.2.
.. class:: Awaitable
See :py:class:`typing.Awaitable`. In ``typing`` since 3.5.2.
.. class:: Buffer
See :py:class:`collections.abc.Buffer`. Added to the standard library
in Python 3.12.
.. versionadded:: 4.6.0
.. class:: ContextManager
See :py:class:`typing.ContextManager`. In ``typing`` since 3.5.4.
.. class:: Coroutine
See :py:class:`typing.Coroutine`. In ``typing`` since 3.5.3.
Protocols
~~~~~~~~~
.. class:: SupportsAbs
See :py:class:`typing.SupportsAbs`.
``typing_extensions`` backports a more performant version of this
protocol on Python 3.11 and lower.
.. versionadded:: 4.6.0
.. class:: SupportsBytes
See :py:class:`typing.SupportsBytes`.
``typing_extensions`` backports a more performant version of this
protocol on Python 3.11 and lower.
.. versionadded:: 4.6.0
.. class:: SupportsComplex
See :py:class:`typing.SupportsComplex`.
``typing_extensions`` backports a more performant version of this
protocol on Python 3.11 and lower.
.. versionadded:: 4.6.0
.. class:: SupportsFloat
See :py:class:`typing.SupportsFloat`.
``typing_extensions`` backports a more performant version of this
protocol on Python 3.11 and lower.
.. versionadded:: 4.6.0
.. class:: SupportsIndex
See :py:class:`typing.SupportsIndex`. In ``typing`` since 3.8.
``typing_extensions`` backports a more performant version of this
protocol on Python 3.11 and lower.
.. versionchanged:: 4.6.0
Backported the performance improvements from Python 3.12.
.. class:: SupportsInt
See :py:class:`typing.SupportsInt`.
``typing_extensions`` backports a more performant version of this
protocol on Python 3.11 and lower.
.. versionadded:: 4.6.0
.. class:: SupportsRound
See :py:class:`typing.SupportsRound`.
``typing_extensions`` backports a more performant version of this
protocol on Python 3.11 and lower.
.. versionadded:: 4.6.0
Decorators
~~~~~~~~~~
.. decorator:: dataclass_transform(*, eq_default=False, order_default=False,
kw_only_default=False, frozen_default=False,
field_specifiers=(), **kwargs)
See :py:func:`typing.dataclass_transform` and :pep:`681`. In ``typing`` since 3.11.
Python 3.12 adds the ``frozen_default`` parameter; ``typing_extensions``
backports this parameter.
.. versionadded:: 4.1.0
.. versionchanged:: 4.2.0
The ``field_descriptors`` parameter was renamed to ``field_specifiers``.
For compatibility, the decorator now accepts arbitrary keyword arguments.
.. versionchanged:: 4.5.0
The ``frozen_default`` parameter was added.
.. decorator:: deprecated(msg, *, category=DeprecationWarning, stacklevel=1)
See :pep:`702`. Experimental; not yet part of the standard library.
.. versionadded:: 4.5.0
.. decorator:: final
See :py:func:`typing.final` and :pep:`591`. In ``typing`` since 3.8.
Since Python 3.11, this decorator supports runtime introspection
by setting the ``__final__`` attribute wherever possible; ``typing_extensions.final``
backports this feature.
.. versionchanged:: 4.1.0
The decorator now attempts to set the ``__final__`` attribute on decorated objects.
.. decorator:: overload
See :py:func:`typing.overload`.
Since Python 3.11, this decorator supports runtime introspection
through :func:`get_overloads`; ``typing_extensions.overload``
backports this feature.
.. versionchanged:: 4.2.0
Introspection support via :func:`get_overloads` was added.
.. decorator:: override
See :py:func:`typing.override` and :pep:`698`. In ``typing`` since 3.12.
.. versionadded:: 4.4.0
.. versionchanged:: 4.5.0
The decorator now attempts to set the ``__override__`` attribute on the decorated
object.
.. decorator:: runtime_checkable
See :py:func:`typing.runtime_checkable`. In ``typing`` since 3.8.
In Python 3.12, the performance of runtime-checkable protocols was
improved, and ``typing_extensions`` backports these performance
improvements.
Functions
~~~~~~~~~
.. function:: assert_never(arg)
See :py:func:`typing.assert_never`. In ``typing`` since 3.11.
.. versionadded:: 4.1.0
.. function:: assert_type(val, typ)
See :py:func:`typing.assert_type`. In ``typing`` since 3.11.
.. versionadded:: 4.2.0
.. function:: clear_overloads()
See :py:func:`typing.clear_overloads`. In ``typing`` since 3.11.
.. versionadded:: 4.2.0
.. function:: get_args(tp)
See :py:func:`typing.get_args`. In ``typing`` since 3.8.
This function was changed in 3.9 and 3.10 to deal with :data:`Annotated`
and :class:`ParamSpec` correctly; ``typing_extensions`` backports these
fixes.
.. function:: get_origin(tp)
See :py:func:`typing.get_origin`. In ``typing`` since 3.8.
This function was changed in 3.9 and 3.10 to deal with :data:`Annotated`
and :class:`ParamSpec` correctly; ``typing_extensions`` backports these
fixes.
.. function:: get_original_bases(cls)
See :py:func:`types.get_original_bases`. Added to the standard library
in Python 3.12.
This function should always produce correct results when called on classes
constructed using features from ``typing_extensions``. However, it may
produce incorrect results when called on some :py:class:`NamedTuple` or
:py:class:`TypedDict` classes on Python <=3.11.
.. versionadded:: 4.6.0
.. function:: get_overloads(func)
See :py:func:`typing.get_overloads`. In ``typing`` since 3.11.
Before Python 3.11, this works only with overloads created through
:func:`overload`, not with :py:func:`typing.overload`.
.. versionadded:: 4.2.0
.. function:: get_type_hints(obj, globalns=None, localns=None, include_extras=False)
See :py:func:`typing.get_type_hints`.
In Python 3.11, this function was changed to support the new
:py:data:`typing.Required` and :py:data:`typing.NotRequired`.
``typing_extensions`` backports these fixes.
.. versionchanged:: 4.1.0
Interaction with :data:`Required` and :data:`NotRequired`.
.. function:: is_typeddict(tp)
See :py:func:`typing.is_typeddict`. In ``typing`` since 3.10.
On versions where :class:`TypedDict` is not the same as
:py:class:`typing.TypedDict`, this function recognizes
``TypedDict`` classes created through either mechanism.
.. versionadded:: 4.1.0
.. function:: reveal_type(obj)
See :py:func:`typing.reveal_type`. In ``typing`` since 3.11.
.. versionadded:: 4.1.0
Other
~~~~~
.. class:: Text
See :py:class:`typing.Text`. In ``typing`` since 3.5.2.
.. data:: TYPE_CHECKING
See :py:data:`typing.TYPE_CHECKING`. In ``typing`` since 3.5.2.