| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | ========================================
 | 
					
						
							| 
									
										
										
										
											2015-05-22 10:14:11 -07:00
										 |  |  | :mod:`typing` --- Support for type hints
 | 
					
						
							|  |  |  | ========================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. module:: typing
 | 
					
						
							| 
									
										
										
										
											2018-10-27 00:58:26 +02:00
										 |  |  |    :synopsis: Support for type hints (see :pep:`484`).
 | 
					
						
							| 
									
										
										
										
											2015-05-22 10:14:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-11 16:23:22 +02:00
										 |  |  | .. versionadded:: 3.5
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-11 15:02:54 -04:00
										 |  |  | **Source code:** :source:`Lib/typing.py`
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 10:13:23 -05:00
										 |  |  | .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-16 23:04:06 +01:00
										 |  |  |    The Python runtime does not enforce function and variable type annotations.
 | 
					
						
							|  |  |  |    They can be used by third party tools such as type checkers, IDEs, linters,
 | 
					
						
							|  |  |  |    etc.
 | 
					
						
							| 
									
										
										
										
											2017-01-20 10:13:23 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 10:14:11 -07:00
										 |  |  | --------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-28 20:55:50 +01:00
										 |  |  | This module provides runtime support for type hints. The most fundamental
 | 
					
						
							| 
									
										
										
										
											2021-11-04 11:48:40 +00:00
										 |  |  | support consists of the types :data:`Any`, :data:`Union`, :data:`Callable`,
 | 
					
						
							|  |  |  | :class:`TypeVar`, and :class:`Generic`. For a full specification, please see
 | 
					
						
							|  |  |  | :pep:`484`. For a simplified introduction to type hints, see :pep:`483`.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The function below takes and returns a string and is annotated as follows::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def greeting(name: str) -> str:
 | 
					
						
							|  |  |  |        return 'Hello ' + name
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 17:04:41 -06:00
										 |  |  | In the function ``greeting``, the argument ``name`` is expected to be of type
 | 
					
						
							| 
									
										
										
										
											2015-08-29 22:39:47 -05:00
										 |  |  | :class:`str` and the return type :class:`str`. Subtypes are accepted as
 | 
					
						
							|  |  |  | arguments.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-08 12:04:04 +08:00
										 |  |  | New features are frequently added to the ``typing`` module.
 | 
					
						
							|  |  |  | The `typing_extensions <https://pypi.org/project/typing-extensions/>`_ package
 | 
					
						
							|  |  |  | provides backports of these new features to older versions of Python.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-29 11:22:25 +07:00
										 |  |  | For a summary of deprecated features and a deprecation timeline, please see
 | 
					
						
							|  |  |  | `Deprecation Timeline of Major Features`_.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-19 12:09:41 -07:00
										 |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The documentation at https://typing.readthedocs.io/ serves as useful reference
 | 
					
						
							|  |  |  |    for type system features, useful typing related tools and typing best practices.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-29 11:22:25 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-28 20:55:50 +01:00
										 |  |  | .. _relevant-peps:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Relevant PEPs
 | 
					
						
							|  |  |  | =============
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Since the initial introduction of type hints in :pep:`484` and :pep:`483`, a
 | 
					
						
							|  |  |  | number of PEPs have modified and enhanced Python's framework for type
 | 
					
						
							|  |  |  | annotations. These include:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * :pep:`526`: Syntax for Variable Annotations
 | 
					
						
							|  |  |  |      *Introducing* syntax for annotating variables outside of function
 | 
					
						
							|  |  |  |      definitions, and :data:`ClassVar`
 | 
					
						
							|  |  |  | * :pep:`544`: Protocols: Structural subtyping (static duck typing)
 | 
					
						
							|  |  |  |      *Introducing* :class:`Protocol` and the
 | 
					
						
							|  |  |  |      :func:`@runtime_checkable<runtime_checkable>` decorator
 | 
					
						
							|  |  |  | * :pep:`585`: Type Hinting Generics In Standard Collections
 | 
					
						
							| 
									
										
										
										
											2021-11-04 04:06:34 +00:00
										 |  |  |      *Introducing* :class:`types.GenericAlias` and the ability to use standard
 | 
					
						
							|  |  |  |      library classes as :ref:`generic types<types-genericalias>`
 | 
					
						
							| 
									
										
										
										
											2021-10-28 20:55:50 +01:00
										 |  |  | * :pep:`586`: Literal Types
 | 
					
						
							|  |  |  |      *Introducing* :data:`Literal`
 | 
					
						
							|  |  |  | * :pep:`589`: TypedDict: Type Hints for Dictionaries with a Fixed Set of Keys
 | 
					
						
							|  |  |  |      *Introducing* :class:`TypedDict`
 | 
					
						
							|  |  |  | * :pep:`591`: Adding a final qualifier to typing
 | 
					
						
							|  |  |  |      *Introducing* :data:`Final` and the :func:`@final<final>` decorator
 | 
					
						
							|  |  |  | * :pep:`593`: Flexible function and variable annotations
 | 
					
						
							|  |  |  |      *Introducing* :data:`Annotated`
 | 
					
						
							|  |  |  | * :pep:`604`: Allow writing union types as ``X | Y``
 | 
					
						
							|  |  |  |      *Introducing* :data:`types.UnionType` and the ability to use
 | 
					
						
							| 
									
										
										
										
											2021-10-29 14:56:21 +01:00
										 |  |  |      the binary-or operator ``|`` to signify a
 | 
					
						
							|  |  |  |      :ref:`union of types<types-union>`
 | 
					
						
							| 
									
										
										
										
											2021-10-28 20:55:50 +01:00
										 |  |  | * :pep:`612`: Parameter Specification Variables
 | 
					
						
							|  |  |  |      *Introducing* :class:`ParamSpec` and :data:`Concatenate`
 | 
					
						
							|  |  |  | * :pep:`613`: Explicit Type Aliases
 | 
					
						
							|  |  |  |      *Introducing* :data:`TypeAlias`
 | 
					
						
							| 
									
										
										
										
											2022-04-05 00:37:01 +01:00
										 |  |  | * :pep:`646`: Variadic Generics
 | 
					
						
							|  |  |  |      *Introducing* :data:`TypeVarTuple`
 | 
					
						
							| 
									
										
										
										
											2021-10-28 20:55:50 +01:00
										 |  |  | * :pep:`647`: User-Defined Type Guards
 | 
					
						
							|  |  |  |      *Introducing* :data:`TypeGuard`
 | 
					
						
							| 
									
										
										
										
											2022-07-05 05:16:10 -04:00
										 |  |  | * :pep:`655`: Marking individual TypedDict items as required or potentially missing
 | 
					
						
							| 
									
										
										
										
											2022-05-27 16:11:45 -06:00
										 |  |  |      *Introducing* :data:`Required` and :data:`NotRequired`
 | 
					
						
							| 
									
										
										
										
											2022-02-07 20:47:48 +00:00
										 |  |  | * :pep:`673`: Self type
 | 
					
						
							|  |  |  |     *Introducing* :data:`Self`
 | 
					
						
							| 
									
										
										
										
											2022-04-05 07:21:03 -07:00
										 |  |  | * :pep:`675`: Arbitrary Literal String Type
 | 
					
						
							|  |  |  |     *Introducing* :data:`LiteralString`
 | 
					
						
							| 
									
										
										
										
											2022-06-28 02:58:35 -07:00
										 |  |  | * :pep:`681`: Data Class Transforms
 | 
					
						
							|  |  |  |     *Introducing* the :func:`@dataclass_transform<dataclass_transform>` decorator
 | 
					
						
							| 
									
										
										
										
											2021-10-28 20:55:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 00:44:31 +03:00
										 |  |  | .. _type-aliases:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | Type aliases
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | ============
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | A type alias is defined by assigning the type to the alias. In this example,
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  | ``Vector`` and ``list[float]`` will be treated as interchangeable synonyms::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    Vector = list[float]
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  |    def scale(scalar: float, vector: Vector) -> Vector:
 | 
					
						
							|  |  |  |        return [scalar * num for num in vector]
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 19:37:58 -07:00
										 |  |  |    # passes type checking; a list of floats qualifies as a Vector.
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  |    new_vector = scale(2.0, [1.0, -4.2, 5.4])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Type aliases are useful for simplifying complex type signatures. For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    from collections.abc import Sequence
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    ConnectionOptions = dict[str, str]
 | 
					
						
							|  |  |  |    Address = tuple[str, int]
 | 
					
						
							|  |  |  |    Server = tuple[Address, ConnectionOptions]
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-04 16:14:32 +02:00
										 |  |  |    def broadcast_message(message: str, servers: Sequence[Server]) -> None:
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    # The static type checker will treat the previous type signature as
 | 
					
						
							|  |  |  |    # being exactly equivalent to this one.
 | 
					
						
							|  |  |  |    def broadcast_message(
 | 
					
						
							|  |  |  |            message: str,
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |            servers: Sequence[tuple[tuple[str, int], dict[str, str]]]) -> None:
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:49:14 -07:00
										 |  |  | Note that ``None`` as a type hint is a special case and is replaced by
 | 
					
						
							|  |  |  | ``type(None)``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | .. _distinct:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | NewType
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | =======
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  | Use the :class:`NewType` helper to create distinct types::
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    from typing import NewType
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    UserId = NewType('UserId', int)
 | 
					
						
							|  |  |  |    some_id = UserId(524313)
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:41:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | The static type checker will treat the new type as if it were a subclass
 | 
					
						
							|  |  |  | of the original type. This is useful in helping catch logical errors::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def get_user_name(user_id: UserId) -> str:
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 19:37:58 -07:00
										 |  |  |    # passes type checking
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  |    user_a = get_user_name(UserId(42351))
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 19:37:58 -07:00
										 |  |  |    # fails type checking; an int is not a UserId
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  |    user_b = get_user_name(-1)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | You may still perform all ``int`` operations on a variable of type ``UserId``,
 | 
					
						
							|  |  |  | but the result will always be of type ``int``. This lets you pass in a
 | 
					
						
							|  |  |  | ``UserId`` wherever an ``int`` might be expected, but will prevent you from
 | 
					
						
							|  |  |  | accidentally creating a ``UserId`` in an invalid way::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-30 03:47:52 +03:00
										 |  |  |    # 'output' is of type 'int', not 'UserId'
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  |    output = UserId(23413) + UserId(54341)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-23 17:45:51 +01:00
										 |  |  | Note that these checks are enforced only by the static type checker. At runtime,
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | the statement ``Derived = NewType('Derived', Base)`` will make ``Derived`` a
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  | callable that immediately returns whatever parameter you pass it. That means
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | the expression ``Derived(some_value)`` does not create a new class or introduce
 | 
					
						
							| 
									
										
										
										
											2021-07-24 16:53:49 +08:00
										 |  |  | much overhead beyond that of a regular function call.
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | More precisely, the expression ``some_value is Derived(some_value)`` is always
 | 
					
						
							|  |  |  | true at runtime.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-24 16:53:49 +08:00
										 |  |  | It is invalid to create a subtype of ``Derived``::
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    from typing import NewType
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    UserId = NewType('UserId', int)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 19:37:58 -07:00
										 |  |  |    # Fails at runtime and does not pass type checking
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  |    class AdminUserId(UserId): pass
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-24 16:53:49 +08:00
										 |  |  | However, it is possible to create a :class:`NewType` based on a 'derived' ``NewType``::
 | 
					
						
							| 
									
										
										
										
											2017-09-24 04:37:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    from typing import NewType
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    UserId = NewType('UserId', int)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  |    ProUserId = NewType('ProUserId', UserId)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 04:37:48 +02:00
										 |  |  | and typechecking for ``ProUserId`` will work as expected.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-29 15:38:14 -07:00
										 |  |  | See :pep:`484` for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Recall that the use of a type alias declares two types to be *equivalent* to
 | 
					
						
							|  |  |  |    one another. Doing ``Alias = Original`` will make the static type checker
 | 
					
						
							|  |  |  |    treat ``Alias`` as being *exactly equivalent* to ``Original`` in all cases.
 | 
					
						
							|  |  |  |    This is useful when you want to simplify complex type signatures.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    In contrast, ``NewType`` declares one type to be a *subtype* of another.
 | 
					
						
							|  |  |  |    Doing ``Derived = NewType('Derived', Original)`` will make the static type
 | 
					
						
							|  |  |  |    checker treat ``Derived`` as a *subclass* of ``Original``, which means a
 | 
					
						
							|  |  |  |    value of type ``Original`` cannot be used in places where a value of type
 | 
					
						
							|  |  |  |    ``Derived`` is expected. This is useful when you want to prevent logic
 | 
					
						
							|  |  |  |    errors with minimal runtime cost.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-26 23:23:02 +01:00
										 |  |  | .. versionadded:: 3.5.2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-30 16:55:09 +03:00
										 |  |  | .. versionchanged:: 3.10
 | 
					
						
							| 
									
										
										
										
											2021-07-24 16:53:49 +08:00
										 |  |  |    ``NewType`` is now a class rather than a function.  There is some additional
 | 
					
						
							|  |  |  |    runtime cost when calling ``NewType`` over a regular function.  However, this
 | 
					
						
							|  |  |  |    cost will be reduced in 3.11.0.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | Callable
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | ========
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Frameworks expecting callback functions of specific signatures might be
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | type hinted using ``Callable[[Arg1Type, Arg2Type], ReturnType]``.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    from collections.abc import Callable
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    def feeder(get_next_item: Callable[[], str]) -> None:
 | 
					
						
							|  |  |  |        # Body
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def async_query(on_success: Callable[[int], None],
 | 
					
						
							|  |  |  |                    on_error: Callable[[int, Exception], None]) -> None:
 | 
					
						
							|  |  |  |        # Body
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-01 05:40:27 +01:00
										 |  |  |    async def on_update(value: str) -> None:
 | 
					
						
							|  |  |  |        # Body
 | 
					
						
							|  |  |  |    callback: Callable[[str], Awaitable[None]] = on_update
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-05 12:26:07 +02:00
										 |  |  | It is possible to declare the return type of a callable without specifying
 | 
					
						
							|  |  |  | the call signature by substituting a literal ellipsis
 | 
					
						
							| 
									
										
										
										
											2015-08-29 22:39:47 -05:00
										 |  |  | for the list of arguments in the type hint: ``Callable[..., ReturnType]``.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  | Callables which take other callables as arguments may indicate that their
 | 
					
						
							|  |  |  | parameter types are dependent on each other using :class:`ParamSpec`.
 | 
					
						
							|  |  |  | Additionally, if that callable adds or removes arguments from other
 | 
					
						
							|  |  |  | callables, the :data:`Concatenate` operator may be used.  They
 | 
					
						
							|  |  |  | take the form ``Callable[ParamSpecVariable, ReturnType]`` and
 | 
					
						
							|  |  |  | ``Callable[Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable], ReturnType]``
 | 
					
						
							|  |  |  | respectively.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |    ``Callable`` now supports :class:`ParamSpec` and :data:`Concatenate`.
 | 
					
						
							|  |  |  |    See :pep:`612` for more information.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. seealso::
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    The documentation for :class:`ParamSpec` and :class:`Concatenate` provides
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  |    examples of usage in ``Callable``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-26 08:13:28 -07:00
										 |  |  | .. _generics:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | Generics
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | ========
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Since type information about objects kept in containers cannot be statically
 | 
					
						
							|  |  |  | inferred in a generic way, abstract base classes have been extended to support
 | 
					
						
							|  |  |  | subscription to denote expected types for container elements.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-10 21:55:50 +03:00
										 |  |  | ::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    from collections.abc import Mapping, Sequence
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    def notify_by_email(employees: Sequence[Employee],
 | 
					
						
							|  |  |  |                        overrides: Mapping[str, str]) -> None: ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 15:51:26 +00:00
										 |  |  | Generics can be parameterized by using a factory available in typing
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | called :class:`TypeVar`.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-10 21:55:50 +03:00
										 |  |  | ::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    from collections.abc import Sequence
 | 
					
						
							|  |  |  |    from typing import TypeVar
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    T = TypeVar('T')      # Declare type variable
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def first(l: Sequence[T]) -> T:   # Generic function
 | 
					
						
							|  |  |  |        return l[0]
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-18 15:54:25 +00:00
										 |  |  | .. _user-defined-generics:
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | User-defined generic types
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | ==========================
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | A user-defined class can be defined as a generic class.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-10 21:55:50 +03:00
										 |  |  | ::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    from typing import TypeVar, Generic
 | 
					
						
							|  |  |  |    from logging import Logger
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    T = TypeVar('T')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    class LoggedVar(Generic[T]):
 | 
					
						
							|  |  |  |        def __init__(self, value: T, name: str, logger: Logger) -> None:
 | 
					
						
							|  |  |  |            self.name = name
 | 
					
						
							|  |  |  |            self.logger = logger
 | 
					
						
							|  |  |  |            self.value = value
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        def set(self, new: T) -> None:
 | 
					
						
							|  |  |  |            self.log('Set ' + repr(self.value))
 | 
					
						
							|  |  |  |            self.value = new
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        def get(self) -> T:
 | 
					
						
							|  |  |  |            self.log('Get ' + repr(self.value))
 | 
					
						
							|  |  |  |            return self.value
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        def log(self, message: str) -> None:
 | 
					
						
							| 
									
										
										
										
											2016-08-31 08:22:29 +01:00
										 |  |  |            self.logger.info('%s: %s', self.name, message)
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 22:39:47 -05:00
										 |  |  | ``Generic[T]`` as a base class defines that the class ``LoggedVar`` takes a
 | 
					
						
							|  |  |  | single type parameter ``T`` . This also makes ``T`` valid as a type within the
 | 
					
						
							|  |  |  | class body.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-04 04:06:34 +00:00
										 |  |  | The :class:`Generic` base class defines :meth:`~object.__class_getitem__` so
 | 
					
						
							|  |  |  | that ``LoggedVar[t]`` is valid as a type::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    from collections.abc import Iterable
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None:
 | 
					
						
							|  |  |  |        for var in vars:
 | 
					
						
							|  |  |  |            var.set(0)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 15:51:26 +00:00
										 |  |  | A generic type can have any number of type variables. All varieties of
 | 
					
						
							|  |  |  | :class:`TypeVar` are permissible as parameters for a generic type::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 15:51:26 +00:00
										 |  |  |    from typing import TypeVar, Generic, Sequence
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 15:51:26 +00:00
										 |  |  |    T = TypeVar('T', contravariant=True)
 | 
					
						
							|  |  |  |    B = TypeVar('B', bound=Sequence[bytes], covariant=True)
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  |    S = TypeVar('S', int, str)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 15:51:26 +00:00
										 |  |  |    class WeirdTrio(Generic[T, B, S]):
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 22:39:47 -05:00
										 |  |  | Each type variable argument to :class:`Generic` must be distinct.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | This is thus invalid::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    from typing import TypeVar, Generic
 | 
					
						
							|  |  |  |    ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    T = TypeVar('T')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    class Pair(Generic[T, T]):   # INVALID
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | You can use multiple inheritance with :class:`Generic`::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    from collections.abc import Sized
 | 
					
						
							|  |  |  |    from typing import TypeVar, Generic
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    T = TypeVar('T')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    class LinkedList(Sized, Generic[T]):
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-29 04:13:35 +00:00
										 |  |  | When inheriting from generic classes, some type variables could be fixed::
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |     from collections.abc import Mapping
 | 
					
						
							|  |  |  |     from typing import TypeVar
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     T = TypeVar('T')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class MyDict(Mapping[str, T]):
 | 
					
						
							|  |  |  |         ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In this case ``MyDict`` has a single parameter, ``T``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | Using a generic class without specifying type parameters assumes
 | 
					
						
							|  |  |  | :data:`Any` for each position. In the following example, ``MyIterable`` is
 | 
					
						
							| 
									
										
										
										
											2015-08-29 22:39:47 -05:00
										 |  |  | not generic but implicitly inherits from ``Iterable[Any]``::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    from collections.abc import Iterable
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    class MyIterable(Iterable): # Same as Iterable[Any]
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 15:54:04 -08:00
										 |  |  | User defined generic type aliases are also supported. Examples::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    from collections.abc import Iterable
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |    from typing import TypeVar
 | 
					
						
							| 
									
										
										
										
											2016-11-11 15:54:04 -08:00
										 |  |  |    S = TypeVar('S')
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |    Response = Iterable[S] | int
 | 
					
						
							| 
									
										
										
										
											2016-11-11 15:54:04 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |    # Return type here is same as Iterable[str] | int
 | 
					
						
							| 
									
										
										
										
											2016-11-11 15:54:04 -08:00
										 |  |  |    def response(query: str) -> Response[str]:
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    T = TypeVar('T', int, float, complex)
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    Vec = Iterable[tuple[T, T]]
 | 
					
						
							| 
									
										
										
										
											2016-11-11 15:54:04 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    def inproduct(v: Vec[T]) -> T: # Same as Iterable[tuple[T, T]]
 | 
					
						
							| 
									
										
										
										
											2016-11-11 15:54:04 -08:00
										 |  |  |        return sum(x*y for x, y in v)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 14:11:33 +03:00
										 |  |  | .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |     :class:`Generic` no longer has a custom metaclass.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  | User-defined generics for parameter expressions are also supported via parameter
 | 
					
						
							|  |  |  | specification variables in the form ``Generic[P]``.  The behavior is consistent
 | 
					
						
							|  |  |  | with type variables' described above as parameter specification variables are
 | 
					
						
							|  |  |  | treated by the typing module as a specialized type variable.  The one exception
 | 
					
						
							|  |  |  | to this is that a list of types can be used to substitute a :class:`ParamSpec`::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    >>> from typing import Generic, ParamSpec, TypeVar
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    >>> T = TypeVar('T')
 | 
					
						
							|  |  |  |    >>> P = ParamSpec('P')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    >>> class Z(Generic[T, P]): ...
 | 
					
						
							|  |  |  |    ...
 | 
					
						
							|  |  |  |    >>> Z[int, [dict, float]]
 | 
					
						
							|  |  |  |    __main__.Z[int, (<class 'dict'>, <class 'float'>)]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Furthermore, a generic with only one parameter specification variable will accept
 | 
					
						
							|  |  |  | parameter lists in the forms ``X[[Type1, Type2, ...]]`` and also
 | 
					
						
							|  |  |  | ``X[Type1, Type2, ...]`` for aesthetic reasons.  Internally, the latter is converted
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  | to the former, so the following are equivalent::
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |    >>> class X(Generic[P]): ...
 | 
					
						
							|  |  |  |    ...
 | 
					
						
							|  |  |  |    >>> X[int, str]
 | 
					
						
							|  |  |  |    __main__.X[(<class 'int'>, <class 'str'>)]
 | 
					
						
							|  |  |  |    >>> X[[int, str]]
 | 
					
						
							|  |  |  |    __main__.X[(<class 'int'>, <class 'str'>)]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Do note that generics with :class:`ParamSpec` may not have correct
 | 
					
						
							|  |  |  | ``__parameters__`` after substitution in some cases because they
 | 
					
						
							|  |  |  | are intended primarily for static type checking.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |    :class:`Generic` can now be parameterized over parameter expressions.
 | 
					
						
							|  |  |  |    See :class:`ParamSpec` and :pep:`612` for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 14:11:33 +03:00
										 |  |  | A user-defined generic class can have ABCs as base classes without a metaclass
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | conflict. Generic metaclasses are not supported. The outcome of parameterizing
 | 
					
						
							|  |  |  | generics is cached, and most types in the typing module are hashable and
 | 
					
						
							|  |  |  | comparable for equality.
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | The :data:`Any` type
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | ====================
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | A special kind of type is :data:`Any`. A static type checker will treat
 | 
					
						
							|  |  |  | every type as being compatible with :data:`Any` and :data:`Any` as being
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  | compatible with every type.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  | This means that it is possible to perform any operation or method call on a
 | 
					
						
							| 
									
										
										
										
											2020-08-15 00:01:36 +01:00
										 |  |  | value of type :data:`Any` and assign it to any variable::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  |    from typing import Any
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-18 10:23:51 +00:00
										 |  |  |    a: Any = None
 | 
					
						
							|  |  |  |    a = []          # OK
 | 
					
						
							|  |  |  |    a = 2           # OK
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-20 04:48:35 +00:00
										 |  |  |    s: str = ''
 | 
					
						
							| 
									
										
										
										
											2021-12-18 10:23:51 +00:00
										 |  |  |    s = a           # OK
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    def foo(item: Any) -> int:
 | 
					
						
							| 
									
										
										
										
											2022-10-11 19:37:58 -07:00
										 |  |  |        # Passes type checking; 'item' could be any type,
 | 
					
						
							| 
									
										
										
										
											2016-08-08 13:34:49 +03:00
										 |  |  |        # and that type might have a 'bar' method
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  |        item.bar()
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 19:37:58 -07:00
										 |  |  | Notice that no type checking is performed when assigning a value of type
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | :data:`Any` to a more precise type. For example, the static type checker did
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  | not report an error when assigning ``a`` to ``s`` even though ``s`` was
 | 
					
						
							|  |  |  | declared to be of type :class:`str` and receives an :class:`int` value at
 | 
					
						
							|  |  |  | runtime!
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Furthermore, all functions without a return type or parameter types will
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | implicitly default to using :data:`Any`::
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    def legacy_parser(text):
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  |        return data
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    # A static type checker will treat the above
 | 
					
						
							|  |  |  |    # as having the same signature as:
 | 
					
						
							|  |  |  |    def legacy_parser(text: Any) -> Any:
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  |        return data
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | This behavior allows :data:`Any` to be used as an *escape hatch* when you
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  | need to mix dynamically and statically typed code.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | Contrast the behavior of :data:`Any` with the behavior of :class:`object`.
 | 
					
						
							|  |  |  | Similar to :data:`Any`, every type is a subtype of :class:`object`. However,
 | 
					
						
							|  |  |  | unlike :data:`Any`, the reverse is not true: :class:`object` is *not* a
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  | subtype of every other type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | That means when the type of a value is :class:`object`, a type checker will
 | 
					
						
							|  |  |  | reject almost all operations on it, and assigning it to a variable (or using
 | 
					
						
							|  |  |  | it as a return value) of a more specialized type is a type error. For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def hash_a(item: object) -> int:
 | 
					
						
							| 
									
										
										
										
											2022-10-11 19:37:58 -07:00
										 |  |  |        # Fails type checking; an object does not have a 'magic' method.
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  |        item.magic()
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def hash_b(item: Any) -> int:
 | 
					
						
							| 
									
										
										
										
											2022-10-11 19:37:58 -07:00
										 |  |  |        # Passes type checking
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  |        item.magic()
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 19:37:58 -07:00
										 |  |  |    # Passes type checking, since ints and strs are subclasses of object
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  |    hash_a(42)
 | 
					
						
							|  |  |  |    hash_a("foo")
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 19:37:58 -07:00
										 |  |  |    # Passes type checking, since Any is compatible with all types
 | 
					
						
							| 
									
										
										
										
											2016-08-06 13:46:48 -07:00
										 |  |  |    hash_b(42)
 | 
					
						
							|  |  |  |    hash_b("foo")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Use :class:`object` to indicate that a value could be any type in a typesafe
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | manner. Use :data:`Any` to indicate that a value is dynamically typed.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Nominal vs structural subtyping
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | ===============================
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  | Initially :pep:`484` defined the Python static type system as using
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | *nominal subtyping*. This means that a class ``A`` is allowed where
 | 
					
						
							|  |  |  | a class ``B`` is expected if and only if ``A`` is a subclass of ``B``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This requirement previously also applied to abstract base classes, such as
 | 
					
						
							| 
									
										
										
										
											2020-10-03 12:51:13 -03:00
										 |  |  | :class:`~collections.abc.Iterable`. The problem with this approach is that a class had
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | to be explicitly marked to support them, which is unpythonic and unlike
 | 
					
						
							|  |  |  | what one would normally do in idiomatic dynamically typed Python code.
 | 
					
						
							| 
									
										
										
										
											2020-10-03 12:51:13 -03:00
										 |  |  | For example, this conforms to :pep:`484`::
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    from collections.abc import Sized, Iterable, Iterator
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    class Bucket(Sized, Iterable[int]):
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  |        def __len__(self) -> int: ...
 | 
					
						
							|  |  |  |        def __iter__(self) -> Iterator[int]: ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :pep:`544` allows to solve this problem by allowing users to write
 | 
					
						
							|  |  |  | the above code without explicit base classes in the class definition,
 | 
					
						
							|  |  |  | allowing ``Bucket`` to be implicitly considered a subtype of both ``Sized``
 | 
					
						
							|  |  |  | and ``Iterable[int]`` by static type checkers. This is known as
 | 
					
						
							|  |  |  | *structural subtyping* (or static duck-typing)::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |    from collections.abc import Iterator, Iterable
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    class Bucket:  # Note: no base classes
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  |        def __len__(self) -> int: ...
 | 
					
						
							|  |  |  |        def __iter__(self) -> Iterator[int]: ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def collect(items: Iterable[int]) -> int: ...
 | 
					
						
							|  |  |  |    result = collect(Bucket())  # Passes type check
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Moreover, by subclassing a special class :class:`Protocol`, a user
 | 
					
						
							|  |  |  | can define new custom protocols to fully enjoy structural subtyping
 | 
					
						
							|  |  |  | (see examples below).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Module contents
 | 
					
						
							|  |  |  | ===============
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | The module defines the following classes, functions and decorators.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. note::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    This module defines several types that are subclasses of pre-existing
 | 
					
						
							|  |  |  |    standard library classes which also extend :class:`Generic`
 | 
					
						
							|  |  |  |    to support type variables inside ``[]``.
 | 
					
						
							|  |  |  |    These types became redundant in Python 3.9 when the
 | 
					
						
							|  |  |  |    corresponding pre-existing classes were enhanced to support ``[]``.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    The redundant types are deprecated as of Python 3.9 but no
 | 
					
						
							|  |  |  |    deprecation warnings will be issued by the interpreter.
 | 
					
						
							|  |  |  |    It is expected that type checkers will flag the deprecated types
 | 
					
						
							|  |  |  |    when the checked program targets Python 3.9 or newer.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    The deprecated types will be removed from the :mod:`typing` module
 | 
					
						
							|  |  |  |    in the first Python version released 5 years after the release of Python 3.9.0.
 | 
					
						
							|  |  |  |    See details in :pep:`585`—*Type Hinting Generics In Standard Collections*.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Special typing primitives
 | 
					
						
							|  |  |  | -------------------------
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Special types
 | 
					
						
							|  |  |  | """""""""""""
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | These can be used as types in annotations and do not support ``[]``.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: Any
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Special type indicating an unconstrained type.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    * Every type is compatible with :data:`Any`.
 | 
					
						
							|  |  |  |    * :data:`Any` is compatible with every type.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       :data:`Any` can now be used as a base class. This can be useful for
 | 
					
						
							|  |  |  |       avoiding type checker errors with classes that can duck type anywhere or
 | 
					
						
							|  |  |  |       are highly dynamic.
 | 
					
						
							| 
									
										
										
										
											2022-04-04 19:35:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-05 07:21:03 -07:00
										 |  |  | .. data:: LiteralString
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Special type that includes only literal strings. A string
 | 
					
						
							|  |  |  |    literal is compatible with ``LiteralString``, as is another
 | 
					
						
							|  |  |  |    ``LiteralString``, but an object typed as just ``str`` is not.
 | 
					
						
							|  |  |  |    A string created by composing ``LiteralString``-typed objects
 | 
					
						
							|  |  |  |    is also acceptable as a ``LiteralString``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def run_query(sql: LiteralString) -> ...
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def caller(arbitrary_string: str, literal_string: LiteralString) -> None:
 | 
					
						
							|  |  |  |           run_query("SELECT * FROM students")  # ok
 | 
					
						
							|  |  |  |           run_query(literal_string)  # ok
 | 
					
						
							|  |  |  |           run_query("SELECT * FROM " + literal_string)  # ok
 | 
					
						
							|  |  |  |           run_query(arbitrary_string)  # type checker error
 | 
					
						
							|  |  |  |           run_query(  # type checker error
 | 
					
						
							|  |  |  |               f"SELECT * FROM students WHERE name = {arbitrary_string}"
 | 
					
						
							|  |  |  |           )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This is useful for sensitive APIs where arbitrary user-generated
 | 
					
						
							|  |  |  |    strings could generate problems. For example, the two cases above
 | 
					
						
							|  |  |  |    that generate type checker errors could be vulnerable to an SQL
 | 
					
						
							|  |  |  |    injection attack.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 22:08:07 +02:00
										 |  |  |    See :pep:`675` for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-22 15:28:39 +01:00
										 |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-08 10:50:26 -08:00
										 |  |  | .. data:: Never
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The `bottom type <https://en.wikipedia.org/wiki/Bottom_type>`_,
 | 
					
						
							|  |  |  |    a type that has no members.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This can be used to define a function that should never be
 | 
					
						
							|  |  |  |    called, or a function that never returns::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      from typing import Never
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      def never_call_me(arg: Never) -> None:
 | 
					
						
							|  |  |  |          pass
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      def int_or_str(arg: int | str) -> None:
 | 
					
						
							|  |  |  |          never_call_me(arg)  # type checker error
 | 
					
						
							|  |  |  |          match arg:
 | 
					
						
							|  |  |  |              case int():
 | 
					
						
							|  |  |  |                  print("It's an int")
 | 
					
						
							|  |  |  |              case str():
 | 
					
						
							|  |  |  |                  print("It's a str")
 | 
					
						
							|  |  |  |              case _:
 | 
					
						
							|  |  |  |                  never_call_me(arg)  # ok, arg is of type Never
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       On older Python versions, :data:`NoReturn` may be used to express the
 | 
					
						
							|  |  |  |       same concept. ``Never`` was added to make the intended meaning more explicit.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: NoReturn
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Special type indicating that a function never returns.
 | 
					
						
							|  |  |  |    For example::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       from typing import NoReturn
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def stop() -> NoReturn:
 | 
					
						
							|  |  |  |           raise RuntimeError('no way')
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-08 10:50:26 -08:00
										 |  |  |    ``NoReturn`` can also be used as a
 | 
					
						
							|  |  |  |    `bottom type <https://en.wikipedia.org/wiki/Bottom_type>`_, a type that
 | 
					
						
							|  |  |  |    has no values. Starting in Python 3.11, the :data:`Never` type should
 | 
					
						
							|  |  |  |    be used for this concept instead. Type checkers should treat the two
 | 
					
						
							|  |  |  |    equivalently.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.4
 | 
					
						
							|  |  |  |    .. versionadded:: 3.6.2
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-07 20:47:48 +00:00
										 |  |  | .. data:: Self
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Special type to represent the current enclosed class.
 | 
					
						
							|  |  |  |    For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       from typing import Self
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Foo:
 | 
					
						
							| 
									
										
										
										
											2022-07-12 20:45:52 +03:00
										 |  |  |          def return_self(self) -> Self:
 | 
					
						
							| 
									
										
										
										
											2022-02-07 20:47:48 +00:00
										 |  |  |             ...
 | 
					
						
							|  |  |  |             return self
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This annotation is semantically equivalent to the following,
 | 
					
						
							|  |  |  |    albeit in a more succinct fashion::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       from typing import TypeVar
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Self = TypeVar("Self", bound="Foo")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Foo:
 | 
					
						
							| 
									
										
										
										
											2022-07-12 20:45:52 +03:00
										 |  |  |          def return_self(self: Self) -> Self:
 | 
					
						
							| 
									
										
										
										
											2022-02-07 20:47:48 +00:00
										 |  |  |             ...
 | 
					
						
							|  |  |  |             return self
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    In general if something currently follows the pattern of::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Foo:
 | 
					
						
							|  |  |  |          def return_self(self) -> "Foo":
 | 
					
						
							|  |  |  |             ...
 | 
					
						
							|  |  |  |             return self
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-12 20:45:52 +03:00
										 |  |  |    You should use :data:`Self` as calls to ``SubclassOfFoo.return_self`` would have
 | 
					
						
							| 
									
										
										
										
											2022-02-07 20:47:48 +00:00
										 |  |  |    ``Foo`` as the return type and not ``SubclassOfFoo``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Other common use cases include:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    - :class:`classmethod`\s that are used as alternative constructors and return instances
 | 
					
						
							|  |  |  |      of the ``cls`` parameter.
 | 
					
						
							|  |  |  |    - Annotating an :meth:`~object.__enter__` method which returns self.
 | 
					
						
							| 
									
										
										
										
											2022-02-07 20:47:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    For more information, see :pep:`673`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 00:44:31 +03:00
										 |  |  | .. data:: TypeAlias
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Special annotation for explicitly declaring a :ref:`type alias <type-aliases>`.
 | 
					
						
							|  |  |  |    For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     from typing import TypeAlias
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Factors: TypeAlias = list[int]
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-16 23:34:01 -03:00
										 |  |  |    See :pep:`613` for more details about explicit type aliases.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 00:44:31 +03:00
										 |  |  |    .. versionadded:: 3.10
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Special forms
 | 
					
						
							|  |  |  | """""""""""""
 | 
					
						
							| 
									
										
										
										
											2015-09-10 21:55:50 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | These can be used as types in annotations using ``[]``, each having a unique syntax.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: Tuple
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Tuple type; ``Tuple[X, Y]`` is the type of a tuple of two items
 | 
					
						
							|  |  |  |    with the first item of type X and the second of type Y. The type of
 | 
					
						
							|  |  |  |    the empty tuple can be written as ``Tuple[()]``.
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Example: ``Tuple[T1, T2]`` is a tuple of two elements corresponding
 | 
					
						
							|  |  |  |    to type variables T1 and T2.  ``Tuple[int, float, str]`` is a tuple
 | 
					
						
							|  |  |  |    of an int, a float and a string.
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    To specify a variable-length tuple of homogeneous type,
 | 
					
						
							|  |  |  |    use literal ellipsis, e.g. ``Tuple[int, ...]``. A plain :data:`Tuple`
 | 
					
						
							|  |  |  |    is equivalent to ``Tuple[Any, ...]``, and in turn to :class:`tuple`.
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`builtins.tuple <tuple>` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: Union
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |    Union type; ``Union[X, Y]`` is equivalent to ``X | Y`` and means either X or Y.
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-25 00:36:09 +03:00
										 |  |  |    To define a union, use e.g. ``Union[int, str]`` or the shorthand ``int | str``. Using that shorthand is recommended. Details:
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    * The arguments must be types and there must be at least one.
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    * Unions of unions are flattened, e.g.::
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        Union[Union[int, str], float] == Union[int, str, float]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * Unions of a single argument vanish, e.g.::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        Union[int] == int  # The constructor actually returns int
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * Redundant arguments are skipped, e.g.::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |        Union[int, str, int] == Union[int, str] == int | str
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * When comparing unions, the argument order is ignored, e.g.::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        Union[int, str] == Union[str, int]
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |    * You cannot subclass or instantiate a ``Union``.
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * You cannot write ``Union[X][Y]``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       Don't remove explicit subclasses from unions at runtime.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-05 12:40:52 +08:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Unions can now be written as ``X | Y``. See
 | 
					
						
							|  |  |  |       :ref:`union type expressions<types-union>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: Optional
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Optional type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |    ``Optional[X]`` is equivalent to ``X | None`` (or ``Union[X, None]``).
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Note that this is not the same concept as an optional argument,
 | 
					
						
							|  |  |  |    which is one that has a default.  An optional argument with a
 | 
					
						
							|  |  |  |    default does not require the ``Optional`` qualifier on its type
 | 
					
						
							|  |  |  |    annotation just because it is optional. For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def foo(arg: int = 0) -> None:
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    On the other hand, if an explicit value of ``None`` is allowed, the
 | 
					
						
							|  |  |  |    use of ``Optional`` is appropriate, whether the argument is optional
 | 
					
						
							|  |  |  |    or not. For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def foo(arg: Optional[int] = None) -> None:
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Optional can now be written as ``X | None``. See
 | 
					
						
							|  |  |  |       :ref:`union type expressions<types-union>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: Callable
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Callable type; ``Callable[[int], str]`` is a function of (int) -> str.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The subscription syntax must always be used with exactly two
 | 
					
						
							|  |  |  |    values: the argument list and the return type.  The argument list
 | 
					
						
							|  |  |  |    must be a list of types or an ellipsis; the return type must be
 | 
					
						
							|  |  |  |    a single type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    There is no syntax to indicate optional or keyword arguments;
 | 
					
						
							|  |  |  |    such function types are rarely used as callback types.
 | 
					
						
							|  |  |  |    ``Callable[..., ReturnType]`` (literal ellipsis) can be used to
 | 
					
						
							|  |  |  |    type hint a callable taking any number of arguments and returning
 | 
					
						
							|  |  |  |    ``ReturnType``.  A plain :data:`Callable` is equivalent to
 | 
					
						
							|  |  |  |    ``Callable[..., Any]``, and in turn to
 | 
					
						
							|  |  |  |    :class:`collections.abc.Callable`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  |    Callables which take other callables as arguments may indicate that their
 | 
					
						
							|  |  |  |    parameter types are dependent on each other using :class:`ParamSpec`.
 | 
					
						
							|  |  |  |    Additionally, if that callable adds or removes arguments from other
 | 
					
						
							|  |  |  |    callables, the :data:`Concatenate` operator may be used.  They
 | 
					
						
							|  |  |  |    take the form ``Callable[ParamSpecVariable, ReturnType]`` and
 | 
					
						
							|  |  |  |    ``Callable[Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable], ReturnType]``
 | 
					
						
							|  |  |  |    respectively.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Callable` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       ``Callable`` now supports :class:`ParamSpec` and :data:`Concatenate`.
 | 
					
						
							|  |  |  |       See :pep:`612` for more information.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. seealso::
 | 
					
						
							|  |  |  |       The documentation for :class:`ParamSpec` and :class:`Concatenate` provide
 | 
					
						
							|  |  |  |       examples of usage with ``Callable``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. data:: Concatenate
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Used with :data:`Callable` and :class:`ParamSpec` to type annotate a higher
 | 
					
						
							|  |  |  |    order callable which adds, removes, or transforms parameters of another
 | 
					
						
							|  |  |  |    callable.  Usage is in the form
 | 
					
						
							|  |  |  |    ``Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]``. ``Concatenate``
 | 
					
						
							|  |  |  |    is currently only valid when used as the first argument to a :data:`Callable`.
 | 
					
						
							| 
									
										
										
										
											2022-04-30 00:01:40 +03:00
										 |  |  |    The last parameter to ``Concatenate`` must be a :class:`ParamSpec` or
 | 
					
						
							|  |  |  |    ellipsis (``...``).
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |    For example, to annotate a decorator ``with_lock`` which provides a
 | 
					
						
							|  |  |  |    :class:`threading.Lock` to the decorated function,  ``Concatenate`` can be
 | 
					
						
							|  |  |  |    used to indicate that ``with_lock`` expects a callable which takes in a
 | 
					
						
							|  |  |  |    ``Lock`` as the first argument, and returns a callable with a different type
 | 
					
						
							|  |  |  |    signature.  In this case, the :class:`ParamSpec` indicates that the returned
 | 
					
						
							|  |  |  |    callable's parameter types are dependent on the parameter types of the
 | 
					
						
							|  |  |  |    callable being passed in::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       from collections.abc import Callable
 | 
					
						
							|  |  |  |       from threading import Lock
 | 
					
						
							| 
									
										
										
										
											2022-01-11 13:59:26 +00:00
										 |  |  |       from typing import Concatenate, ParamSpec, TypeVar
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       P = ParamSpec('P')
 | 
					
						
							| 
									
										
										
										
											2021-01-11 08:11:41 +08:00
										 |  |  |       R = TypeVar('R')
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       # Use this lock to ensure that only one thread is executing a function
 | 
					
						
							|  |  |  |       # at any time.
 | 
					
						
							|  |  |  |       my_lock = Lock()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def with_lock(f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]:
 | 
					
						
							|  |  |  |           '''A type-safe decorator which provides a lock.'''
 | 
					
						
							| 
									
										
										
										
											2021-01-08 15:08:21 -03:00
										 |  |  |           def inner(*args: P.args, **kwargs: P.kwargs) -> R:
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  |               # Provide the lock as the first argument.
 | 
					
						
							|  |  |  |               return f(my_lock, *args, **kwargs)
 | 
					
						
							|  |  |  |           return inner
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @with_lock
 | 
					
						
							|  |  |  |       def sum_threadsafe(lock: Lock, numbers: list[float]) -> float:
 | 
					
						
							|  |  |  |           '''Add a list of numbers together in a thread-safe manner.'''
 | 
					
						
							|  |  |  |           with lock:
 | 
					
						
							|  |  |  |               return sum(numbers)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # We don't need to pass in the lock ourselves thanks to the decorator.
 | 
					
						
							|  |  |  |       sum_threadsafe([1.1, 2.2, 3.3])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. versionadded:: 3.10
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * :pep:`612` -- Parameter Specification Variables (the PEP which introduced
 | 
					
						
							|  |  |  |      ``ParamSpec`` and ``Concatenate``).
 | 
					
						
							|  |  |  |    * :class:`ParamSpec` and :class:`Callable`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | .. class:: Type(Generic[CT_co])
 | 
					
						
							| 
									
										
										
										
											2016-09-06 21:12:44 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    A variable annotated with ``C`` may accept a value of type ``C``. In
 | 
					
						
							|  |  |  |    contrast, a variable annotated with ``Type[C]`` may accept values that are
 | 
					
						
							|  |  |  |    classes themselves -- specifically, it will accept the *class object* of
 | 
					
						
							|  |  |  |    ``C``. For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       a = 3         # Has type 'int'
 | 
					
						
							|  |  |  |       b = int       # Has type 'Type[int]'
 | 
					
						
							|  |  |  |       c = type(a)   # Also has type 'Type[int]'
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Note that ``Type[C]`` is covariant::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class User: ...
 | 
					
						
							|  |  |  |       class BasicUser(User): ...
 | 
					
						
							|  |  |  |       class ProUser(User): ...
 | 
					
						
							|  |  |  |       class TeamUser(User): ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Accepts User, BasicUser, ProUser, TeamUser, ...
 | 
					
						
							|  |  |  |       def make_new_user(user_class: Type[User]) -> User:
 | 
					
						
							|  |  |  |           # ...
 | 
					
						
							|  |  |  |           return user_class()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The fact that ``Type[C]`` is covariant implies that all subclasses of
 | 
					
						
							|  |  |  |    ``C`` should implement the same constructor signature and class method
 | 
					
						
							|  |  |  |    signatures as ``C``. The type checker should flag violations of this,
 | 
					
						
							|  |  |  |    but should also allow constructor calls in subclasses that match the
 | 
					
						
							|  |  |  |    constructor calls in the indicated base class. How the type checker is
 | 
					
						
							|  |  |  |    required to handle this particular case may change in future revisions of
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  |    :pep:`484`.
 | 
					
						
							| 
									
										
										
										
											2016-09-06 21:12:44 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-26 08:13:28 -07:00
										 |  |  |    The only legal parameters for :class:`Type` are classes, :data:`Any`,
 | 
					
						
							|  |  |  |    :ref:`type variables <generics>`, and unions of any of these types.
 | 
					
						
							|  |  |  |    For example::
 | 
					
						
							| 
									
										
										
										
											2016-09-06 21:12:44 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |       def new_non_team_user(user_class: Type[BasicUser | ProUser]): ...
 | 
					
						
							| 
									
										
										
										
											2016-09-06 21:12:44 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    ``Type[Any]`` is equivalent to ``Type`` which in turn is equivalent
 | 
					
						
							|  |  |  |    to ``type``, which is the root of Python's metaclass hierarchy.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-26 23:23:02 +01:00
										 |  |  |    .. versionadded:: 3.5.2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`builtins.type <type>` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: Literal
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A type that can be used to indicate to type checkers that the
 | 
					
						
							|  |  |  |    corresponding variable or function parameter has a value equivalent to
 | 
					
						
							|  |  |  |    the provided literal (or one of several literals). For example::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def validate_simple(data: Any) -> Literal[True]:  # always returns True
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       MODE = Literal['r', 'rb', 'w', 'wb']
 | 
					
						
							|  |  |  |       def open_helper(file: str, mode: MODE) -> str:
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							| 
									
										
										
										
											2016-04-04 10:59:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       open_helper('/some/path', 'r')  # Passes type check
 | 
					
						
							|  |  |  |       open_helper('/other/path', 'typo')  # Error in type checker
 | 
					
						
							| 
									
										
										
										
											2016-04-04 10:59:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    ``Literal[...]`` cannot be subclassed. At runtime, an arbitrary value
 | 
					
						
							|  |  |  |    is allowed as type argument to ``Literal[...]``, but type checkers may
 | 
					
						
							|  |  |  |    impose restrictions. See :pep:`586` for more details about literal types.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.8
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 00:37:26 +07:00
										 |  |  |    .. versionchanged:: 3.9.1
 | 
					
						
							| 
									
										
										
										
											2021-05-04 01:54:12 -07:00
										 |  |  |       ``Literal`` now de-duplicates parameters.  Equality comparisons of
 | 
					
						
							| 
									
										
										
										
											2020-11-20 00:37:26 +07:00
										 |  |  |       ``Literal`` objects are no longer order dependent. ``Literal`` objects
 | 
					
						
							|  |  |  |       will now raise a :exc:`TypeError` exception during equality comparisons
 | 
					
						
							| 
									
										
										
										
											2021-05-04 01:54:12 -07:00
										 |  |  |       if one of their parameters are not :term:`hashable`.
 | 
					
						
							| 
									
										
										
										
											2020-11-20 00:37:26 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: ClassVar
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Special type construct to mark class variables.
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    As introduced in :pep:`526`, a variable annotation wrapped in ClassVar
 | 
					
						
							|  |  |  |    indicates that a given attribute is intended to be used as a class variable
 | 
					
						
							|  |  |  |    and should not be set on instances of that class. Usage::
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       class Starship:
 | 
					
						
							| 
									
										
										
										
											2020-10-03 19:10:59 -03:00
										 |  |  |           stats: ClassVar[dict[str, int]] = {} # class variable
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |           damage: int = 10                     # instance variable
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    :data:`ClassVar` accepts only types and cannot be further subscribed.
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    :data:`ClassVar` is not a class itself, and should not
 | 
					
						
							|  |  |  |    be used with :func:`isinstance` or :func:`issubclass`.
 | 
					
						
							|  |  |  |    :data:`ClassVar` does not change Python runtime behavior, but
 | 
					
						
							|  |  |  |    it can be used by third-party type checkers. For example, a type checker
 | 
					
						
							|  |  |  |    might flag the following code as an error::
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       enterprise_d = Starship(3000)
 | 
					
						
							|  |  |  |       enterprise_d.stats = {} # Error, setting class variable on instance
 | 
					
						
							|  |  |  |       Starship.stats = {}     # This is OK
 | 
					
						
							| 
									
										
										
										
											2019-05-22 07:23:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.3
 | 
					
						
							| 
									
										
										
										
											2019-05-22 07:23:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: Final
 | 
					
						
							| 
									
										
										
										
											2019-05-22 07:23:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A special typing construct to indicate to type checkers that a name
 | 
					
						
							|  |  |  |    cannot be re-assigned or overridden in a subclass. For example::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       MAX_SIZE: Final = 9000
 | 
					
						
							|  |  |  |       MAX_SIZE += 1  # Error reported by type checker
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       class Connection:
 | 
					
						
							|  |  |  |           TIMEOUT: Final[int] = 10
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       class FastConnector(Connection):
 | 
					
						
							|  |  |  |           TIMEOUT = 1  # Error reported by type checker
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    There is no runtime checking of these properties. See :pep:`591` for
 | 
					
						
							|  |  |  |    more details.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.8
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-27 16:11:45 -06:00
										 |  |  | .. data:: Required
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. data:: NotRequired
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Special typing constructs that mark individual keys of a :class:`TypedDict`
 | 
					
						
							|  |  |  |    as either required or non-required respectively.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    For more information, see :class:`TypedDict` and
 | 
					
						
							| 
									
										
										
										
											2022-07-05 05:16:10 -04:00
										 |  |  |    :pep:`655` ("Marking individual TypedDict items as required or potentially missing").
 | 
					
						
							| 
									
										
										
										
											2022-05-27 16:11:45 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: Annotated
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A type, introduced in :pep:`593` (``Flexible function and variable
 | 
					
						
							|  |  |  |    annotations``), to decorate existing types with context-specific metadata
 | 
					
						
							|  |  |  |    (possibly multiple pieces of it, as ``Annotated`` is variadic).
 | 
					
						
							|  |  |  |    Specifically, a type ``T`` can be annotated with metadata ``x`` via the
 | 
					
						
							|  |  |  |    typehint ``Annotated[T, x]``. This metadata can be used for either static
 | 
					
						
							|  |  |  |    analysis or at runtime. If a library (or tool) encounters a typehint
 | 
					
						
							|  |  |  |    ``Annotated[T, x]`` and has no special logic for metadata ``x``, it
 | 
					
						
							|  |  |  |    should ignore it and simply treat the type as ``T``. Unlike the
 | 
					
						
							|  |  |  |    ``no_type_check`` functionality that currently exists in the ``typing``
 | 
					
						
							|  |  |  |    module which completely disables typechecking annotations on a function
 | 
					
						
							|  |  |  |    or a class, the ``Annotated`` type allows for both static typechecking
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    of ``T`` (which can safely ignore ``x``)
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    together with runtime access to ``x`` within a specific application.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Ultimately, the responsibility of how to interpret the annotations (if
 | 
					
						
							|  |  |  |    at all) is the responsibility of the tool or library encountering the
 | 
					
						
							|  |  |  |    ``Annotated`` type. A tool or library encountering an ``Annotated`` type
 | 
					
						
							|  |  |  |    can scan through the annotations to determine if they are of interest
 | 
					
						
							|  |  |  |    (e.g., using ``isinstance()``).
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    When a tool or a library does not support annotations or encounters an
 | 
					
						
							|  |  |  |    unknown annotation it should just ignore it and treat annotated type as
 | 
					
						
							|  |  |  |    the underlying type.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    It's up to the tool consuming the annotations to decide whether the
 | 
					
						
							|  |  |  |    client is allowed to have several annotations on one type and how to
 | 
					
						
							|  |  |  |    merge those annotations.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Since the ``Annotated`` type allows you to put several annotations of
 | 
					
						
							|  |  |  |    the same (or different) type(s) on any node, the tools or libraries
 | 
					
						
							|  |  |  |    consuming those annotations are in charge of dealing with potential
 | 
					
						
							|  |  |  |    duplicates. For example, if you are doing value range analysis you might
 | 
					
						
							|  |  |  |    allow this::
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        T1 = Annotated[int, ValueRange(-10, 5)]
 | 
					
						
							|  |  |  |        T2 = Annotated[T1, ValueRange(-20, 3)]
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Passing ``include_extras=True`` to :func:`get_type_hints` lets one
 | 
					
						
							|  |  |  |    access the extra annotations at runtime.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    The details of the syntax:
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    * The first argument to ``Annotated`` must be a valid type
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    * Multiple type annotations are supported (``Annotated`` supports variadic
 | 
					
						
							|  |  |  |      arguments)::
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        Annotated[int, ValueRange(3, 10), ctype("char")]
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    * ``Annotated`` must be called with at least two arguments (
 | 
					
						
							|  |  |  |      ``Annotated[int]`` is not valid)
 | 
					
						
							| 
									
										
										
										
											2019-01-04 16:14:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    * The order of the annotations is preserved and matters for equality
 | 
					
						
							|  |  |  |      checks::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        Annotated[int, ValueRange(3, 10), ctype("char")] != Annotated[
 | 
					
						
							|  |  |  |            int, ctype("char"), ValueRange(3, 10)
 | 
					
						
							|  |  |  |        ]
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    * Nested ``Annotated`` types are flattened, with metadata ordered
 | 
					
						
							|  |  |  |      starting with the innermost annotation::
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[
 | 
					
						
							|  |  |  |            int, ValueRange(3, 10), ctype("char")
 | 
					
						
							|  |  |  |        ]
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    * Duplicated annotations are not removed::
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        Annotated[int, ValueRange(3, 10)] != Annotated[
 | 
					
						
							|  |  |  |            int, ValueRange(3, 10), ValueRange(3, 10)
 | 
					
						
							|  |  |  |        ]
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    * ``Annotated`` can be used with nested and generic aliases::
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        T = TypeVar('T')
 | 
					
						
							| 
									
										
										
										
											2020-10-03 19:10:59 -03:00
										 |  |  |        Vec = Annotated[list[tuple[T, T]], MaxLen(10)]
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        V = Vec[int]
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-03 19:10:59 -03:00
										 |  |  |        V == Annotated[list[tuple[int, int]], MaxLen(10)]
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.9
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-27 22:31:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. data:: TypeGuard
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Special typing form used to annotate the return type of a user-defined
 | 
					
						
							|  |  |  |    type guard function.  ``TypeGuard`` only accepts a single type argument.
 | 
					
						
							|  |  |  |    At runtime, functions marked this way should return a boolean.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static
 | 
					
						
							|  |  |  |    type checkers to determine a more precise type of an expression within a
 | 
					
						
							|  |  |  |    program's code flow.  Usually type narrowing is done by analyzing
 | 
					
						
							|  |  |  |    conditional code flow and applying the narrowing to a block of code.  The
 | 
					
						
							|  |  |  |    conditional expression here is sometimes referred to as a "type guard"::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |       def is_str(val: str | float):
 | 
					
						
							| 
									
										
										
										
											2021-04-27 22:31:04 +08:00
										 |  |  |           # "isinstance" type guard
 | 
					
						
							|  |  |  |           if isinstance(val, str):
 | 
					
						
							|  |  |  |               # Type of ``val`` is narrowed to ``str``
 | 
					
						
							|  |  |  |               ...
 | 
					
						
							|  |  |  |           else:
 | 
					
						
							|  |  |  |               # Else, type of ``val`` is narrowed to ``float``.
 | 
					
						
							|  |  |  |               ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Sometimes it would be convenient to use a user-defined boolean function
 | 
					
						
							|  |  |  |    as a type guard.  Such a function should use ``TypeGuard[...]`` as its
 | 
					
						
							|  |  |  |    return type to alert static type checkers to this intention.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Using  ``-> TypeGuard`` tells the static type checker that for a given
 | 
					
						
							|  |  |  |    function:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    1. The return value is a boolean.
 | 
					
						
							|  |  |  |    2. If the return value is ``True``, the type of its argument
 | 
					
						
							|  |  |  |       is the type inside ``TypeGuard``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    For example::
 | 
					
						
							| 
									
										
										
										
											2021-04-27 22:31:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-09 00:33:37 -03:00
										 |  |  |          def is_str_list(val: list[object]) -> TypeGuard[list[str]]:
 | 
					
						
							| 
									
										
										
										
											2021-04-27 22:31:04 +08:00
										 |  |  |              '''Determines whether all objects in the list are strings'''
 | 
					
						
							|  |  |  |              return all(isinstance(x, str) for x in val)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-09 00:33:37 -03:00
										 |  |  |          def func1(val: list[object]):
 | 
					
						
							| 
									
										
										
										
											2021-04-27 22:31:04 +08:00
										 |  |  |              if is_str_list(val):
 | 
					
						
							| 
									
										
										
										
											2021-10-09 00:33:37 -03:00
										 |  |  |                  # Type of ``val`` is narrowed to ``list[str]``.
 | 
					
						
							| 
									
										
										
										
											2021-04-27 22:31:04 +08:00
										 |  |  |                  print(" ".join(val))
 | 
					
						
							|  |  |  |              else:
 | 
					
						
							| 
									
										
										
										
											2021-10-09 00:33:37 -03:00
										 |  |  |                  # Type of ``val`` remains as ``list[object]``.
 | 
					
						
							| 
									
										
										
										
											2021-04-27 22:31:04 +08:00
										 |  |  |                  print("Not a list of strings!")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    If ``is_str_list`` is a class or instance method, then the type in
 | 
					
						
							|  |  |  |    ``TypeGuard`` maps to the type of the second parameter after ``cls`` or
 | 
					
						
							|  |  |  |    ``self``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    In short, the form ``def foo(arg: TypeA) -> TypeGuard[TypeB]: ...``,
 | 
					
						
							|  |  |  |    means that if ``foo(arg)`` returns ``True``, then ``arg`` narrows from
 | 
					
						
							|  |  |  |    ``TypeA`` to ``TypeB``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ``TypeB`` need not be a narrower form of ``TypeA`` -- it can even be a
 | 
					
						
							|  |  |  |       wider form. The main reason is to allow for things like
 | 
					
						
							| 
									
										
										
										
											2021-10-09 00:33:37 -03:00
										 |  |  |       narrowing ``list[object]`` to ``list[str]`` even though the latter
 | 
					
						
							|  |  |  |       is not a subtype of the former, since ``list`` is invariant.
 | 
					
						
							| 
									
										
										
										
											2021-04-27 23:55:08 +08:00
										 |  |  |       The responsibility of writing type-safe type guards is left to the user.
 | 
					
						
							| 
									
										
										
										
											2021-04-27 22:31:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |    ``TypeGuard`` also works with type variables.  For more information, see
 | 
					
						
							|  |  |  |    :pep:`647` (User-Defined Type Guards).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.10
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Building generic types
 | 
					
						
							|  |  |  | """"""""""""""""""""""
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | These are not used in annotations. They are building blocks for creating generic types.
 | 
					
						
							| 
									
										
										
										
											2017-01-16 22:42:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Generic
 | 
					
						
							| 
									
										
										
										
											2017-01-16 22:42:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Abstract base class for generic types.
 | 
					
						
							| 
									
										
										
										
											2017-02-15 11:37:18 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic type is typically declared by inheriting from an
 | 
					
						
							|  |  |  |    instantiation of this class with one or more type variables.
 | 
					
						
							|  |  |  |    For example, a generic mapping type might be defined as::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       class Mapping(Generic[KT, VT]):
 | 
					
						
							|  |  |  |           def __getitem__(self, key: KT) -> VT:
 | 
					
						
							|  |  |  |               ...
 | 
					
						
							|  |  |  |               # Etc.
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    This class can then be used as follows::
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       X = TypeVar('X')
 | 
					
						
							|  |  |  |       Y = TypeVar('Y')
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def lookup_name(mapping: Mapping[X, Y], key: X, default: Y) -> Y:
 | 
					
						
							|  |  |  |           try:
 | 
					
						
							|  |  |  |               return mapping[key]
 | 
					
						
							|  |  |  |           except KeyError:
 | 
					
						
							|  |  |  |               return default
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: TypeVar
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |     Type variable.
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |     Usage::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       T = TypeVar('T')  # Can be anything
 | 
					
						
							| 
									
										
										
										
											2022-03-16 15:51:26 +00:00
										 |  |  |       S = TypeVar('S', bound=str)  # Can be any subtype of str
 | 
					
						
							|  |  |  |       A = TypeVar('A', str, bytes)  # Must be exactly str or bytes
 | 
					
						
							| 
									
										
										
										
											2016-11-24 11:56:00 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |     Type variables exist primarily for the benefit of static type
 | 
					
						
							|  |  |  |     checkers.  They serve as the parameters for generic types as well
 | 
					
						
							| 
									
										
										
										
											2020-09-07 02:29:38 -03:00
										 |  |  |     as for generic function definitions.  See :class:`Generic` for more
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |     information on generic types.  Generic functions work as follows::
 | 
					
						
							| 
									
										
										
										
											2016-11-24 11:56:00 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        def repeat(x: T, n: int) -> Sequence[T]:
 | 
					
						
							|  |  |  |            """Return a list containing n references to x."""
 | 
					
						
							|  |  |  |            return [x]*n
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 15:51:26 +00:00
										 |  |  |        def print_capitalized(x: S) -> S:
 | 
					
						
							|  |  |  |            """Print x capitalized, and return x."""
 | 
					
						
							|  |  |  |            print(x.capitalize())
 | 
					
						
							|  |  |  |            return x
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        def concatenate(x: A, y: A) -> A:
 | 
					
						
							|  |  |  |            """Add two strings or bytes objects together."""
 | 
					
						
							|  |  |  |            return x + y
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Note that type variables can be *bound*, *constrained*, or neither, but
 | 
					
						
							|  |  |  |     cannot be both bound *and* constrained.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Bound type variables and constrained type variables have different
 | 
					
						
							|  |  |  |     semantics in several important ways. Using a *bound* type variable means
 | 
					
						
							|  |  |  |     that the ``TypeVar`` will be solved using the most specific type possible::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        x = print_capitalized('a string')
 | 
					
						
							|  |  |  |        reveal_type(x)  # revealed type is str
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        class StringSubclass(str):
 | 
					
						
							|  |  |  |            pass
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        y = print_capitalized(StringSubclass('another string'))
 | 
					
						
							|  |  |  |        reveal_type(y)  # revealed type is StringSubclass
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        z = print_capitalized(45)  # error: int is not a subtype of str
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Type variables can be bound to concrete types, abstract types (ABCs or
 | 
					
						
							|  |  |  |     protocols), and even unions of types::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        U = TypeVar('U', bound=str|bytes)  # Can be any subtype of the union str|bytes
 | 
					
						
							|  |  |  |        V = TypeVar('V', bound=SupportsAbs)  # Can be anything with an __abs__ method
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Using a *constrained* type variable, however, means that the ``TypeVar``
 | 
					
						
							|  |  |  |     can only ever be solved as being exactly one of the constraints given::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        a = concatenate('one', 'two')
 | 
					
						
							|  |  |  |        reveal_type(a)  # revealed type is str
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        b = concatenate(StringSubclass('one'), StringSubclass('two'))
 | 
					
						
							|  |  |  |        reveal_type(b)  # revealed type is str, despite StringSubclass being passed in
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        c = concatenate('one', b'two')  # error: type variable 'A' can be either str or bytes in a function call, but not both
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |     At runtime, ``isinstance(x, T)`` will raise :exc:`TypeError`.  In general,
 | 
					
						
							|  |  |  |     :func:`isinstance` and :func:`issubclass` should not be used with types.
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |     Type variables may be marked covariant or contravariant by passing
 | 
					
						
							|  |  |  |     ``covariant=True`` or ``contravariant=True``.  See :pep:`484` for more
 | 
					
						
							| 
									
										
										
										
											2022-03-16 15:51:26 +00:00
										 |  |  |     details.  By default, type variables are invariant.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-05 00:37:01 +01:00
										 |  |  | .. class:: TypeVarTuple
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |     Type variable tuple. A specialized form of :class:`type variable <TypeVar>`
 | 
					
						
							| 
									
										
										
										
											2022-04-05 00:37:01 +01:00
										 |  |  |     that enables *variadic* generics.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     A normal type variable enables parameterization with a single type. A type
 | 
					
						
							|  |  |  |     variable tuple, in contrast, allows parameterization with an
 | 
					
						
							|  |  |  |     *arbitrary* number of types by acting like an *arbitrary* number of type
 | 
					
						
							|  |  |  |     variables wrapped in a tuple. For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         T = TypeVar('T')
 | 
					
						
							|  |  |  |         Ts = TypeVarTuple('Ts')
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-30 09:57:03 -05:00
										 |  |  |         def move_first_element_to_last(tup: tuple[T, *Ts]) -> tuple[*Ts, T]:
 | 
					
						
							|  |  |  |             return (*tup[1:], tup[0])
 | 
					
						
							| 
									
										
										
										
											2022-04-05 00:37:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # T is bound to int, Ts is bound to ()
 | 
					
						
							| 
									
										
										
										
											2022-08-30 09:57:03 -05:00
										 |  |  |         # Return value is (1,), which has type tuple[int]
 | 
					
						
							|  |  |  |         move_first_element_to_last(tup=(1,))
 | 
					
						
							| 
									
										
										
										
											2022-04-05 00:37:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # T is bound to int, Ts is bound to (str,)
 | 
					
						
							| 
									
										
										
										
											2022-08-30 09:57:03 -05:00
										 |  |  |         # Return value is ('spam', 1), which has type tuple[str, int]
 | 
					
						
							|  |  |  |         move_first_element_to_last(tup=(1, 'spam'))
 | 
					
						
							| 
									
										
										
										
											2022-04-05 00:37:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # T is bound to int, Ts is bound to (str, float)
 | 
					
						
							| 
									
										
										
										
											2022-08-30 09:57:03 -05:00
										 |  |  |         # Return value is ('spam', 3.0, 1), which has type tuple[str, float, int]
 | 
					
						
							|  |  |  |         move_first_element_to_last(tup=(1, 'spam', 3.0))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # This fails to type check (and fails at runtime)
 | 
					
						
							|  |  |  |         # because tuple[()] is not compatible with tuple[T, *Ts]
 | 
					
						
							|  |  |  |         # (at least one element is required)
 | 
					
						
							|  |  |  |         move_first_element_to_last(tup=())
 | 
					
						
							| 
									
										
										
										
											2022-04-05 00:37:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Note the use of the unpacking operator ``*`` in ``tuple[T, *Ts]``.
 | 
					
						
							|  |  |  |     Conceptually, you can think of ``Ts`` as a tuple of type variables
 | 
					
						
							|  |  |  |     ``(T1, T2, ...)``. ``tuple[T, *Ts]`` would then become
 | 
					
						
							|  |  |  |     ``tuple[T, *(T1, T2, ...)]``, which is equivalent to
 | 
					
						
							|  |  |  |     ``tuple[T, T1, T2, ...]``. (Note that in older versions of Python, you might
 | 
					
						
							|  |  |  |     see this written using :data:`Unpack <Unpack>` instead, as
 | 
					
						
							|  |  |  |     ``Unpack[Ts]``.)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Type variable tuples must *always* be unpacked. This helps distinguish type
 | 
					
						
							|  |  |  |     variable types from normal type variables::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x: Ts          # Not valid
 | 
					
						
							|  |  |  |         x: tuple[Ts]   # Not valid
 | 
					
						
							|  |  |  |         x: tuple[*Ts]  # The correct way to to do it
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Type variable tuples can be used in the same contexts as normal type
 | 
					
						
							|  |  |  |     variables. For example, in class definitions, arguments, and return types::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Shape = TypeVarTuple('Shape')
 | 
					
						
							|  |  |  |         class Array(Generic[*Shape]):
 | 
					
						
							|  |  |  |             def __getitem__(self, key: tuple[*Shape]) -> float: ...
 | 
					
						
							|  |  |  |             def __abs__(self) -> Array[*Shape]: ...
 | 
					
						
							|  |  |  |             def get_shape(self) -> tuple[*Shape]: ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Type variable tuples can be happily combined with normal type variables::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         DType = TypeVar('DType')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class Array(Generic[DType, *Shape]):  # This is fine
 | 
					
						
							|  |  |  |             pass
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class Array2(Generic[*Shape, DType]):  # This would also be fine
 | 
					
						
							|  |  |  |             pass
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         float_array_1d: Array[float, Height] = Array()     # Totally fine
 | 
					
						
							|  |  |  |         int_array_2d: Array[int, Height, Width] = Array()  # Yup, fine too
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     However, note that at most one type variable tuple may appear in a single
 | 
					
						
							|  |  |  |     list of type arguments or type parameters::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x: tuple[*Ts, *Ts]                     # Not valid
 | 
					
						
							|  |  |  |         class Array(Generic[*Shape, *Shape]):  # Not valid
 | 
					
						
							|  |  |  |             pass
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Finally, an unpacked type variable tuple can be used as the type annotation
 | 
					
						
							|  |  |  |     of ``*args``::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def call_soon(
 | 
					
						
							|  |  |  |                 callback: Callable[[*Ts], None],
 | 
					
						
							|  |  |  |                 *args: *Ts
 | 
					
						
							|  |  |  |         ) -> None:
 | 
					
						
							|  |  |  |             ...
 | 
					
						
							|  |  |  |             callback(*args)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     In contrast to non-unpacked annotations of ``*args`` - e.g. ``*args: int``,
 | 
					
						
							|  |  |  |     which would specify that *all* arguments are ``int`` - ``*args: *Ts``
 | 
					
						
							|  |  |  |     enables reference to the types of the *individual* arguments in ``*args``.
 | 
					
						
							|  |  |  |     Here, this allows us to ensure the types of the ``*args`` passed
 | 
					
						
							|  |  |  |     to ``call_soon`` match the types of the (positional) arguments of
 | 
					
						
							|  |  |  |     ``callback``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     For more details on type variable tuples, see :pep:`646`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. data:: Unpack
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-29 16:58:40 -06:00
										 |  |  |    A typing operator that conceptually marks an object as having been
 | 
					
						
							|  |  |  |    unpacked. For example, using the unpack operator ``*`` on a
 | 
					
						
							|  |  |  |    :class:`type variable tuple <TypeVarTuple>` is equivalent to using ``Unpack``
 | 
					
						
							|  |  |  |    to mark the type variable tuple as having been unpacked::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Ts = TypeVarTuple('Ts')
 | 
					
						
							|  |  |  |       tup: tuple[*Ts]
 | 
					
						
							|  |  |  |       # Effectively does:
 | 
					
						
							|  |  |  |       tup: tuple[Unpack[Ts]]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    In fact, ``Unpack`` can be used interchangeably with ``*`` in the context
 | 
					
						
							|  |  |  |    of types. You might see ``Unpack`` being used explicitly in older versions
 | 
					
						
							|  |  |  |    of Python, where ``*`` couldn't be used in certain places::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # In older versions of Python, TypeVarTuple and Unpack
 | 
					
						
							|  |  |  |       # are located in the `typing_extensions` backports package.
 | 
					
						
							|  |  |  |       from typing_extensions import TypeVarTuple, Unpack
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Ts = TypeVarTuple('Ts')
 | 
					
						
							|  |  |  |       tup: tuple[*Ts]         # Syntax error on Python <= 3.10!
 | 
					
						
							|  |  |  |       tup: tuple[Unpack[Ts]]  # Semantically equivalent, and backwards-compatible
 | 
					
						
							| 
									
										
										
										
											2022-04-05 00:37:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-22 15:28:39 +01:00
										 |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  | .. class:: ParamSpec(name, *, bound=None, covariant=False, contravariant=False)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Parameter specification variable.  A specialized version of
 | 
					
						
							|  |  |  |    :class:`type variables <TypeVar>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Usage::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       P = ParamSpec('P')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Parameter specification variables exist primarily for the benefit of static
 | 
					
						
							|  |  |  |    type checkers.  They are used to forward the parameter types of one
 | 
					
						
							|  |  |  |    callable to another callable -- a pattern commonly found in higher order
 | 
					
						
							|  |  |  |    functions and decorators.  They are only valid when used in ``Concatenate``,
 | 
					
						
							|  |  |  |    or as the first argument to ``Callable``, or as parameters for user-defined
 | 
					
						
							|  |  |  |    Generics.  See :class:`Generic` for more information on generic types.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    For example, to add basic logging to a function, one can create a decorator
 | 
					
						
							|  |  |  |    ``add_logging`` to log function calls.  The parameter specification variable
 | 
					
						
							|  |  |  |    tells the type checker that the callable passed into the decorator and the
 | 
					
						
							|  |  |  |    new callable returned by it have inter-dependent type parameters::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       from collections.abc import Callable
 | 
					
						
							|  |  |  |       from typing import TypeVar, ParamSpec
 | 
					
						
							|  |  |  |       import logging
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       T = TypeVar('T')
 | 
					
						
							|  |  |  |       P = ParamSpec('P')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def add_logging(f: Callable[P, T]) -> Callable[P, T]:
 | 
					
						
							|  |  |  |           '''A type-safe decorator to add logging to a function.'''
 | 
					
						
							|  |  |  |           def inner(*args: P.args, **kwargs: P.kwargs) -> T:
 | 
					
						
							|  |  |  |               logging.info(f'{f.__name__} was called')
 | 
					
						
							|  |  |  |               return f(*args, **kwargs)
 | 
					
						
							|  |  |  |           return inner
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @add_logging
 | 
					
						
							|  |  |  |       def add_two(x: float, y: float) -> float:
 | 
					
						
							|  |  |  |           '''Add two numbers together.'''
 | 
					
						
							|  |  |  |           return x + y
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Without ``ParamSpec``, the simplest way to annotate this previously was to
 | 
					
						
							|  |  |  |    use a :class:`TypeVar` with bound ``Callable[..., Any]``.  However this
 | 
					
						
							|  |  |  |    causes two problems:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    1. The type checker can't type check the ``inner`` function because
 | 
					
						
							|  |  |  |       ``*args`` and ``**kwargs`` have to be typed :data:`Any`.
 | 
					
						
							|  |  |  |    2. :func:`~cast` may be required in the body of the ``add_logging``
 | 
					
						
							|  |  |  |       decorator when returning the ``inner`` function, or the static type
 | 
					
						
							|  |  |  |       checker must be told to ignore the ``return inner``.
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: args
 | 
					
						
							|  |  |  |    .. attribute:: kwargs
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Since ``ParamSpec`` captures both positional and keyword parameters,
 | 
					
						
							|  |  |  |       ``P.args`` and ``P.kwargs`` can be used to split a ``ParamSpec`` into its
 | 
					
						
							|  |  |  |       components.  ``P.args`` represents the tuple of positional parameters in a
 | 
					
						
							|  |  |  |       given call and should only be used to annotate ``*args``.  ``P.kwargs``
 | 
					
						
							|  |  |  |       represents the mapping of keyword parameters to their values in a given call,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 19:57:05 -07:00
										 |  |  |       and should be only be used to annotate ``**kwargs``.  Both
 | 
					
						
							|  |  |  |       attributes require the annotated parameter to be in scope. At runtime,
 | 
					
						
							|  |  |  |       ``P.args`` and ``P.kwargs`` are instances respectively of
 | 
					
						
							|  |  |  |       :class:`ParamSpecArgs` and :class:`ParamSpecKwargs`.
 | 
					
						
							| 
									
										
										
										
											2021-01-02 08:45:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Parameter specification variables created with ``covariant=True`` or
 | 
					
						
							|  |  |  |    ``contravariant=True`` can be used to declare covariant or contravariant
 | 
					
						
							|  |  |  |    generic types.  The ``bound`` argument is also accepted, similar to
 | 
					
						
							|  |  |  |    :class:`TypeVar`.  However the actual semantics of these keywords are yet to
 | 
					
						
							|  |  |  |    be decided.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.10
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. note::
 | 
					
						
							|  |  |  |       Only parameter specification variables defined in global scope can
 | 
					
						
							|  |  |  |       be pickled.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. seealso::
 | 
					
						
							|  |  |  |       * :pep:`612` -- Parameter Specification Variables (the PEP which introduced
 | 
					
						
							|  |  |  |         ``ParamSpec`` and ``Concatenate``).
 | 
					
						
							|  |  |  |       * :class:`Callable` and :class:`Concatenate`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-10 19:57:05 -07:00
										 |  |  | .. data:: ParamSpecArgs
 | 
					
						
							|  |  |  | .. data:: ParamSpecKwargs
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Arguments and keyword arguments attributes of a :class:`ParamSpec`. The
 | 
					
						
							|  |  |  |    ``P.args`` attribute of a ``ParamSpec`` is an instance of ``ParamSpecArgs``,
 | 
					
						
							|  |  |  |    and ``P.kwargs`` is an instance of ``ParamSpecKwargs``. They are intended
 | 
					
						
							|  |  |  |    for runtime introspection and have no special meaning to static type checkers.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Calling :func:`get_origin` on either of these objects will return the
 | 
					
						
							|  |  |  |    original ``ParamSpec``::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       P = ParamSpec("P")
 | 
					
						
							|  |  |  |       get_origin(P.args)  # returns P
 | 
					
						
							|  |  |  |       get_origin(P.kwargs)  # returns P
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.10
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. data:: AnyStr
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 15:51:26 +00:00
										 |  |  |    ``AnyStr`` is a :class:`constrained type variable <TypeVar>` defined as
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    ``AnyStr = TypeVar('AnyStr', str, bytes)``.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    It is meant to be used for functions that may accept any kind of string
 | 
					
						
							|  |  |  |    without allowing different kinds of strings to mix. For example::
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def concat(a: AnyStr, b: AnyStr) -> AnyStr:
 | 
					
						
							|  |  |  |           return a + b
 | 
					
						
							| 
									
										
										
										
											2016-09-09 11:46:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       concat(u"foo", u"bar")  # Ok, output has type 'unicode'
 | 
					
						
							|  |  |  |       concat(b"foo", b"bar")  # Ok, output has type 'bytes'
 | 
					
						
							|  |  |  |       concat(u"foo", b"bar")  # Error, cannot mix unicode and bytes
 | 
					
						
							| 
									
										
										
										
											2016-09-09 11:46:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Protocol(Generic)
 | 
					
						
							| 
									
										
										
										
											2019-06-01 17:13:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Base class for protocol classes. Protocol classes are defined like this::
 | 
					
						
							| 
									
										
										
										
											2016-11-11 15:54:04 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       class Proto(Protocol):
 | 
					
						
							|  |  |  |           def meth(self) -> int:
 | 
					
						
							|  |  |  |               ...
 | 
					
						
							| 
									
										
										
										
											2016-11-11 15:54:04 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Such classes are primarily used with static type checkers that recognize
 | 
					
						
							|  |  |  |    structural subtyping (static duck-typing), for example::
 | 
					
						
							| 
									
										
										
										
											2016-11-11 15:54:04 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       class C:
 | 
					
						
							|  |  |  |           def meth(self) -> int:
 | 
					
						
							|  |  |  |               return 0
 | 
					
						
							| 
									
										
										
										
											2019-06-01 17:13:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def func(x: Proto) -> int:
 | 
					
						
							|  |  |  |           return x.meth()
 | 
					
						
							| 
									
										
										
										
											2016-09-09 11:46:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       func(C())  # Passes static type check
 | 
					
						
							| 
									
										
										
										
											2016-09-09 11:46:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    See :pep:`544` for details. Protocol classes decorated with
 | 
					
						
							|  |  |  |    :func:`runtime_checkable` (described later) act as simple-minded runtime
 | 
					
						
							|  |  |  |    protocols that check only the presence of given attributes, ignoring their
 | 
					
						
							|  |  |  |    type signatures.
 | 
					
						
							| 
									
										
										
										
											2019-06-01 17:13:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Protocol classes can be generic, for example::
 | 
					
						
							| 
									
										
										
										
											2016-09-09 11:46:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       class GenProto(Protocol[T]):
 | 
					
						
							|  |  |  |           def meth(self) -> T:
 | 
					
						
							|  |  |  |               ...
 | 
					
						
							| 
									
										
										
										
											2016-09-09 11:46:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.8
 | 
					
						
							| 
									
										
										
										
											2019-06-01 17:13:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. decorator:: runtime_checkable
 | 
					
						
							| 
									
										
										
										
											2016-04-08 12:15:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Mark a protocol class as a runtime protocol.
 | 
					
						
							| 
									
										
										
										
											2016-04-08 12:15:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Such a protocol can be used with :func:`isinstance` and :func:`issubclass`.
 | 
					
						
							|  |  |  |    This raises :exc:`TypeError` when applied to a non-protocol class.  This
 | 
					
						
							|  |  |  |    allows a simple-minded structural check, very similar to "one trick ponies"
 | 
					
						
							| 
									
										
										
										
											2020-10-02 20:15:28 -03:00
										 |  |  |    in :mod:`collections.abc` such as :class:`~collections.abc.Iterable`.  For example::
 | 
					
						
							| 
									
										
										
										
											2016-04-08 12:15:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       @runtime_checkable
 | 
					
						
							|  |  |  |       class Closable(Protocol):
 | 
					
						
							|  |  |  |           def close(self): ...
 | 
					
						
							| 
									
										
										
										
											2018-05-14 18:14:07 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       assert isinstance(open('/some/file'), Closable)
 | 
					
						
							| 
									
										
										
										
											2018-05-14 18:14:07 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. note::
 | 
					
						
							| 
									
										
										
										
											2018-05-14 18:14:07 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-05 12:23:42 -04:00
										 |  |  |         :func:`runtime_checkable` will check only the presence of the required
 | 
					
						
							|  |  |  |         methods, not their type signatures. For example, :class:`ssl.SSLObject`
 | 
					
						
							|  |  |  |         is a class, therefore it passes an :func:`issubclass`
 | 
					
						
							|  |  |  |         check against :data:`Callable`.  However, the
 | 
					
						
							|  |  |  |         :meth:`ssl.SSLObject.__init__` method exists only to raise a
 | 
					
						
							|  |  |  |         :exc:`TypeError` with a more informative message, therefore making
 | 
					
						
							|  |  |  |         it impossible to call (instantiate) :class:`ssl.SSLObject`.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.8
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Other special directives
 | 
					
						
							|  |  |  | """"""""""""""""""""""""
 | 
					
						
							| 
									
										
										
										
											2019-01-04 16:14:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | These are not used in annotations. They are building blocks for declaring types.
 | 
					
						
							| 
									
										
										
										
											2015-09-10 10:52:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: NamedTuple
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Typed version of :func:`collections.namedtuple`.
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Usage::
 | 
					
						
							| 
									
										
										
										
											2017-11-26 23:23:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        class Employee(NamedTuple):
 | 
					
						
							|  |  |  |            name: str
 | 
					
						
							|  |  |  |            id: int
 | 
					
						
							| 
									
										
										
										
											2018-12-02 17:53:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    This is equivalent to::
 | 
					
						
							| 
									
										
										
										
											2018-12-02 17:53:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        Employee = collections.namedtuple('Employee', ['name', 'id'])
 | 
					
						
							| 
									
										
										
										
											2018-12-02 17:53:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    To give a field a default value, you can assign to it in the class body::
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       class Employee(NamedTuple):
 | 
					
						
							|  |  |  |           name: str
 | 
					
						
							|  |  |  |           id: int = 3
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       employee = Employee('Guido')
 | 
					
						
							|  |  |  |       assert employee.id == 3
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Fields with a default value must come after any fields without a default.
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    The resulting class has an extra attribute ``__annotations__`` giving a
 | 
					
						
							|  |  |  |    dict that maps the field names to the field types.  (The field names are in
 | 
					
						
							|  |  |  |    the ``_fields`` attribute and the default values are in the
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    ``_field_defaults`` attribute, both of which are part of the :func:`~collections.namedtuple`
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    API.)
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    ``NamedTuple`` subclasses can also have docstrings and methods::
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       class Employee(NamedTuple):
 | 
					
						
							|  |  |  |           """Represents an employee."""
 | 
					
						
							|  |  |  |           name: str
 | 
					
						
							|  |  |  |           id: int = 3
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |           def __repr__(self) -> str:
 | 
					
						
							|  |  |  |               return f'<Employee {self.name}, id={self.id}>'
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 01:41:23 +03:00
										 |  |  |    ``NamedTuple`` subclasses can be generic::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Group(NamedTuple, Generic[T]):
 | 
					
						
							|  |  |  |           key: T
 | 
					
						
							|  |  |  |           group: list[T]
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-25 09:53:11 -07:00
										 |  |  |    Backward-compatible usage::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        Employee = NamedTuple('Employee', [('name', str), ('id', int)])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.6
 | 
					
						
							|  |  |  |       Added support for :pep:`526` variable annotation syntax.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-28 20:16:40 -08:00
										 |  |  |    .. versionchanged:: 3.6.1
 | 
					
						
							| 
									
										
										
										
											2017-04-08 09:09:14 -07:00
										 |  |  |       Added support for default values, methods, and docstrings.
 | 
					
						
							| 
									
										
										
										
											2017-01-28 20:16:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-18 09:53:56 -07:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							|  |  |  |       The ``_field_types`` and ``__annotations__`` attributes are
 | 
					
						
							|  |  |  |       now regular dictionaries instead of instances of ``OrderedDict``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-05 00:43:20 +03:00
										 |  |  |    .. versionchanged:: 3.9
 | 
					
						
							|  |  |  |       Removed the ``_field_types`` attribute in favor of the more
 | 
					
						
							|  |  |  |       standard ``__annotations__`` attribute which has the same information.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 01:41:23 +03:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Added support for generic namedtuples.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-24 16:53:49 +08:00
										 |  |  | .. class:: NewType(name, tp)
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-24 16:53:49 +08:00
										 |  |  |    A helper class to indicate a distinct type to a typechecker,
 | 
					
						
							|  |  |  |    see :ref:`distinct`. At runtime it returns an object that returns
 | 
					
						
							|  |  |  |    its argument when called.
 | 
					
						
							|  |  |  |    Usage::
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       UserId = NewType('UserId', int)
 | 
					
						
							|  |  |  |       first_user = UserId(1)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.5.2
 | 
					
						
							| 
									
										
										
										
											2020-04-05 00:43:20 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-30 16:55:09 +03:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							| 
									
										
										
										
											2021-07-24 16:53:49 +08:00
										 |  |  |       ``NewType`` is now a class rather than a function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:39:24 +01:00
										 |  |  | .. class:: TypedDict(dict)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Special construct to add type hints to a dictionary.
 | 
					
						
							|  |  |  |    At runtime it is a plain :class:`dict`.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:39:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    ``TypedDict`` declares a dictionary type that expects all of its
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:39:24 +01:00
										 |  |  |    instances to have a certain set of keys, where each key is
 | 
					
						
							|  |  |  |    associated with a value of a consistent type. This expectation
 | 
					
						
							|  |  |  |    is not checked at runtime but is only enforced by type checkers.
 | 
					
						
							|  |  |  |    Usage::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Point2D(TypedDict):
 | 
					
						
							|  |  |  |           x: int
 | 
					
						
							|  |  |  |           y: int
 | 
					
						
							|  |  |  |           label: str
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       a: Point2D = {'x': 1, 'y': 2, 'label': 'good'}  # OK
 | 
					
						
							|  |  |  |       b: Point2D = {'z': 3, 'label': 'bad'}           # Fails type check
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-27 23:02:14 -08:00
										 |  |  |    To allow using this feature with older versions of Python that do not
 | 
					
						
							|  |  |  |    support :pep:`526`, ``TypedDict`` supports two additional equivalent
 | 
					
						
							| 
									
										
										
										
											2022-02-17 11:26:07 +08:00
										 |  |  |    syntactic forms:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * Using a literal :class:`dict` as the second argument::
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:39:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-17 11:26:07 +08:00
										 |  |  |    * Using keyword arguments::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Point2D = TypedDict('Point2D', x=int, y=int, label=str)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. deprecated-removed:: 3.11 3.13
 | 
					
						
							|  |  |  |       The keyword-argument syntax is deprecated in 3.11 and will be removed
 | 
					
						
							|  |  |  |       in 3.13. It may also be unsupported by static type checkers.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 00:40:54 +08:00
										 |  |  |    The functional syntax should also be used when any of the keys are not valid
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    :ref:`identifiers <identifiers>`, for example because they are keywords or contain hyphens.
 | 
					
						
							| 
									
										
										
										
											2022-03-11 00:40:54 +08:00
										 |  |  |    Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # raises SyntaxError
 | 
					
						
							|  |  |  |       class Point2D(TypedDict):
 | 
					
						
							|  |  |  |           in: int  # 'in' is a keyword
 | 
					
						
							|  |  |  |           x-y: int  # name with hyphens
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # OK, functional syntax
 | 
					
						
							|  |  |  |       Point2D = TypedDict('Point2D', {'in': int, 'x-y': int})
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-27 23:02:14 -08:00
										 |  |  |    By default, all keys must be present in a ``TypedDict``. It is possible to
 | 
					
						
							| 
									
										
										
										
											2022-05-27 16:11:45 -06:00
										 |  |  |    mark individual keys as non-required using :data:`NotRequired`::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Point2D(TypedDict):
 | 
					
						
							|  |  |  |           x: int
 | 
					
						
							|  |  |  |           y: int
 | 
					
						
							|  |  |  |           label: NotRequired[str]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Alternative syntax
 | 
					
						
							|  |  |  |       Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': NotRequired[str]})
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This means that a ``Point2D`` ``TypedDict`` can have the ``label``
 | 
					
						
							|  |  |  |    key omitted.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    It is also possible to mark all keys as non-required by default
 | 
					
						
							|  |  |  |    by specifying a totality of ``False``::
 | 
					
						
							| 
									
										
										
										
											2020-02-19 10:03:05 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-27 23:02:14 -08:00
										 |  |  |       class Point2D(TypedDict, total=False):
 | 
					
						
							| 
									
										
										
										
											2020-02-19 10:03:05 +05:30
										 |  |  |           x: int
 | 
					
						
							|  |  |  |           y: int
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-17 11:26:07 +08:00
										 |  |  |       # Alternative syntax
 | 
					
						
							|  |  |  |       Point2D = TypedDict('Point2D', {'x': int, 'y': int}, total=False)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-27 23:02:14 -08:00
										 |  |  |    This means that a ``Point2D`` ``TypedDict`` can have any of the keys
 | 
					
						
							|  |  |  |    omitted. A type checker is only expected to support a literal ``False`` or
 | 
					
						
							|  |  |  |    ``True`` as the value of the ``total`` argument. ``True`` is the default,
 | 
					
						
							|  |  |  |    and makes all items defined in the class body required.
 | 
					
						
							| 
									
										
										
										
											2020-02-19 10:03:05 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-27 16:11:45 -06:00
										 |  |  |    Individual keys of a ``total=False`` ``TypedDict`` can be marked as
 | 
					
						
							|  |  |  |    required using :data:`Required`::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Point2D(TypedDict, total=False):
 | 
					
						
							|  |  |  |           x: Required[int]
 | 
					
						
							|  |  |  |           y: Required[int]
 | 
					
						
							|  |  |  |           label: str
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Alternative syntax
 | 
					
						
							|  |  |  |       Point2D = TypedDict('Point2D', {
 | 
					
						
							|  |  |  |           'x': Required[int],
 | 
					
						
							|  |  |  |           'y': Required[int],
 | 
					
						
							|  |  |  |           'label': str
 | 
					
						
							|  |  |  |       }, total=False)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 00:40:54 +08:00
										 |  |  |    It is possible for a ``TypedDict`` type to inherit from one or more other ``TypedDict`` types
 | 
					
						
							|  |  |  |    using the class-based syntax.
 | 
					
						
							|  |  |  |    Usage::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Point3D(Point2D):
 | 
					
						
							|  |  |  |           z: int
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    ``Point3D`` has three items: ``x``, ``y`` and ``z``. It is equivalent to this
 | 
					
						
							|  |  |  |    definition::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Point3D(TypedDict):
 | 
					
						
							|  |  |  |           x: int
 | 
					
						
							|  |  |  |           y: int
 | 
					
						
							|  |  |  |           z: int
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    A ``TypedDict`` cannot inherit from a non-\ ``TypedDict`` class,
 | 
					
						
							| 
									
										
										
										
											2022-05-03 18:51:42 +05:30
										 |  |  |    except for :class:`Generic`. For example::
 | 
					
						
							| 
									
										
										
										
											2022-03-11 00:40:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       class X(TypedDict):
 | 
					
						
							|  |  |  |           x: int
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Y(TypedDict):
 | 
					
						
							|  |  |  |           y: int
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Z(object): pass  # A non-TypedDict class
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class XY(X, Y): pass  # OK
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class XZ(X, Z): pass  # raises TypeError
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       T = TypeVar('T')
 | 
					
						
							|  |  |  |       class XT(X, Generic[T]): pass  # raises TypeError
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 18:51:42 +05:30
										 |  |  |    A ``TypedDict`` can be generic::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Group(TypedDict, Generic[T]):
 | 
					
						
							|  |  |  |           key: T
 | 
					
						
							|  |  |  |           group: list[T]
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 00:40:54 +08:00
										 |  |  |    A ``TypedDict`` can be introspected via annotations dicts
 | 
					
						
							|  |  |  |    (see :ref:`annotations-howto` for more information on annotations best practices),
 | 
					
						
							|  |  |  |    :attr:`__total__`, :attr:`__required_keys__`, and :attr:`__optional_keys__`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: __total__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ``Point2D.__total__`` gives the value of the ``total`` argument.
 | 
					
						
							|  |  |  |       Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          >>> from typing import TypedDict
 | 
					
						
							|  |  |  |          >>> class Point2D(TypedDict): pass
 | 
					
						
							|  |  |  |          >>> Point2D.__total__
 | 
					
						
							|  |  |  |          True
 | 
					
						
							|  |  |  |          >>> class Point2D(TypedDict, total=False): pass
 | 
					
						
							|  |  |  |          >>> Point2D.__total__
 | 
					
						
							|  |  |  |          False
 | 
					
						
							|  |  |  |          >>> class Point3D(Point2D): pass
 | 
					
						
							|  |  |  |          >>> Point3D.__total__
 | 
					
						
							|  |  |  |          True
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: __required_keys__
 | 
					
						
							| 
									
										
										
										
											2022-08-13 12:23:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.9
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 00:40:54 +08:00
										 |  |  |    .. attribute:: __optional_keys__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ``Point2D.__required_keys__`` and ``Point2D.__optional_keys__`` return
 | 
					
						
							|  |  |  |       :class:`frozenset` objects containing required and non-required keys, respectively.
 | 
					
						
							| 
									
										
										
										
											2022-05-27 16:11:45 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |       Keys marked with :data:`Required` will always appear in ``__required_keys__``
 | 
					
						
							|  |  |  |       and keys marked with :data:`NotRequired` will always appear in ``__optional_keys__``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       For backwards compatibility with Python 3.10 and below,
 | 
					
						
							|  |  |  |       it is also possible to use inheritance to declare both required and
 | 
					
						
							|  |  |  |       non-required keys in the same ``TypedDict`` . This is done by declaring a
 | 
					
						
							|  |  |  |       ``TypedDict`` with one value for the ``total`` argument and then
 | 
					
						
							|  |  |  |       inheriting from it in another ``TypedDict`` with a different value for
 | 
					
						
							|  |  |  |       ``total``::
 | 
					
						
							| 
									
										
										
										
											2022-03-11 00:40:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |          >>> class Point2D(TypedDict, total=False):
 | 
					
						
							|  |  |  |          ...     x: int
 | 
					
						
							|  |  |  |          ...     y: int
 | 
					
						
							|  |  |  |          ...
 | 
					
						
							|  |  |  |          >>> class Point3D(Point2D):
 | 
					
						
							|  |  |  |          ...     z: int
 | 
					
						
							|  |  |  |          ...
 | 
					
						
							|  |  |  |          >>> Point3D.__required_keys__ == frozenset({'z'})
 | 
					
						
							|  |  |  |          True
 | 
					
						
							|  |  |  |          >>> Point3D.__optional_keys__ == frozenset({'x', 'y'})
 | 
					
						
							|  |  |  |          True
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-13 12:23:33 +08:00
										 |  |  |       .. versionadded:: 3.9
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-19 10:03:05 +05:30
										 |  |  |    See :pep:`589` for more examples and detailed rules of using ``TypedDict``.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:39:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.8
 | 
					
						
							| 
									
										
										
										
											2019-03-18 09:53:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-27 16:11:45 -06:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Added support for marking individual keys as :data:`Required` or :data:`NotRequired`.
 | 
					
						
							|  |  |  |       See :pep:`655`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 18:51:42 +05:30
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Added support for generic ``TypedDict``\ s.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Generic concrete collections
 | 
					
						
							|  |  |  | ----------------------------
 | 
					
						
							| 
									
										
										
										
											2019-06-19 01:31:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Corresponding to built-in types
 | 
					
						
							|  |  |  | """""""""""""""""""""""""""""""
 | 
					
						
							| 
									
										
										
										
											2019-06-19 01:31:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Dict(dict, MutableMapping[KT, VT])
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`dict`.
 | 
					
						
							|  |  |  |    Useful for annotating return types. To annotate arguments it is preferred
 | 
					
						
							|  |  |  |    to use an abstract collection type such as :class:`Mapping`.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    This type can be used as follows::
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def count_words(text: str) -> Dict[str, int]:
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							| 
									
										
										
										
											2017-11-26 23:23:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`builtins.dict <dict>` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: List(list, MutableSequence[T])
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Generic version of :class:`list`.
 | 
					
						
							|  |  |  |    Useful for annotating return types. To annotate arguments it is preferred
 | 
					
						
							|  |  |  |    to use an abstract collection type such as :class:`Sequence` or
 | 
					
						
							|  |  |  |    :class:`Iterable`.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    This type may be used as follows::
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       T = TypeVar('T', int, float)
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def vec2(x: T, y: T) -> List[T]:
 | 
					
						
							|  |  |  |           return [x, y]
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def keep_positives(vector: Sequence[T]) -> List[T]:
 | 
					
						
							|  |  |  |           return [item for item in vector if item > 0]
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`builtins.list <list>` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Set(set, MutableSet[T])
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`builtins.set <set>`.
 | 
					
						
							|  |  |  |    Useful for annotating return types. To annotate arguments it is preferred
 | 
					
						
							|  |  |  |    to use an abstract collection type such as :class:`AbstractSet`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`builtins.set <set>` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2019-05-31 00:10:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: FrozenSet(frozenset, AbstractSet[T_co])
 | 
					
						
							| 
									
										
										
										
											2019-05-31 00:10:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`builtins.frozenset <frozenset>`.
 | 
					
						
							| 
									
										
										
										
											2019-05-31 00:10:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`builtins.frozenset <frozenset>` now supports ``[]``. See
 | 
					
						
							|  |  |  |       :pep:`585` and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2019-05-31 00:10:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. note:: :data:`Tuple` is a special form.
 | 
					
						
							| 
									
										
										
										
											2019-05-31 00:10:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Corresponding to types in :mod:`collections`
 | 
					
						
							|  |  |  | """"""""""""""""""""""""""""""""""""""""""""
 | 
					
						
							| 
									
										
										
										
											2019-05-31 00:10:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: DefaultDict(collections.defaultdict, MutableMapping[KT, VT])
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.defaultdict`.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.2
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.defaultdict` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: OrderedDict(collections.OrderedDict, MutableMapping[KT, VT])
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.OrderedDict`.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.7.2
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.OrderedDict` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: ChainMap(collections.ChainMap, MutableMapping[KT, VT])
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.ChainMap`.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.4
 | 
					
						
							|  |  |  |    .. versionadded:: 3.6.1
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.ChainMap` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Counter(collections.Counter, Dict[T, int])
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.Counter`.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.4
 | 
					
						
							|  |  |  |    .. versionadded:: 3.6.1
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.Counter` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2015-08-03 22:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Deque(deque, MutableSequence[T])
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.deque`.
 | 
					
						
							| 
									
										
										
										
											2019-04-13 00:33:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.4
 | 
					
						
							|  |  |  |    .. versionadded:: 3.6.1
 | 
					
						
							| 
									
										
										
										
											2019-04-13 00:33:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.deque` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2019-04-13 00:33:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Other concrete types
 | 
					
						
							|  |  |  | """"""""""""""""""""
 | 
					
						
							| 
									
										
										
										
											2019-04-13 00:33:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: IO
 | 
					
						
							|  |  |  |            TextIO
 | 
					
						
							|  |  |  |            BinaryIO
 | 
					
						
							| 
									
										
										
										
											2019-04-13 00:33:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Generic type ``IO[AnyStr]`` and its subclasses ``TextIO(IO[str])``
 | 
					
						
							|  |  |  |    and ``BinaryIO(IO[bytes])``
 | 
					
						
							|  |  |  |    represent the types of I/O streams such as returned by
 | 
					
						
							| 
									
										
										
										
											2021-06-14 16:45:19 +02:00
										 |  |  |    :func:`open`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. deprecated-removed:: 3.8 3.12
 | 
					
						
							| 
									
										
										
										
											2021-08-31 12:44:27 +03:00
										 |  |  |       The ``typing.io`` namespace is deprecated and will be removed.
 | 
					
						
							|  |  |  |       These types should be directly imported from ``typing`` instead.
 | 
					
						
							| 
									
										
										
										
											2019-04-13 00:33:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Pattern
 | 
					
						
							|  |  |  |            Match
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    These type aliases
 | 
					
						
							|  |  |  |    correspond to the return types from :func:`re.compile` and
 | 
					
						
							|  |  |  |    :func:`re.match`.  These types (and the corresponding functions)
 | 
					
						
							|  |  |  |    are generic in ``AnyStr`` and can be made specific by writing
 | 
					
						
							|  |  |  |    ``Pattern[str]``, ``Pattern[bytes]``, ``Match[str]``, or
 | 
					
						
							| 
									
										
										
										
											2021-06-14 16:45:19 +02:00
										 |  |  |    ``Match[bytes]``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. deprecated-removed:: 3.8 3.12
 | 
					
						
							| 
									
										
										
										
											2021-08-31 12:44:27 +03:00
										 |  |  |       The ``typing.re`` namespace is deprecated and will be removed.
 | 
					
						
							|  |  |  |       These types should be directly imported from ``typing`` instead.
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       Classes ``Pattern`` and ``Match`` from :mod:`re` now support ``[]``.
 | 
					
						
							|  |  |  |       See :pep:`585` and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Text
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    ``Text`` is an alias for ``str``. It is provided to supply a forward
 | 
					
						
							|  |  |  |    compatible path for Python 2 code: in Python 2, ``Text`` is an alias for
 | 
					
						
							|  |  |  |    ``unicode``.
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Use ``Text`` to indicate that a value must contain a unicode string in
 | 
					
						
							|  |  |  |    a manner that is compatible with both Python 2 and Python 3::
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |        def add_unicode_checkmark(text: Text) -> Text:
 | 
					
						
							|  |  |  |            return text + u' \u2713'
 | 
					
						
							| 
									
										
										
										
											2019-05-28 08:40:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.2
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-06 11:15:18 +01:00
										 |  |  |    .. deprecated:: 3.11
 | 
					
						
							|  |  |  |       Python 2 is no longer supported, and most type checkers also no longer
 | 
					
						
							| 
									
										
										
										
											2022-05-08 16:22:32 +01:00
										 |  |  |       support type checking Python 2 code. Removal of the alias is not
 | 
					
						
							|  |  |  |       currently planned, but users are encouraged to use
 | 
					
						
							| 
									
										
										
										
											2022-05-06 11:15:18 +01:00
										 |  |  |       :class:`str` instead of ``Text`` wherever possible.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Abstract Base Classes
 | 
					
						
							|  |  |  | ---------------------
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Corresponding to collections in :mod:`collections.abc`
 | 
					
						
							|  |  |  | """"""""""""""""""""""""""""""""""""""""""""""""""""""
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: AbstractSet(Sized, Collection[T_co])
 | 
					
						
							| 
									
										
										
										
											2018-05-24 21:33:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 20:40:25 -03:00
										 |  |  |    A generic version of :class:`collections.abc.Set`.
 | 
					
						
							| 
									
										
										
										
											2018-05-24 21:33:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Set` now supports ``[]``. See :pep:`585` and
 | 
					
						
							|  |  |  |       :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2018-05-24 21:33:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: ByteString(Sequence[int])
 | 
					
						
							| 
									
										
										
										
											2018-05-24 21:33:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.abc.ByteString`.
 | 
					
						
							| 
									
										
										
										
											2018-05-24 21:33:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    This type represents the types :class:`bytes`, :class:`bytearray`,
 | 
					
						
							|  |  |  |    and :class:`memoryview` of byte sequences.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    As a shorthand for this type, :class:`bytes` can be used to
 | 
					
						
							|  |  |  |    annotate arguments of any of the types mentioned above.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.ByteString` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Collection(Sized, Iterable[T_co], Container[T_co])
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.abc.Collection`
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.6.0
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Collection` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Container(Generic[T_co])
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 20:40:25 -03:00
										 |  |  |    A generic version of :class:`collections.abc.Container`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Container` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: ItemsView(MappingView, Generic[KT_co, VT_co])
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.abc.ItemsView`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.ItemsView` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: KeysView(MappingView[KT_co], AbstractSet[KT_co])
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.abc.KeysView`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.KeysView` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2018-05-18 16:00:38 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Mapping(Sized, Collection[KT], Generic[VT_co])
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 20:40:25 -03:00
										 |  |  |    A generic version of :class:`collections.abc.Mapping`.
 | 
					
						
							|  |  |  |    This type can be used as follows::
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 20:40:25 -03:00
										 |  |  |      def get_position_in_index(word_list: Mapping[str, int], word: str) -> int:
 | 
					
						
							|  |  |  |          return word_list[word]
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Mapping` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2018-08-05 19:38:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: MappingView(Sized, Iterable[T_co])
 | 
					
						
							| 
									
										
										
										
											2018-08-05 19:38:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.abc.MappingView`.
 | 
					
						
							| 
									
										
										
										
											2018-08-05 19:38:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.MappingView` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: MutableMapping(Mapping[KT, VT])
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 20:40:25 -03:00
										 |  |  |    A generic version of :class:`collections.abc.MutableMapping`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.MutableMapping` now supports ``[]``. See
 | 
					
						
							|  |  |  |       :pep:`585` and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: MutableSequence(Sequence[T])
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.abc.MutableSequence`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.MutableSequence` now supports ``[]``. See
 | 
					
						
							|  |  |  |       :pep:`585` and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: MutableSet(AbstractSet[T])
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 20:40:25 -03:00
										 |  |  |    A generic version of :class:`collections.abc.MutableSet`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.MutableSet` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Sequence(Reversible[T_co], Collection[T_co])
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 20:40:25 -03:00
										 |  |  |    A generic version of :class:`collections.abc.Sequence`.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Sequence` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: ValuesView(MappingView[VT_co])
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.abc.ValuesView`.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.ValuesView` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Corresponding to other types in :mod:`collections.abc`
 | 
					
						
							|  |  |  | """"""""""""""""""""""""""""""""""""""""""""""""""""""
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Iterable(Generic[T_co])
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 20:40:25 -03:00
										 |  |  |    A generic version of :class:`collections.abc.Iterable`.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Iterable` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Iterator(Iterable[T_co])
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 20:40:25 -03:00
										 |  |  |    A generic version of :class:`collections.abc.Iterator`.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Iterator` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Generator(Iterator[T_co], Generic[T_co, T_contra, V_co])
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generator can be annotated by the generic type
 | 
					
						
							|  |  |  |    ``Generator[YieldType, SendType, ReturnType]``. For example::
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def echo_round() -> Generator[int, float, str]:
 | 
					
						
							|  |  |  |           sent = yield 0
 | 
					
						
							|  |  |  |           while sent >= 0:
 | 
					
						
							|  |  |  |               sent = yield round(sent)
 | 
					
						
							|  |  |  |           return 'Done'
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Note that unlike many other generics in the typing module, the ``SendType``
 | 
					
						
							|  |  |  |    of :class:`Generator` behaves contravariantly, not covariantly or
 | 
					
						
							|  |  |  |    invariantly.
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    If your generator will only yield values, set the ``SendType`` and
 | 
					
						
							|  |  |  |    ``ReturnType`` to ``None``::
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def infinite_stream(start: int) -> Generator[int, None, None]:
 | 
					
						
							|  |  |  |           while True:
 | 
					
						
							|  |  |  |               yield start
 | 
					
						
							|  |  |  |               start += 1
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    Alternatively, annotate your generator as having a return type of
 | 
					
						
							|  |  |  |    either ``Iterable[YieldType]`` or ``Iterator[YieldType]``::
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       def infinite_stream(start: int) -> Iterator[int]:
 | 
					
						
							|  |  |  |           while True:
 | 
					
						
							|  |  |  |               yield start
 | 
					
						
							|  |  |  |               start += 1
 | 
					
						
							| 
									
										
										
										
											2019-05-26 09:37:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Generator` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Hashable
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    An alias to :class:`collections.abc.Hashable`.
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-10 20:04:01 +02:00
										 |  |  |    .. deprecated:: 3.12
 | 
					
						
							|  |  |  |       Use :class:`collections.abc.Hashable` directly instead.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Reversible(Iterable[T_co])
 | 
					
						
							| 
									
										
										
										
											2016-10-08 20:06:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-05 20:40:25 -03:00
										 |  |  |    A generic version of :class:`collections.abc.Reversible`.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Reversible` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Sized
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    An alias to :class:`collections.abc.Sized`.
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:54:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-10 20:04:01 +02:00
										 |  |  |    .. deprecated:: 3.12
 | 
					
						
							|  |  |  |       Use :class:`collections.abc.Sized` directly instead.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Asynchronous programming
 | 
					
						
							|  |  |  | """"""""""""""""""""""""
 | 
					
						
							| 
									
										
										
										
											2017-04-26 06:49:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-27 08:42:37 +08:00
										 |  |  | .. class:: Coroutine(Awaitable[V_co], Generic[T_co, T_contra, V_co])
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |    A generic version of :class:`collections.abc.Coroutine`.
 | 
					
						
							|  |  |  |    The variance and order of type variables
 | 
					
						
							|  |  |  |    correspond to those of :class:`Generator`, for example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 16:07:04 -03:00
										 |  |  |       from collections.abc import Coroutine
 | 
					
						
							| 
									
										
										
										
											2021-12-18 10:23:51 +00:00
										 |  |  |       c: Coroutine[list[str], str, int]  # Some coroutine defined elsewhere
 | 
					
						
							|  |  |  |       x = c.send('hi')                   # Inferred type of 'x' is list[str]
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       async def bar() -> None:
 | 
					
						
							| 
									
										
										
										
											2021-12-18 10:23:51 +00:00
										 |  |  |           y = await c                    # Inferred type of 'y' is int
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.5.3
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Coroutine` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. class:: AsyncGenerator(AsyncIterator[T_co], Generic[T_co, T_contra])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    An async generator can be annotated by the generic type
 | 
					
						
							|  |  |  |    ``AsyncGenerator[YieldType, SendType]``. For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       async def echo_round() -> AsyncGenerator[int, float]:
 | 
					
						
							|  |  |  |           sent = yield 0
 | 
					
						
							|  |  |  |           while sent >= 0.0:
 | 
					
						
							|  |  |  |               rounded = await round(sent)
 | 
					
						
							|  |  |  |               sent = yield rounded
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Unlike normal generators, async generators cannot return a value, so there
 | 
					
						
							|  |  |  |    is no ``ReturnType`` type parameter. As with :class:`Generator`, the
 | 
					
						
							|  |  |  |    ``SendType`` behaves contravariantly.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    If your generator will only yield values, set the ``SendType`` to
 | 
					
						
							|  |  |  |    ``None``::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       async def infinite_stream(start: int) -> AsyncGenerator[int, None]:
 | 
					
						
							|  |  |  |           while True:
 | 
					
						
							|  |  |  |               yield start
 | 
					
						
							|  |  |  |               start = await increment(start)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Alternatively, annotate your generator as having a return type of
 | 
					
						
							|  |  |  |    either ``AsyncIterable[YieldType]`` or ``AsyncIterator[YieldType]``::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       async def infinite_stream(start: int) -> AsyncIterator[int]:
 | 
					
						
							|  |  |  |           while True:
 | 
					
						
							|  |  |  |               yield start
 | 
					
						
							|  |  |  |               start = await increment(start)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.6.1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.AsyncGenerator` now supports ``[]``. See
 | 
					
						
							|  |  |  |       :pep:`585` and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. class:: AsyncIterable(Generic[T_co])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    A generic version of :class:`collections.abc.AsyncIterable`.
 | 
					
						
							| 
									
										
										
										
											2017-11-26 23:23:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.5.2
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.AsyncIterable` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: AsyncIterator(AsyncIterable[T_co])
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.abc.AsyncIterator`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.2
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.AsyncIterator` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: Awaitable(Generic[T_co])
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`collections.abc.Awaitable`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.2
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`collections.abc.Awaitable` now supports ``[]``. See :pep:`585`
 | 
					
						
							|  |  |  |       and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Context manager types
 | 
					
						
							|  |  |  | """""""""""""""""""""
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: ContextManager(Generic[T_co])
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`contextlib.AbstractContextManager`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.4
 | 
					
						
							|  |  |  |    .. versionadded:: 3.6.0
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`contextlib.AbstractContextManager` now supports ``[]``. See
 | 
					
						
							|  |  |  |       :pep:`585` and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: AsyncContextManager(Generic[T_co])
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    A generic version of :class:`contextlib.AbstractAsyncContextManager`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionadded:: 3.5.4
 | 
					
						
							|  |  |  |    .. versionadded:: 3.6.2
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. deprecated:: 3.9
 | 
					
						
							| 
									
										
										
										
											2020-10-30 12:01:17 +08:00
										 |  |  |       :class:`contextlib.AbstractAsyncContextManager` now supports ``[]``. See
 | 
					
						
							|  |  |  |       :pep:`585` and :ref:`types-genericalias`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Protocols
 | 
					
						
							|  |  |  | ---------
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | These protocols are decorated with :func:`runtime_checkable`.
 | 
					
						
							| 
									
										
										
										
											2020-02-05 02:10:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: SupportsAbs
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     An ABC with one abstract method ``__abs__`` that is covariant
 | 
					
						
							|  |  |  |     in its return type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: SupportsBytes
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     An ABC with one abstract method ``__bytes__``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: SupportsComplex
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     An ABC with one abstract method ``__complex__``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: SupportsFloat
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     An ABC with one abstract method ``__float__``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: SupportsIndex
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     An ABC with one abstract method ``__index__``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     .. versionadded:: 3.8
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: SupportsInt
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     An ABC with one abstract method ``__int__``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: SupportsRound
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     An ABC with one abstract method ``__round__``
 | 
					
						
							|  |  |  |     that is covariant in its return type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Functions and decorators
 | 
					
						
							|  |  |  | ------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: cast(typ, val)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Cast a value to a type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This returns the value unchanged.  To the type checker this
 | 
					
						
							|  |  |  |    signals that the return value has the designated type, but at
 | 
					
						
							|  |  |  |    runtime we intentionally don't check anything (we want this
 | 
					
						
							|  |  |  |    to be as fast as possible).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 20:02:26 -07:00
										 |  |  | .. function:: assert_type(val, typ, /)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-23 19:15:06 -07:00
										 |  |  |    Ask a static type checker to confirm that *val* has an inferred type of *typ*.
 | 
					
						
							| 
									
										
										
										
											2022-03-16 20:02:26 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    When the type checker encounters a call to ``assert_type()``, it
 | 
					
						
							|  |  |  |    emits an error if the value is not of the specified type::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        def greet(name: str) -> None:
 | 
					
						
							|  |  |  |            assert_type(name, str)  # OK, inferred type of `name` is `str`
 | 
					
						
							|  |  |  |            assert_type(name, int)  # type checker error
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    At runtime this returns the first argument unchanged with no side effects.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This function is useful for ensuring the type checker's understanding of a
 | 
					
						
							|  |  |  |    script is in line with the developer's intentions::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        def complex_function(arg: object):
 | 
					
						
							|  |  |  |            # Do some complex type-narrowing logic,
 | 
					
						
							|  |  |  |            # after which we hope the inferred type will be `int`
 | 
					
						
							|  |  |  |            ...
 | 
					
						
							|  |  |  |            # Test whether the type checker correctly understands our function
 | 
					
						
							|  |  |  |            assert_type(arg, int)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-08 10:50:26 -08:00
										 |  |  | .. function:: assert_never(arg, /)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-29 21:13:21 -06:00
										 |  |  |    Ask a static type checker to confirm that a line of code is unreachable.
 | 
					
						
							| 
									
										
										
										
											2022-02-08 10:50:26 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        def int_or_str(arg: int | str) -> None:
 | 
					
						
							|  |  |  |            match arg:
 | 
					
						
							|  |  |  |                case int():
 | 
					
						
							|  |  |  |                    print("It's an int")
 | 
					
						
							|  |  |  |                case str():
 | 
					
						
							|  |  |  |                    print("It's a str")
 | 
					
						
							|  |  |  |                case _ as unreachable:
 | 
					
						
							|  |  |  |                    assert_never(unreachable)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-25 06:40:18 -07:00
										 |  |  |    Here, the annotations allow the type checker to infer that the
 | 
					
						
							|  |  |  |    last case can never execute, because ``arg`` is either
 | 
					
						
							|  |  |  |    an :class:`int` or a :class:`str`, and both options are covered by
 | 
					
						
							|  |  |  |    earlier cases.
 | 
					
						
							| 
									
										
										
										
											2022-02-08 10:50:26 -08:00
										 |  |  |    If a type checker finds that a call to ``assert_never()`` is
 | 
					
						
							| 
									
										
										
										
											2022-04-25 06:40:18 -07:00
										 |  |  |    reachable, it will emit an error. For example, if the type annotation
 | 
					
						
							|  |  |  |    for ``arg`` was instead ``int | str | float``, the type checker would
 | 
					
						
							|  |  |  |    emit an error pointing out that ``unreachable`` is of type :class:`float`.
 | 
					
						
							| 
									
										
										
										
											2022-04-29 21:13:21 -06:00
										 |  |  |    For a call to ``assert_never`` to pass type checking, the inferred type of
 | 
					
						
							| 
									
										
										
										
											2022-04-25 06:40:18 -07:00
										 |  |  |    the argument passed in must be the bottom type, :data:`Never`, and nothing
 | 
					
						
							|  |  |  |    else.
 | 
					
						
							| 
									
										
										
										
											2022-02-08 10:50:26 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |    At runtime, this throws an exception when called.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-25 06:40:18 -07:00
										 |  |  |    .. seealso::
 | 
					
						
							|  |  |  |       `Unreachable Code and Exhaustiveness Checking
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |       <https://typing.readthedocs.io/en/latest/source/unreachable.html>`__ has more
 | 
					
						
							| 
									
										
										
										
											2022-04-25 06:40:18 -07:00
										 |  |  |       information about exhaustiveness checking with static typing.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-08 10:50:26 -08:00
										 |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  | .. function:: reveal_type(obj, /)
 | 
					
						
							| 
									
										
										
										
											2022-02-01 18:48:55 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Reveal the inferred static type of an expression.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    When a static type checker encounters a call to this function,
 | 
					
						
							|  |  |  |    it emits a diagnostic with the type of the argument. For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       x: int = 1
 | 
					
						
							|  |  |  |       reveal_type(x)  # Revealed type is "builtins.int"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This can be useful when you want to debug how your type checker
 | 
					
						
							|  |  |  |    handles a particular piece of code.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The function returns its argument unchanged, which allows using
 | 
					
						
							|  |  |  |    it within an expression::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       x = reveal_type(1)  # Revealed type is "builtins.int"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Most type checkers support ``reveal_type()`` anywhere, even if the
 | 
					
						
							|  |  |  |    name is not imported from ``typing``. Importing the name from
 | 
					
						
							|  |  |  |    ``typing`` allows your code to run without runtime errors and
 | 
					
						
							|  |  |  |    communicates intent more clearly.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    At runtime, this function prints the runtime type of its argument to stderr
 | 
					
						
							|  |  |  |    and returns it unchanged::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       x = reveal_type(1)  # prints "Runtime type is int"
 | 
					
						
							|  |  |  |       print(x)  # prints "1"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 07:32:29 -07:00
										 |  |  | .. decorator:: dataclass_transform
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    :data:`~typing.dataclass_transform` may be used to
 | 
					
						
							|  |  |  |    decorate a class, metaclass, or a function that is itself a decorator.
 | 
					
						
							|  |  |  |    The presence of ``@dataclass_transform()`` tells a static type checker that the
 | 
					
						
							|  |  |  |    decorated object performs runtime "magic" that
 | 
					
						
							|  |  |  |    transforms a class, giving it :func:`dataclasses.dataclass`-like behaviors.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Example usage with a decorator function::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       T = TypeVar("T")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @dataclass_transform()
 | 
					
						
							|  |  |  |       def create_model(cls: type[T]) -> type[T]:
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							|  |  |  |           return cls
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @create_model
 | 
					
						
							|  |  |  |       class CustomerModel:
 | 
					
						
							|  |  |  |           id: int
 | 
					
						
							|  |  |  |           name: str
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    On a base class::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @dataclass_transform()
 | 
					
						
							|  |  |  |       class ModelBase: ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class CustomerModel(ModelBase):
 | 
					
						
							|  |  |  |           id: int
 | 
					
						
							|  |  |  |           name: str
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    On a metaclass::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @dataclass_transform()
 | 
					
						
							|  |  |  |       class ModelMeta(type): ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class ModelBase(metaclass=ModelMeta): ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class CustomerModel(ModelBase):
 | 
					
						
							|  |  |  |           id: int
 | 
					
						
							|  |  |  |           name: str
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The ``CustomerModel`` classes defined above will
 | 
					
						
							|  |  |  |    be treated by type checkers similarly to classes created with
 | 
					
						
							|  |  |  |    :func:`@dataclasses.dataclass <dataclasses.dataclass>`.
 | 
					
						
							|  |  |  |    For example, type checkers will assume these classes have
 | 
					
						
							|  |  |  |    ``__init__`` methods that accept ``id`` and ``name``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-28 02:58:35 -07:00
										 |  |  |    The decorated class, metaclass, or function may accept the following bool
 | 
					
						
							|  |  |  |    arguments which type checkers will assume have the same effect as they
 | 
					
						
							|  |  |  |    would have on the
 | 
					
						
							|  |  |  |    :func:`@dataclasses.dataclass<dataclasses.dataclass>` decorator: ``init``,
 | 
					
						
							|  |  |  |    ``eq``, ``order``, ``unsafe_hash``, ``frozen``, ``match_args``,
 | 
					
						
							|  |  |  |    ``kw_only``, and ``slots``. It must be possible for the value of these
 | 
					
						
							|  |  |  |    arguments (``True`` or ``False``) to be statically evaluated.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The arguments to the ``dataclass_transform`` decorator can be used to
 | 
					
						
							|  |  |  |    customize the default behaviors of the decorated class, metaclass, or
 | 
					
						
							|  |  |  |    function:
 | 
					
						
							| 
									
										
										
										
											2022-05-20 07:32:29 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * ``eq_default`` indicates whether the ``eq`` parameter is assumed to be
 | 
					
						
							|  |  |  |      ``True`` or ``False`` if it is omitted by the caller.
 | 
					
						
							|  |  |  |    * ``order_default`` indicates whether the ``order`` parameter is
 | 
					
						
							|  |  |  |      assumed to be True or False if it is omitted by the caller.
 | 
					
						
							|  |  |  |    * ``kw_only_default`` indicates whether the ``kw_only`` parameter is
 | 
					
						
							|  |  |  |      assumed to be True or False if it is omitted by the caller.
 | 
					
						
							|  |  |  |    * ``field_specifiers`` specifies a static list of supported classes
 | 
					
						
							|  |  |  |      or functions that describe fields, similar to ``dataclasses.field()``.
 | 
					
						
							|  |  |  |    * Arbitrary other keyword arguments are accepted in order to allow for
 | 
					
						
							|  |  |  |      possible future extensions.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-28 02:58:35 -07:00
										 |  |  |    Type checkers recognize the following optional arguments on field
 | 
					
						
							|  |  |  |    specifiers:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * ``init`` indicates whether the field should be included in the
 | 
					
						
							|  |  |  |      synthesized ``__init__`` method. If unspecified, ``init`` defaults to
 | 
					
						
							|  |  |  |      ``True``.
 | 
					
						
							|  |  |  |    * ``default`` provides the default value for the field.
 | 
					
						
							|  |  |  |    * ``default_factory`` provides a runtime callback that returns the
 | 
					
						
							|  |  |  |      default value for the field. If neither ``default`` nor
 | 
					
						
							|  |  |  |      ``default_factory`` are specified, the field is assumed to have no
 | 
					
						
							|  |  |  |      default value and must be provided a value when the class is
 | 
					
						
							|  |  |  |      instantiated.
 | 
					
						
							|  |  |  |    * ``factory`` is an alias for ``default_factory``.
 | 
					
						
							|  |  |  |    * ``kw_only`` indicates whether the field should be marked as
 | 
					
						
							|  |  |  |      keyword-only. If ``True``, the field will be keyword-only. If
 | 
					
						
							|  |  |  |      ``False``, it will not be keyword-only. If unspecified, the value of
 | 
					
						
							|  |  |  |      the ``kw_only`` parameter on the object decorated with
 | 
					
						
							|  |  |  |      ``dataclass_transform`` will be used, or if that is unspecified, the
 | 
					
						
							|  |  |  |      value of ``kw_only_default`` on ``dataclass_transform`` will be used.
 | 
					
						
							|  |  |  |    * ``alias`` provides an alternative name for the field. This alternative
 | 
					
						
							|  |  |  |      name is used in the synthesized ``__init__`` method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 07:32:29 -07:00
										 |  |  |    At runtime, this decorator records its arguments in the
 | 
					
						
							|  |  |  |    ``__dataclass_transform__`` attribute on the decorated object.
 | 
					
						
							|  |  |  |    It has no other runtime effect.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    See :pep:`681` for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. decorator:: overload
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The ``@overload`` decorator allows describing functions and methods
 | 
					
						
							|  |  |  |    that support multiple different combinations of argument types. A series
 | 
					
						
							|  |  |  |    of ``@overload``-decorated definitions must be followed by exactly one
 | 
					
						
							|  |  |  |    non-``@overload``-decorated definition (for the same function/method).
 | 
					
						
							|  |  |  |    The ``@overload``-decorated definitions are for the benefit of the
 | 
					
						
							|  |  |  |    type checker only, since they will be overwritten by the
 | 
					
						
							|  |  |  |    non-``@overload``-decorated definition, while the latter is used at
 | 
					
						
							|  |  |  |    runtime but should be ignored by a type checker.  At runtime, calling
 | 
					
						
							|  |  |  |    a ``@overload``-decorated function directly will raise
 | 
					
						
							|  |  |  |    :exc:`NotImplementedError`. An example of overload that gives a more
 | 
					
						
							|  |  |  |    precise type than can be expressed using a union or a type variable::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @overload
 | 
					
						
							|  |  |  |       def process(response: None) -> None:
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							|  |  |  |       @overload
 | 
					
						
							| 
									
										
										
										
											2020-10-03 19:10:59 -03:00
										 |  |  |       def process(response: int) -> tuple[int, str]:
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |           ...
 | 
					
						
							|  |  |  |       @overload
 | 
					
						
							|  |  |  |       def process(response: bytes) -> str:
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							|  |  |  |       def process(response):
 | 
					
						
							|  |  |  |           <actual implementation>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    See :pep:`484` for details and comparison with other typing semantics.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-16 09:01:43 -07:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Overloaded functions can now be introspected at runtime using
 | 
					
						
							|  |  |  |       :func:`get_overloads`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: get_overloads(func)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return a sequence of :func:`@overload <overload>`-decorated definitions for
 | 
					
						
							|  |  |  |    *func*. *func* is the function object for the implementation of the
 | 
					
						
							|  |  |  |    overloaded function. For example, given the definition of ``process`` in
 | 
					
						
							|  |  |  |    the documentation for :func:`@overload <overload>`,
 | 
					
						
							|  |  |  |    ``get_overloads(process)`` will return a sequence of three function objects
 | 
					
						
							|  |  |  |    for the three defined overloads. If called on a function with no overloads,
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    ``get_overloads()`` returns an empty sequence.
 | 
					
						
							| 
									
										
										
										
											2022-04-16 09:01:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    ``get_overloads()`` can be used for introspecting an overloaded function at
 | 
					
						
							| 
									
										
										
										
											2022-04-16 09:01:43 -07:00
										 |  |  |    runtime.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: clear_overloads()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Clear all registered overloads in the internal registry. This can be used
 | 
					
						
							|  |  |  |    to reclaim the memory used by the registry.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. decorator:: final
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    A decorator to indicate to type checkers that the decorated method
 | 
					
						
							|  |  |  |    cannot be overridden, and the decorated class cannot be subclassed.
 | 
					
						
							|  |  |  |    For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Base:
 | 
					
						
							|  |  |  |           @final
 | 
					
						
							|  |  |  |           def done(self) -> None:
 | 
					
						
							|  |  |  |               ...
 | 
					
						
							|  |  |  |       class Sub(Base):
 | 
					
						
							|  |  |  |           def done(self) -> None:  # Error reported by type checker
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |               ...
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       @final
 | 
					
						
							|  |  |  |       class Leaf:
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							|  |  |  |       class Other(Leaf):  # Error reported by type checker
 | 
					
						
							|  |  |  |           ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    There is no runtime checking of these properties. See :pep:`591` for
 | 
					
						
							|  |  |  |    more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.8
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-12 11:38:25 -08:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       The decorator will now set the ``__final__`` attribute to ``True``
 | 
					
						
							|  |  |  |       on the decorated object. Thus, a check like
 | 
					
						
							|  |  |  |       ``if getattr(obj, "__final__", False)`` can be used at runtime
 | 
					
						
							|  |  |  |       to determine whether an object ``obj`` has been marked as final.
 | 
					
						
							|  |  |  |       If the decorated object does not support setting attributes,
 | 
					
						
							|  |  |  |       the decorator returns the object unchanged without raising an exception.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. decorator:: no_type_check
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Decorator to indicate that annotations are not type hints.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This works as class or function :term:`decorator`.  With a class, it
 | 
					
						
							| 
									
										
										
										
											2022-02-19 04:53:29 +03:00
										 |  |  |    applies recursively to all methods and classes defined in that class
 | 
					
						
							|  |  |  |    (but not to methods defined in its superclasses or subclasses).
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This mutates the function(s) in place.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. decorator:: no_type_check_decorator
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Decorator to give another decorator the :func:`no_type_check` effect.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This wraps the decorator with something that wraps the decorated
 | 
					
						
							|  |  |  |    function in :func:`no_type_check`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. decorator:: type_check_only
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Decorator to mark a class or function to be unavailable at runtime.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This decorator is itself not available at runtime. It is mainly
 | 
					
						
							|  |  |  |    intended to mark classes that are defined in type stub files if
 | 
					
						
							|  |  |  |    an implementation returns an instance of a private class::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @type_check_only
 | 
					
						
							|  |  |  |       class Response:  # private or not available at runtime
 | 
					
						
							|  |  |  |           code: int
 | 
					
						
							|  |  |  |           def get_header(self, name: str) -> str: ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def fetch_response() -> Response: ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Note that returning instances of private classes is not recommended.
 | 
					
						
							|  |  |  |    It is usually preferable to make such classes public.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Introspection helpers
 | 
					
						
							|  |  |  | ---------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: get_type_hints(obj, globalns=None, localns=None, include_extras=False)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return a dictionary containing type hints for a function, method, module
 | 
					
						
							|  |  |  |    or class object.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This is often the same as ``obj.__annotations__``. In addition,
 | 
					
						
							|  |  |  |    forward references encoded as string literals are handled by evaluating
 | 
					
						
							| 
									
										
										
										
											2022-03-02 08:29:46 +03:00
										 |  |  |    them in ``globals`` and ``locals`` namespaces. For a class ``C``, return
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    a dictionary constructed by merging all the ``__annotations__`` along
 | 
					
						
							|  |  |  |    ``C.__mro__`` in reverse order.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The function recursively replaces all ``Annotated[T, ...]`` with ``T``,
 | 
					
						
							|  |  |  |    unless ``include_extras`` is set to ``True`` (see :class:`Annotated` for
 | 
					
						
							|  |  |  |    more information). For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        class Student(NamedTuple):
 | 
					
						
							|  |  |  |            name: Annotated[str, 'some marker']
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        get_type_hints(Student) == {'name': str}
 | 
					
						
							|  |  |  |        get_type_hints(Student, include_extras=False) == {'name': str}
 | 
					
						
							|  |  |  |        get_type_hints(Student, include_extras=True) == {
 | 
					
						
							|  |  |  |            'name': Annotated[str, 'some marker']
 | 
					
						
							|  |  |  |        }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-20 16:36:51 +02:00
										 |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       :func:`get_type_hints` does not work with imported
 | 
					
						
							|  |  |  |       :ref:`type aliases <type-aliases>` that include forward references.
 | 
					
						
							|  |  |  |       Enabling postponed evaluation of annotations (:pep:`563`) may remove
 | 
					
						
							|  |  |  |       the need for most forward references.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    .. versionchanged:: 3.9
 | 
					
						
							|  |  |  |       Added ``include_extras`` parameter as part of :pep:`593`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-02 08:29:46 +03:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Previously, ``Optional[t]`` was added for function and method annotations
 | 
					
						
							|  |  |  |       if a default value equal to ``None`` was set.
 | 
					
						
							|  |  |  |       Now the annotation is returned unchanged.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. function:: get_args(tp)
 | 
					
						
							|  |  |  | .. function:: get_origin(tp)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Provide basic introspection for generic types and special typing forms.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    For a typing object of the form ``X[Y, Z, ...]`` these functions return
 | 
					
						
							|  |  |  |    ``X`` and ``(Y, Z, ...)``. If ``X`` is a generic alias for a builtin or
 | 
					
						
							|  |  |  |    :mod:`collections` class, it gets normalized to the original class.
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |    If ``X`` is a union or :class:`Literal` contained in another
 | 
					
						
							| 
									
										
										
										
											2020-11-19 18:17:38 +02:00
										 |  |  |    generic type, the order of ``(Y, Z, ...)`` may be different from the order
 | 
					
						
							|  |  |  |    of the original arguments ``[Y, Z, ...]`` due to type caching.
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    For unsupported objects return ``None`` and ``()`` correspondingly.
 | 
					
						
							|  |  |  |    Examples::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       assert get_origin(Dict[str, int]) is dict
 | 
					
						
							|  |  |  |       assert get_args(Dict[int, str]) == (int, str)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       assert get_origin(Union[int, str]) is Union
 | 
					
						
							|  |  |  |       assert get_args(Union[int, str]) == (int, str)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.8
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-16 05:58:32 +01:00
										 |  |  | .. function:: is_typeddict(tp)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-16 12:06:23 -03:00
										 |  |  |    Check if a type is a :class:`TypedDict`.
 | 
					
						
							| 
									
										
										
										
											2020-09-16 05:58:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-02 19:36:26 -03:00
										 |  |  |       class Film(TypedDict):
 | 
					
						
							|  |  |  |           title: str
 | 
					
						
							|  |  |  |           year: int
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       is_typeddict(Film)  # => True
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:45:01 +02:00
										 |  |  |       is_typeddict(list | str)  # => False
 | 
					
						
							| 
									
										
										
										
											2020-09-16 05:58:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.10
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | .. class:: ForwardRef
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    A class used for internal typing representation of string forward references.
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |    For example, ``List["SomeClass"]`` is implicitly transformed into
 | 
					
						
							|  |  |  |    ``List[ForwardRef("SomeClass")]``.  This class should not be instantiated by
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |    a user, but may be used by introspection tools.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 23:14:44 +08:00
										 |  |  |    .. note::
 | 
					
						
							|  |  |  |       :pep:`585` generic types such as ``list["SomeClass"]`` will not be
 | 
					
						
							|  |  |  |       implicitly transformed into ``list[ForwardRef("SomeClass")]`` and thus
 | 
					
						
							|  |  |  |       will not automatically resolve to ``list[SomeClass]``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-09 09:58:50 +08:00
										 |  |  |    .. versionadded:: 3.7.4
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  | Constant
 | 
					
						
							|  |  |  | --------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. data:: TYPE_CHECKING
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    A special constant that is assumed to be ``True`` by 3rd party static
 | 
					
						
							|  |  |  |    type checkers. It is ``False`` at runtime. Usage::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if TYPE_CHECKING:
 | 
					
						
							|  |  |  |           import expensive_mod
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def fun(arg: 'expensive_mod.SomeType') -> None:
 | 
					
						
							|  |  |  |           local_var: expensive_mod.AnotherType = other_fun()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The first type annotation must be enclosed in quotes, making it a
 | 
					
						
							|  |  |  |    "forward reference", to hide the ``expensive_mod`` reference from the
 | 
					
						
							|  |  |  |    interpreter runtime.  Type annotations for local variables are not
 | 
					
						
							|  |  |  |    evaluated, so the second annotation does not need to be enclosed in quotes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-08 14:15:38 +01:00
										 |  |  |       If ``from __future__ import annotations`` is used,
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       annotations are not evaluated at function definition time.
 | 
					
						
							| 
									
										
										
										
											2022-01-23 15:36:08 -08:00
										 |  |  |       Instead, they are stored as strings in ``__annotations__``.
 | 
					
						
							| 
									
										
										
										
											2022-05-03 15:49:21 -06:00
										 |  |  |       This makes it unnecessary to use quotes around the annotation
 | 
					
						
							| 
									
										
										
										
											2020-08-02 19:32:36 -03:00
										 |  |  |       (see :pep:`563`).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.5.2
 | 
					
						
							| 
									
										
										
										
											2022-04-29 11:22:25 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | Deprecation Timeline of Major Features
 | 
					
						
							|  |  |  | ======================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Certain features in ``typing`` are deprecated and may be removed in a future
 | 
					
						
							|  |  |  | version of Python. The following table summarizes major deprecations for your
 | 
					
						
							|  |  |  | convenience. This is subject to change, and not all deprecations are listed.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | +----------------------------------+---------------+-------------------+----------------+
 | 
					
						
							|  |  |  | |  Feature                         | Deprecated in | Projected removal | PEP/issue      |
 | 
					
						
							|  |  |  | +==================================+===============+===================+================+
 | 
					
						
							|  |  |  | |  ``typing.io`` and ``typing.re`` | 3.8           | 3.12              | :issue:`38291` |
 | 
					
						
							|  |  |  | |  submodules                      |               |                   |                |
 | 
					
						
							|  |  |  | +----------------------------------+---------------+-------------------+----------------+
 | 
					
						
							|  |  |  | |  ``typing`` versions of standard | 3.9           | Undecided         | :pep:`585`     |
 | 
					
						
							|  |  |  | |  collections                     |               |                   |                |
 | 
					
						
							|  |  |  | +----------------------------------+---------------+-------------------+----------------+
 | 
					
						
							| 
									
										
										
										
											2022-05-06 11:15:18 +01:00
										 |  |  | |  ``typing.Text``                 | 3.11          | Undecided         | :gh:`92332`    |
 | 
					
						
							|  |  |  | +----------------------------------+---------------+-------------------+----------------+
 | 
					
						
							| 
									
										
										
										
											2022-07-10 20:04:01 +02:00
										 |  |  | |  ``typing.Hashable`` and         | 3.12          | Undecided         | :gh:`94309`    |
 | 
					
						
							|  |  |  | |  ``typing.Sized``                |               |                   |                |
 | 
					
						
							|  |  |  | +----------------------------------+---------------+-------------------+----------------+
 |