17db96d56Sopenharmony_ci======================================== 27db96d56Sopenharmony_ci:mod:`typing` --- Support for type hints 37db96d56Sopenharmony_ci======================================== 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci.. module:: typing 67db96d56Sopenharmony_ci :synopsis: Support for type hints (see :pep:`484`). 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ci.. versionadded:: 3.5 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci**Source code:** :source:`Lib/typing.py` 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci.. note:: 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci The Python runtime does not enforce function and variable type annotations. 157db96d56Sopenharmony_ci They can be used by third party tools such as type checkers, IDEs, linters, 167db96d56Sopenharmony_ci etc. 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci-------------- 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ciThis module provides runtime support for type hints. The most fundamental 217db96d56Sopenharmony_cisupport consists of the types :data:`Any`, :data:`Union`, :data:`Callable`, 227db96d56Sopenharmony_ci:class:`TypeVar`, and :class:`Generic`. For a specification, please see 237db96d56Sopenharmony_ci:pep:`484`. For a simplified introduction to type hints, see :pep:`483`. 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ciThe function below takes and returns a string and is annotated as follows:: 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci def greeting(name: str) -> str: 297db96d56Sopenharmony_ci return 'Hello ' + name 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ciIn the function ``greeting``, the argument ``name`` is expected to be of type 327db96d56Sopenharmony_ci:class:`str` and the return type :class:`str`. Subtypes are accepted as 337db96d56Sopenharmony_ciarguments. 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ciNew features are frequently added to the ``typing`` module. 367db96d56Sopenharmony_ciThe `typing_extensions <https://pypi.org/project/typing-extensions/>`_ package 377db96d56Sopenharmony_ciprovides backports of these new features to older versions of Python. 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ciFor a summary of deprecated features and a deprecation timeline, please see 407db96d56Sopenharmony_ci`Deprecation Timeline of Major Features`_. 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci.. seealso:: 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci For a quick overview of type hints, refer to 457db96d56Sopenharmony_ci `this cheat sheet <https://mypy.readthedocs.io/en/stable/cheat_sheet_py3.html>`_. 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci The "Type System Reference" section of https://mypy.readthedocs.io/ -- since 487db96d56Sopenharmony_ci the Python typing system is standardised via PEPs, this reference should 497db96d56Sopenharmony_ci broadly apply to most Python type checkers, although some parts may still be 507db96d56Sopenharmony_ci specific to mypy. 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci The documentation at https://typing.readthedocs.io/ serves as useful reference 537db96d56Sopenharmony_ci for type system features, useful typing related tools and typing best practices. 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ci.. _relevant-peps: 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ciRelevant PEPs 587db96d56Sopenharmony_ci============= 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ciSince the initial introduction of type hints in :pep:`484` and :pep:`483`, a 617db96d56Sopenharmony_cinumber of PEPs have modified and enhanced Python's framework for type 627db96d56Sopenharmony_ciannotations. These include: 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci* :pep:`526`: Syntax for Variable Annotations 657db96d56Sopenharmony_ci *Introducing* syntax for annotating variables outside of function 667db96d56Sopenharmony_ci definitions, and :data:`ClassVar` 677db96d56Sopenharmony_ci* :pep:`544`: Protocols: Structural subtyping (static duck typing) 687db96d56Sopenharmony_ci *Introducing* :class:`Protocol` and the 697db96d56Sopenharmony_ci :func:`@runtime_checkable<runtime_checkable>` decorator 707db96d56Sopenharmony_ci* :pep:`585`: Type Hinting Generics In Standard Collections 717db96d56Sopenharmony_ci *Introducing* :class:`types.GenericAlias` and the ability to use standard 727db96d56Sopenharmony_ci library classes as :ref:`generic types<types-genericalias>` 737db96d56Sopenharmony_ci* :pep:`586`: Literal Types 747db96d56Sopenharmony_ci *Introducing* :data:`Literal` 757db96d56Sopenharmony_ci* :pep:`589`: TypedDict: Type Hints for Dictionaries with a Fixed Set of Keys 767db96d56Sopenharmony_ci *Introducing* :class:`TypedDict` 777db96d56Sopenharmony_ci* :pep:`591`: Adding a final qualifier to typing 787db96d56Sopenharmony_ci *Introducing* :data:`Final` and the :func:`@final<final>` decorator 797db96d56Sopenharmony_ci* :pep:`593`: Flexible function and variable annotations 807db96d56Sopenharmony_ci *Introducing* :data:`Annotated` 817db96d56Sopenharmony_ci* :pep:`604`: Allow writing union types as ``X | Y`` 827db96d56Sopenharmony_ci *Introducing* :data:`types.UnionType` and the ability to use 837db96d56Sopenharmony_ci the binary-or operator ``|`` to signify a 847db96d56Sopenharmony_ci :ref:`union of types<types-union>` 857db96d56Sopenharmony_ci* :pep:`612`: Parameter Specification Variables 867db96d56Sopenharmony_ci *Introducing* :class:`ParamSpec` and :data:`Concatenate` 877db96d56Sopenharmony_ci* :pep:`613`: Explicit Type Aliases 887db96d56Sopenharmony_ci *Introducing* :data:`TypeAlias` 897db96d56Sopenharmony_ci* :pep:`646`: Variadic Generics 907db96d56Sopenharmony_ci *Introducing* :data:`TypeVarTuple` 917db96d56Sopenharmony_ci* :pep:`647`: User-Defined Type Guards 927db96d56Sopenharmony_ci *Introducing* :data:`TypeGuard` 937db96d56Sopenharmony_ci* :pep:`655`: Marking individual TypedDict items as required or potentially missing 947db96d56Sopenharmony_ci *Introducing* :data:`Required` and :data:`NotRequired` 957db96d56Sopenharmony_ci* :pep:`673`: Self type 967db96d56Sopenharmony_ci *Introducing* :data:`Self` 977db96d56Sopenharmony_ci* :pep:`675`: Arbitrary Literal String Type 987db96d56Sopenharmony_ci *Introducing* :data:`LiteralString` 997db96d56Sopenharmony_ci* :pep:`681`: Data Class Transforms 1007db96d56Sopenharmony_ci *Introducing* the :func:`@dataclass_transform<dataclass_transform>` decorator 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci.. _type-aliases: 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ciType aliases 1057db96d56Sopenharmony_ci============ 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ciA type alias is defined by assigning the type to the alias. In this example, 1087db96d56Sopenharmony_ci``Vector`` and ``list[float]`` will be treated as interchangeable synonyms:: 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci Vector = list[float] 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci def scale(scalar: float, vector: Vector) -> Vector: 1137db96d56Sopenharmony_ci return [scalar * num for num in vector] 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci # passes type checking; a list of floats qualifies as a Vector. 1167db96d56Sopenharmony_ci new_vector = scale(2.0, [1.0, -4.2, 5.4]) 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ciType aliases are useful for simplifying complex type signatures. For example:: 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ci from collections.abc import Sequence 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci ConnectionOptions = dict[str, str] 1237db96d56Sopenharmony_ci Address = tuple[str, int] 1247db96d56Sopenharmony_ci Server = tuple[Address, ConnectionOptions] 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci def broadcast_message(message: str, servers: Sequence[Server]) -> None: 1277db96d56Sopenharmony_ci ... 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci # The static type checker will treat the previous type signature as 1307db96d56Sopenharmony_ci # being exactly equivalent to this one. 1317db96d56Sopenharmony_ci def broadcast_message( 1327db96d56Sopenharmony_ci message: str, 1337db96d56Sopenharmony_ci servers: Sequence[tuple[tuple[str, int], dict[str, str]]]) -> None: 1347db96d56Sopenharmony_ci ... 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ciNote that ``None`` as a type hint is a special case and is replaced by 1377db96d56Sopenharmony_ci``type(None)``. 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ciType aliases may be marked with :data:`TypeAlias` to make it explicit that 1407db96d56Sopenharmony_cithe statement is a type alias declaration, not a normal variable assignment:: 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci from typing import TypeAlias 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci Vector: TypeAlias = list[float] 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci.. _distinct: 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ciNewType 1497db96d56Sopenharmony_ci======= 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ciUse the :class:`NewType` helper to create distinct types:: 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_ci from typing import NewType 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci UserId = NewType('UserId', int) 1567db96d56Sopenharmony_ci some_id = UserId(524313) 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ciThe static type checker will treat the new type as if it were a subclass 1597db96d56Sopenharmony_ciof the original type. This is useful in helping catch logical errors:: 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci def get_user_name(user_id: UserId) -> str: 1627db96d56Sopenharmony_ci ... 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci # passes type checking 1657db96d56Sopenharmony_ci user_a = get_user_name(UserId(42351)) 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci # fails type checking; an int is not a UserId 1687db96d56Sopenharmony_ci user_b = get_user_name(-1) 1697db96d56Sopenharmony_ci 1707db96d56Sopenharmony_ciYou may still perform all ``int`` operations on a variable of type ``UserId``, 1717db96d56Sopenharmony_cibut the result will always be of type ``int``. This lets you pass in a 1727db96d56Sopenharmony_ci``UserId`` wherever an ``int`` might be expected, but will prevent you from 1737db96d56Sopenharmony_ciaccidentally creating a ``UserId`` in an invalid way:: 1747db96d56Sopenharmony_ci 1757db96d56Sopenharmony_ci # 'output' is of type 'int', not 'UserId' 1767db96d56Sopenharmony_ci output = UserId(23413) + UserId(54341) 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ciNote that these checks are enforced only by the static type checker. At runtime, 1797db96d56Sopenharmony_cithe statement ``Derived = NewType('Derived', Base)`` will make ``Derived`` a 1807db96d56Sopenharmony_cicallable that immediately returns whatever parameter you pass it. That means 1817db96d56Sopenharmony_cithe expression ``Derived(some_value)`` does not create a new class or introduce 1827db96d56Sopenharmony_cimuch overhead beyond that of a regular function call. 1837db96d56Sopenharmony_ci 1847db96d56Sopenharmony_ciMore precisely, the expression ``some_value is Derived(some_value)`` is always 1857db96d56Sopenharmony_citrue at runtime. 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ciIt is invalid to create a subtype of ``Derived``:: 1887db96d56Sopenharmony_ci 1897db96d56Sopenharmony_ci from typing import NewType 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci UserId = NewType('UserId', int) 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci # Fails at runtime and does not pass type checking 1947db96d56Sopenharmony_ci class AdminUserId(UserId): pass 1957db96d56Sopenharmony_ci 1967db96d56Sopenharmony_ciHowever, it is possible to create a :class:`NewType` based on a 'derived' ``NewType``:: 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci from typing import NewType 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci UserId = NewType('UserId', int) 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ci ProUserId = NewType('ProUserId', UserId) 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ciand typechecking for ``ProUserId`` will work as expected. 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ciSee :pep:`484` for more details. 2077db96d56Sopenharmony_ci 2087db96d56Sopenharmony_ci.. note:: 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci Recall that the use of a type alias declares two types to be *equivalent* to 2117db96d56Sopenharmony_ci one another. Doing ``Alias = Original`` will make the static type checker 2127db96d56Sopenharmony_ci treat ``Alias`` as being *exactly equivalent* to ``Original`` in all cases. 2137db96d56Sopenharmony_ci This is useful when you want to simplify complex type signatures. 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci In contrast, ``NewType`` declares one type to be a *subtype* of another. 2167db96d56Sopenharmony_ci Doing ``Derived = NewType('Derived', Original)`` will make the static type 2177db96d56Sopenharmony_ci checker treat ``Derived`` as a *subclass* of ``Original``, which means a 2187db96d56Sopenharmony_ci value of type ``Original`` cannot be used in places where a value of type 2197db96d56Sopenharmony_ci ``Derived`` is expected. This is useful when you want to prevent logic 2207db96d56Sopenharmony_ci errors with minimal runtime cost. 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci.. versionadded:: 3.5.2 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci.. versionchanged:: 3.10 2257db96d56Sopenharmony_ci ``NewType`` is now a class rather than a function. There is some additional 2267db96d56Sopenharmony_ci runtime cost when calling ``NewType`` over a regular function. However, this 2277db96d56Sopenharmony_ci cost will be reduced in 3.11.0. 2287db96d56Sopenharmony_ci 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ciCallable 2317db96d56Sopenharmony_ci======== 2327db96d56Sopenharmony_ci 2337db96d56Sopenharmony_ciFrameworks expecting callback functions of specific signatures might be 2347db96d56Sopenharmony_citype hinted using ``Callable[[Arg1Type, Arg2Type], ReturnType]``. 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_ciFor example:: 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ci from collections.abc import Callable 2397db96d56Sopenharmony_ci 2407db96d56Sopenharmony_ci def feeder(get_next_item: Callable[[], str]) -> None: 2417db96d56Sopenharmony_ci # Body 2427db96d56Sopenharmony_ci 2437db96d56Sopenharmony_ci def async_query(on_success: Callable[[int], None], 2447db96d56Sopenharmony_ci on_error: Callable[[int, Exception], None]) -> None: 2457db96d56Sopenharmony_ci # Body 2467db96d56Sopenharmony_ci 2477db96d56Sopenharmony_ci async def on_update(value: str) -> None: 2487db96d56Sopenharmony_ci # Body 2497db96d56Sopenharmony_ci callback: Callable[[str], Awaitable[None]] = on_update 2507db96d56Sopenharmony_ci 2517db96d56Sopenharmony_ciIt is possible to declare the return type of a callable without specifying 2527db96d56Sopenharmony_cithe call signature by substituting a literal ellipsis 2537db96d56Sopenharmony_cifor the list of arguments in the type hint: ``Callable[..., ReturnType]``. 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ciCallables which take other callables as arguments may indicate that their 2567db96d56Sopenharmony_ciparameter types are dependent on each other using :class:`ParamSpec`. 2577db96d56Sopenharmony_ciAdditionally, if that callable adds or removes arguments from other 2587db96d56Sopenharmony_cicallables, the :data:`Concatenate` operator may be used. They 2597db96d56Sopenharmony_citake the form ``Callable[ParamSpecVariable, ReturnType]`` and 2607db96d56Sopenharmony_ci``Callable[Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable], ReturnType]`` 2617db96d56Sopenharmony_cirespectively. 2627db96d56Sopenharmony_ci 2637db96d56Sopenharmony_ci.. versionchanged:: 3.10 2647db96d56Sopenharmony_ci ``Callable`` now supports :class:`ParamSpec` and :data:`Concatenate`. 2657db96d56Sopenharmony_ci See :pep:`612` for more details. 2667db96d56Sopenharmony_ci 2677db96d56Sopenharmony_ci.. seealso:: 2687db96d56Sopenharmony_ci The documentation for :class:`ParamSpec` and :class:`Concatenate` provides 2697db96d56Sopenharmony_ci examples of usage in ``Callable``. 2707db96d56Sopenharmony_ci 2717db96d56Sopenharmony_ci.. _generics: 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ciGenerics 2747db96d56Sopenharmony_ci======== 2757db96d56Sopenharmony_ci 2767db96d56Sopenharmony_ciSince type information about objects kept in containers cannot be statically 2777db96d56Sopenharmony_ciinferred in a generic way, abstract base classes have been extended to support 2787db96d56Sopenharmony_cisubscription to denote expected types for container elements. 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci:: 2817db96d56Sopenharmony_ci 2827db96d56Sopenharmony_ci from collections.abc import Mapping, Sequence 2837db96d56Sopenharmony_ci 2847db96d56Sopenharmony_ci def notify_by_email(employees: Sequence[Employee], 2857db96d56Sopenharmony_ci overrides: Mapping[str, str]) -> None: ... 2867db96d56Sopenharmony_ci 2877db96d56Sopenharmony_ciGenerics can be parameterized by using a factory available in typing 2887db96d56Sopenharmony_cicalled :class:`TypeVar`. 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci:: 2917db96d56Sopenharmony_ci 2927db96d56Sopenharmony_ci from collections.abc import Sequence 2937db96d56Sopenharmony_ci from typing import TypeVar 2947db96d56Sopenharmony_ci 2957db96d56Sopenharmony_ci T = TypeVar('T') # Declare type variable 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_ci def first(l: Sequence[T]) -> T: # Generic function 2987db96d56Sopenharmony_ci return l[0] 2997db96d56Sopenharmony_ci 3007db96d56Sopenharmony_ci.. _user-defined-generics: 3017db96d56Sopenharmony_ci 3027db96d56Sopenharmony_ciUser-defined generic types 3037db96d56Sopenharmony_ci========================== 3047db96d56Sopenharmony_ci 3057db96d56Sopenharmony_ciA user-defined class can be defined as a generic class. 3067db96d56Sopenharmony_ci 3077db96d56Sopenharmony_ci:: 3087db96d56Sopenharmony_ci 3097db96d56Sopenharmony_ci from typing import TypeVar, Generic 3107db96d56Sopenharmony_ci from logging import Logger 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ci T = TypeVar('T') 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci class LoggedVar(Generic[T]): 3157db96d56Sopenharmony_ci def __init__(self, value: T, name: str, logger: Logger) -> None: 3167db96d56Sopenharmony_ci self.name = name 3177db96d56Sopenharmony_ci self.logger = logger 3187db96d56Sopenharmony_ci self.value = value 3197db96d56Sopenharmony_ci 3207db96d56Sopenharmony_ci def set(self, new: T) -> None: 3217db96d56Sopenharmony_ci self.log('Set ' + repr(self.value)) 3227db96d56Sopenharmony_ci self.value = new 3237db96d56Sopenharmony_ci 3247db96d56Sopenharmony_ci def get(self) -> T: 3257db96d56Sopenharmony_ci self.log('Get ' + repr(self.value)) 3267db96d56Sopenharmony_ci return self.value 3277db96d56Sopenharmony_ci 3287db96d56Sopenharmony_ci def log(self, message: str) -> None: 3297db96d56Sopenharmony_ci self.logger.info('%s: %s', self.name, message) 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_ci``Generic[T]`` as a base class defines that the class ``LoggedVar`` takes a 3327db96d56Sopenharmony_cisingle type parameter ``T`` . This also makes ``T`` valid as a type within the 3337db96d56Sopenharmony_ciclass body. 3347db96d56Sopenharmony_ci 3357db96d56Sopenharmony_ciThe :class:`Generic` base class defines :meth:`~object.__class_getitem__` so 3367db96d56Sopenharmony_cithat ``LoggedVar[T]`` is valid as a type:: 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci from collections.abc import Iterable 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None: 3417db96d56Sopenharmony_ci for var in vars: 3427db96d56Sopenharmony_ci var.set(0) 3437db96d56Sopenharmony_ci 3447db96d56Sopenharmony_ciA generic type can have any number of type variables. All varieties of 3457db96d56Sopenharmony_ci:class:`TypeVar` are permissible as parameters for a generic type:: 3467db96d56Sopenharmony_ci 3477db96d56Sopenharmony_ci from typing import TypeVar, Generic, Sequence 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci T = TypeVar('T', contravariant=True) 3507db96d56Sopenharmony_ci B = TypeVar('B', bound=Sequence[bytes], covariant=True) 3517db96d56Sopenharmony_ci S = TypeVar('S', int, str) 3527db96d56Sopenharmony_ci 3537db96d56Sopenharmony_ci class WeirdTrio(Generic[T, B, S]): 3547db96d56Sopenharmony_ci ... 3557db96d56Sopenharmony_ci 3567db96d56Sopenharmony_ciEach type variable argument to :class:`Generic` must be distinct. 3577db96d56Sopenharmony_ciThis is thus invalid:: 3587db96d56Sopenharmony_ci 3597db96d56Sopenharmony_ci from typing import TypeVar, Generic 3607db96d56Sopenharmony_ci ... 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci T = TypeVar('T') 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_ci class Pair(Generic[T, T]): # INVALID 3657db96d56Sopenharmony_ci ... 3667db96d56Sopenharmony_ci 3677db96d56Sopenharmony_ciYou can use multiple inheritance with :class:`Generic`:: 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci from collections.abc import Sized 3707db96d56Sopenharmony_ci from typing import TypeVar, Generic 3717db96d56Sopenharmony_ci 3727db96d56Sopenharmony_ci T = TypeVar('T') 3737db96d56Sopenharmony_ci 3747db96d56Sopenharmony_ci class LinkedList(Sized, Generic[T]): 3757db96d56Sopenharmony_ci ... 3767db96d56Sopenharmony_ci 3777db96d56Sopenharmony_ciWhen inheriting from generic classes, some type parameters could be fixed:: 3787db96d56Sopenharmony_ci 3797db96d56Sopenharmony_ci from collections.abc import Mapping 3807db96d56Sopenharmony_ci from typing import TypeVar 3817db96d56Sopenharmony_ci 3827db96d56Sopenharmony_ci T = TypeVar('T') 3837db96d56Sopenharmony_ci 3847db96d56Sopenharmony_ci class MyDict(Mapping[str, T]): 3857db96d56Sopenharmony_ci ... 3867db96d56Sopenharmony_ci 3877db96d56Sopenharmony_ciIn this case ``MyDict`` has a single parameter, ``T``. 3887db96d56Sopenharmony_ci 3897db96d56Sopenharmony_ciUsing a generic class without specifying type parameters assumes 3907db96d56Sopenharmony_ci:data:`Any` for each position. In the following example, ``MyIterable`` is 3917db96d56Sopenharmony_cinot generic but implicitly inherits from ``Iterable[Any]``:: 3927db96d56Sopenharmony_ci 3937db96d56Sopenharmony_ci from collections.abc import Iterable 3947db96d56Sopenharmony_ci 3957db96d56Sopenharmony_ci class MyIterable(Iterable): # Same as Iterable[Any] 3967db96d56Sopenharmony_ci 3977db96d56Sopenharmony_ciUser-defined generic type aliases are also supported. Examples:: 3987db96d56Sopenharmony_ci 3997db96d56Sopenharmony_ci from collections.abc import Iterable 4007db96d56Sopenharmony_ci from typing import TypeVar 4017db96d56Sopenharmony_ci S = TypeVar('S') 4027db96d56Sopenharmony_ci Response = Iterable[S] | int 4037db96d56Sopenharmony_ci 4047db96d56Sopenharmony_ci # Return type here is same as Iterable[str] | int 4057db96d56Sopenharmony_ci def response(query: str) -> Response[str]: 4067db96d56Sopenharmony_ci ... 4077db96d56Sopenharmony_ci 4087db96d56Sopenharmony_ci T = TypeVar('T', int, float, complex) 4097db96d56Sopenharmony_ci Vec = Iterable[tuple[T, T]] 4107db96d56Sopenharmony_ci 4117db96d56Sopenharmony_ci def inproduct(v: Vec[T]) -> T: # Same as Iterable[tuple[T, T]] 4127db96d56Sopenharmony_ci return sum(x*y for x, y in v) 4137db96d56Sopenharmony_ci 4147db96d56Sopenharmony_ci.. versionchanged:: 3.7 4157db96d56Sopenharmony_ci :class:`Generic` no longer has a custom metaclass. 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ciUser-defined generics for parameter expressions are also supported via parameter 4187db96d56Sopenharmony_cispecification variables in the form ``Generic[P]``. The behavior is consistent 4197db96d56Sopenharmony_ciwith type variables' described above as parameter specification variables are 4207db96d56Sopenharmony_citreated by the typing module as a specialized type variable. The one exception 4217db96d56Sopenharmony_cito this is that a list of types can be used to substitute a :class:`ParamSpec`:: 4227db96d56Sopenharmony_ci 4237db96d56Sopenharmony_ci >>> from typing import Generic, ParamSpec, TypeVar 4247db96d56Sopenharmony_ci 4257db96d56Sopenharmony_ci >>> T = TypeVar('T') 4267db96d56Sopenharmony_ci >>> P = ParamSpec('P') 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci >>> class Z(Generic[T, P]): ... 4297db96d56Sopenharmony_ci ... 4307db96d56Sopenharmony_ci >>> Z[int, [dict, float]] 4317db96d56Sopenharmony_ci __main__.Z[int, (<class 'dict'>, <class 'float'>)] 4327db96d56Sopenharmony_ci 4337db96d56Sopenharmony_ciFurthermore, a generic with only one parameter specification variable will accept 4347db96d56Sopenharmony_ciparameter lists in the forms ``X[[Type1, Type2, ...]]`` and also 4357db96d56Sopenharmony_ci``X[Type1, Type2, ...]`` for aesthetic reasons. Internally, the latter is converted 4367db96d56Sopenharmony_cito the former, so the following are equivalent:: 4377db96d56Sopenharmony_ci 4387db96d56Sopenharmony_ci >>> class X(Generic[P]): ... 4397db96d56Sopenharmony_ci ... 4407db96d56Sopenharmony_ci >>> X[int, str] 4417db96d56Sopenharmony_ci __main__.X[(<class 'int'>, <class 'str'>)] 4427db96d56Sopenharmony_ci >>> X[[int, str]] 4437db96d56Sopenharmony_ci __main__.X[(<class 'int'>, <class 'str'>)] 4447db96d56Sopenharmony_ci 4457db96d56Sopenharmony_ciDo note that generics with :class:`ParamSpec` may not have correct 4467db96d56Sopenharmony_ci``__parameters__`` after substitution in some cases because they 4477db96d56Sopenharmony_ciare intended primarily for static type checking. 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci.. versionchanged:: 3.10 4507db96d56Sopenharmony_ci :class:`Generic` can now be parameterized over parameter expressions. 4517db96d56Sopenharmony_ci See :class:`ParamSpec` and :pep:`612` for more details. 4527db96d56Sopenharmony_ci 4537db96d56Sopenharmony_ciA user-defined generic class can have ABCs as base classes without a metaclass 4547db96d56Sopenharmony_ciconflict. Generic metaclasses are not supported. The outcome of parameterizing 4557db96d56Sopenharmony_cigenerics is cached, and most types in the typing module are :term:`hashable` and 4567db96d56Sopenharmony_cicomparable for equality. 4577db96d56Sopenharmony_ci 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_ciThe :data:`Any` type 4607db96d56Sopenharmony_ci==================== 4617db96d56Sopenharmony_ci 4627db96d56Sopenharmony_ciA special kind of type is :data:`Any`. A static type checker will treat 4637db96d56Sopenharmony_cievery type as being compatible with :data:`Any` and :data:`Any` as being 4647db96d56Sopenharmony_cicompatible with every type. 4657db96d56Sopenharmony_ci 4667db96d56Sopenharmony_ciThis means that it is possible to perform any operation or method call on a 4677db96d56Sopenharmony_civalue of type :data:`Any` and assign it to any variable:: 4687db96d56Sopenharmony_ci 4697db96d56Sopenharmony_ci from typing import Any 4707db96d56Sopenharmony_ci 4717db96d56Sopenharmony_ci a: Any = None 4727db96d56Sopenharmony_ci a = [] # OK 4737db96d56Sopenharmony_ci a = 2 # OK 4747db96d56Sopenharmony_ci 4757db96d56Sopenharmony_ci s: str = '' 4767db96d56Sopenharmony_ci s = a # OK 4777db96d56Sopenharmony_ci 4787db96d56Sopenharmony_ci def foo(item: Any) -> int: 4797db96d56Sopenharmony_ci # Passes type checking; 'item' could be any type, 4807db96d56Sopenharmony_ci # and that type might have a 'bar' method 4817db96d56Sopenharmony_ci item.bar() 4827db96d56Sopenharmony_ci ... 4837db96d56Sopenharmony_ci 4847db96d56Sopenharmony_ciNotice that no type checking is performed when assigning a value of type 4857db96d56Sopenharmony_ci:data:`Any` to a more precise type. For example, the static type checker did 4867db96d56Sopenharmony_cinot report an error when assigning ``a`` to ``s`` even though ``s`` was 4877db96d56Sopenharmony_cideclared to be of type :class:`str` and receives an :class:`int` value at 4887db96d56Sopenharmony_ciruntime! 4897db96d56Sopenharmony_ci 4907db96d56Sopenharmony_ciFurthermore, all functions without a return type or parameter types will 4917db96d56Sopenharmony_ciimplicitly default to using :data:`Any`:: 4927db96d56Sopenharmony_ci 4937db96d56Sopenharmony_ci def legacy_parser(text): 4947db96d56Sopenharmony_ci ... 4957db96d56Sopenharmony_ci return data 4967db96d56Sopenharmony_ci 4977db96d56Sopenharmony_ci # A static type checker will treat the above 4987db96d56Sopenharmony_ci # as having the same signature as: 4997db96d56Sopenharmony_ci def legacy_parser(text: Any) -> Any: 5007db96d56Sopenharmony_ci ... 5017db96d56Sopenharmony_ci return data 5027db96d56Sopenharmony_ci 5037db96d56Sopenharmony_ciThis behavior allows :data:`Any` to be used as an *escape hatch* when you 5047db96d56Sopenharmony_cineed to mix dynamically and statically typed code. 5057db96d56Sopenharmony_ci 5067db96d56Sopenharmony_ciContrast the behavior of :data:`Any` with the behavior of :class:`object`. 5077db96d56Sopenharmony_ciSimilar to :data:`Any`, every type is a subtype of :class:`object`. However, 5087db96d56Sopenharmony_ciunlike :data:`Any`, the reverse is not true: :class:`object` is *not* a 5097db96d56Sopenharmony_cisubtype of every other type. 5107db96d56Sopenharmony_ci 5117db96d56Sopenharmony_ciThat means when the type of a value is :class:`object`, a type checker will 5127db96d56Sopenharmony_cireject almost all operations on it, and assigning it to a variable (or using 5137db96d56Sopenharmony_ciit as a return value) of a more specialized type is a type error. For example:: 5147db96d56Sopenharmony_ci 5157db96d56Sopenharmony_ci def hash_a(item: object) -> int: 5167db96d56Sopenharmony_ci # Fails type checking; an object does not have a 'magic' method. 5177db96d56Sopenharmony_ci item.magic() 5187db96d56Sopenharmony_ci ... 5197db96d56Sopenharmony_ci 5207db96d56Sopenharmony_ci def hash_b(item: Any) -> int: 5217db96d56Sopenharmony_ci # Passes type checking 5227db96d56Sopenharmony_ci item.magic() 5237db96d56Sopenharmony_ci ... 5247db96d56Sopenharmony_ci 5257db96d56Sopenharmony_ci # Passes type checking, since ints and strs are subclasses of object 5267db96d56Sopenharmony_ci hash_a(42) 5277db96d56Sopenharmony_ci hash_a("foo") 5287db96d56Sopenharmony_ci 5297db96d56Sopenharmony_ci # Passes type checking, since Any is compatible with all types 5307db96d56Sopenharmony_ci hash_b(42) 5317db96d56Sopenharmony_ci hash_b("foo") 5327db96d56Sopenharmony_ci 5337db96d56Sopenharmony_ciUse :class:`object` to indicate that a value could be any type in a typesafe 5347db96d56Sopenharmony_cimanner. Use :data:`Any` to indicate that a value is dynamically typed. 5357db96d56Sopenharmony_ci 5367db96d56Sopenharmony_ci 5377db96d56Sopenharmony_ciNominal vs structural subtyping 5387db96d56Sopenharmony_ci=============================== 5397db96d56Sopenharmony_ci 5407db96d56Sopenharmony_ciInitially :pep:`484` defined the Python static type system as using 5417db96d56Sopenharmony_ci*nominal subtyping*. This means that a class ``A`` is allowed where 5427db96d56Sopenharmony_cia class ``B`` is expected if and only if ``A`` is a subclass of ``B``. 5437db96d56Sopenharmony_ci 5447db96d56Sopenharmony_ciThis requirement previously also applied to abstract base classes, such as 5457db96d56Sopenharmony_ci:class:`~collections.abc.Iterable`. The problem with this approach is that a class had 5467db96d56Sopenharmony_cito be explicitly marked to support them, which is unpythonic and unlike 5477db96d56Sopenharmony_ciwhat one would normally do in idiomatic dynamically typed Python code. 5487db96d56Sopenharmony_ciFor example, this conforms to :pep:`484`:: 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci from collections.abc import Sized, Iterable, Iterator 5517db96d56Sopenharmony_ci 5527db96d56Sopenharmony_ci class Bucket(Sized, Iterable[int]): 5537db96d56Sopenharmony_ci ... 5547db96d56Sopenharmony_ci def __len__(self) -> int: ... 5557db96d56Sopenharmony_ci def __iter__(self) -> Iterator[int]: ... 5567db96d56Sopenharmony_ci 5577db96d56Sopenharmony_ci:pep:`544` allows to solve this problem by allowing users to write 5587db96d56Sopenharmony_cithe above code without explicit base classes in the class definition, 5597db96d56Sopenharmony_ciallowing ``Bucket`` to be implicitly considered a subtype of both ``Sized`` 5607db96d56Sopenharmony_ciand ``Iterable[int]`` by static type checkers. This is known as 5617db96d56Sopenharmony_ci*structural subtyping* (or static duck-typing):: 5627db96d56Sopenharmony_ci 5637db96d56Sopenharmony_ci from collections.abc import Iterator, Iterable 5647db96d56Sopenharmony_ci 5657db96d56Sopenharmony_ci class Bucket: # Note: no base classes 5667db96d56Sopenharmony_ci ... 5677db96d56Sopenharmony_ci def __len__(self) -> int: ... 5687db96d56Sopenharmony_ci def __iter__(self) -> Iterator[int]: ... 5697db96d56Sopenharmony_ci 5707db96d56Sopenharmony_ci def collect(items: Iterable[int]) -> int: ... 5717db96d56Sopenharmony_ci result = collect(Bucket()) # Passes type check 5727db96d56Sopenharmony_ci 5737db96d56Sopenharmony_ciMoreover, by subclassing a special class :class:`Protocol`, a user 5747db96d56Sopenharmony_cican define new custom protocols to fully enjoy structural subtyping 5757db96d56Sopenharmony_ci(see examples below). 5767db96d56Sopenharmony_ci 5777db96d56Sopenharmony_ciModule contents 5787db96d56Sopenharmony_ci=============== 5797db96d56Sopenharmony_ci 5807db96d56Sopenharmony_ciThe module defines the following classes, functions and decorators. 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_ci.. note:: 5837db96d56Sopenharmony_ci 5847db96d56Sopenharmony_ci This module defines several types that are subclasses of pre-existing 5857db96d56Sopenharmony_ci standard library classes which also extend :class:`Generic` 5867db96d56Sopenharmony_ci to support type variables inside ``[]``. 5877db96d56Sopenharmony_ci These types became redundant in Python 3.9 when the 5887db96d56Sopenharmony_ci corresponding pre-existing classes were enhanced to support ``[]``. 5897db96d56Sopenharmony_ci 5907db96d56Sopenharmony_ci The redundant types are deprecated as of Python 3.9 but no 5917db96d56Sopenharmony_ci deprecation warnings will be issued by the interpreter. 5927db96d56Sopenharmony_ci It is expected that type checkers will flag the deprecated types 5937db96d56Sopenharmony_ci when the checked program targets Python 3.9 or newer. 5947db96d56Sopenharmony_ci 5957db96d56Sopenharmony_ci The deprecated types will be removed from the :mod:`typing` module 5967db96d56Sopenharmony_ci no sooner than the first Python version released 5 years after the release of Python 3.9.0. 5977db96d56Sopenharmony_ci See details in :pep:`585`—*Type Hinting Generics In Standard Collections*. 5987db96d56Sopenharmony_ci 5997db96d56Sopenharmony_ci 6007db96d56Sopenharmony_ciSpecial typing primitives 6017db96d56Sopenharmony_ci------------------------- 6027db96d56Sopenharmony_ci 6037db96d56Sopenharmony_ciSpecial types 6047db96d56Sopenharmony_ci""""""""""""" 6057db96d56Sopenharmony_ci 6067db96d56Sopenharmony_ciThese can be used as types in annotations and do not support ``[]``. 6077db96d56Sopenharmony_ci 6087db96d56Sopenharmony_ci.. data:: Any 6097db96d56Sopenharmony_ci 6107db96d56Sopenharmony_ci Special type indicating an unconstrained type. 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ci * Every type is compatible with :data:`Any`. 6137db96d56Sopenharmony_ci * :data:`Any` is compatible with every type. 6147db96d56Sopenharmony_ci 6157db96d56Sopenharmony_ci .. versionchanged:: 3.11 6167db96d56Sopenharmony_ci :data:`Any` can now be used as a base class. This can be useful for 6177db96d56Sopenharmony_ci avoiding type checker errors with classes that can duck type anywhere or 6187db96d56Sopenharmony_ci are highly dynamic. 6197db96d56Sopenharmony_ci 6207db96d56Sopenharmony_ci.. data:: AnyStr 6217db96d56Sopenharmony_ci 6227db96d56Sopenharmony_ci ``AnyStr`` is a :ref:`constrained type variable <typing-constrained-typevar>` defined as 6237db96d56Sopenharmony_ci ``AnyStr = TypeVar('AnyStr', str, bytes)``. 6247db96d56Sopenharmony_ci 6257db96d56Sopenharmony_ci It is meant to be used for functions that may accept any kind of string 6267db96d56Sopenharmony_ci without allowing different kinds of strings to mix. For example:: 6277db96d56Sopenharmony_ci 6287db96d56Sopenharmony_ci def concat(a: AnyStr, b: AnyStr) -> AnyStr: 6297db96d56Sopenharmony_ci return a + b 6307db96d56Sopenharmony_ci 6317db96d56Sopenharmony_ci concat(u"foo", u"bar") # Ok, output has type 'unicode' 6327db96d56Sopenharmony_ci concat(b"foo", b"bar") # Ok, output has type 'bytes' 6337db96d56Sopenharmony_ci concat(u"foo", b"bar") # Error, cannot mix unicode and bytes 6347db96d56Sopenharmony_ci 6357db96d56Sopenharmony_ci.. data:: LiteralString 6367db96d56Sopenharmony_ci 6377db96d56Sopenharmony_ci Special type that includes only literal strings. A string 6387db96d56Sopenharmony_ci literal is compatible with ``LiteralString``, as is another 6397db96d56Sopenharmony_ci ``LiteralString``, but an object typed as just ``str`` is not. 6407db96d56Sopenharmony_ci A string created by composing ``LiteralString``-typed objects 6417db96d56Sopenharmony_ci is also acceptable as a ``LiteralString``. 6427db96d56Sopenharmony_ci 6437db96d56Sopenharmony_ci Example:: 6447db96d56Sopenharmony_ci 6457db96d56Sopenharmony_ci def run_query(sql: LiteralString) -> ... 6467db96d56Sopenharmony_ci ... 6477db96d56Sopenharmony_ci 6487db96d56Sopenharmony_ci def caller(arbitrary_string: str, literal_string: LiteralString) -> None: 6497db96d56Sopenharmony_ci run_query("SELECT * FROM students") # ok 6507db96d56Sopenharmony_ci run_query(literal_string) # ok 6517db96d56Sopenharmony_ci run_query("SELECT * FROM " + literal_string) # ok 6527db96d56Sopenharmony_ci run_query(arbitrary_string) # type checker error 6537db96d56Sopenharmony_ci run_query( # type checker error 6547db96d56Sopenharmony_ci f"SELECT * FROM students WHERE name = {arbitrary_string}" 6557db96d56Sopenharmony_ci ) 6567db96d56Sopenharmony_ci 6577db96d56Sopenharmony_ci This is useful for sensitive APIs where arbitrary user-generated 6587db96d56Sopenharmony_ci strings could generate problems. For example, the two cases above 6597db96d56Sopenharmony_ci that generate type checker errors could be vulnerable to an SQL 6607db96d56Sopenharmony_ci injection attack. 6617db96d56Sopenharmony_ci 6627db96d56Sopenharmony_ci See :pep:`675` for more details. 6637db96d56Sopenharmony_ci 6647db96d56Sopenharmony_ci .. versionadded:: 3.11 6657db96d56Sopenharmony_ci 6667db96d56Sopenharmony_ci.. data:: Never 6677db96d56Sopenharmony_ci 6687db96d56Sopenharmony_ci The `bottom type <https://en.wikipedia.org/wiki/Bottom_type>`_, 6697db96d56Sopenharmony_ci a type that has no members. 6707db96d56Sopenharmony_ci 6717db96d56Sopenharmony_ci This can be used to define a function that should never be 6727db96d56Sopenharmony_ci called, or a function that never returns:: 6737db96d56Sopenharmony_ci 6747db96d56Sopenharmony_ci from typing import Never 6757db96d56Sopenharmony_ci 6767db96d56Sopenharmony_ci def never_call_me(arg: Never) -> None: 6777db96d56Sopenharmony_ci pass 6787db96d56Sopenharmony_ci 6797db96d56Sopenharmony_ci def int_or_str(arg: int | str) -> None: 6807db96d56Sopenharmony_ci never_call_me(arg) # type checker error 6817db96d56Sopenharmony_ci match arg: 6827db96d56Sopenharmony_ci case int(): 6837db96d56Sopenharmony_ci print("It's an int") 6847db96d56Sopenharmony_ci case str(): 6857db96d56Sopenharmony_ci print("It's a str") 6867db96d56Sopenharmony_ci case _: 6877db96d56Sopenharmony_ci never_call_me(arg) # ok, arg is of type Never 6887db96d56Sopenharmony_ci 6897db96d56Sopenharmony_ci .. versionadded:: 3.11 6907db96d56Sopenharmony_ci 6917db96d56Sopenharmony_ci On older Python versions, :data:`NoReturn` may be used to express the 6927db96d56Sopenharmony_ci same concept. ``Never`` was added to make the intended meaning more explicit. 6937db96d56Sopenharmony_ci 6947db96d56Sopenharmony_ci.. data:: NoReturn 6957db96d56Sopenharmony_ci 6967db96d56Sopenharmony_ci Special type indicating that a function never returns. 6977db96d56Sopenharmony_ci For example:: 6987db96d56Sopenharmony_ci 6997db96d56Sopenharmony_ci from typing import NoReturn 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_ci def stop() -> NoReturn: 7027db96d56Sopenharmony_ci raise RuntimeError('no way') 7037db96d56Sopenharmony_ci 7047db96d56Sopenharmony_ci ``NoReturn`` can also be used as a 7057db96d56Sopenharmony_ci `bottom type <https://en.wikipedia.org/wiki/Bottom_type>`_, a type that 7067db96d56Sopenharmony_ci has no values. Starting in Python 3.11, the :data:`Never` type should 7077db96d56Sopenharmony_ci be used for this concept instead. Type checkers should treat the two 7087db96d56Sopenharmony_ci equivalently. 7097db96d56Sopenharmony_ci 7107db96d56Sopenharmony_ci .. versionadded:: 3.5.4 7117db96d56Sopenharmony_ci .. versionadded:: 3.6.2 7127db96d56Sopenharmony_ci 7137db96d56Sopenharmony_ci.. data:: Self 7147db96d56Sopenharmony_ci 7157db96d56Sopenharmony_ci Special type to represent the current enclosed class. 7167db96d56Sopenharmony_ci For example:: 7177db96d56Sopenharmony_ci 7187db96d56Sopenharmony_ci from typing import Self 7197db96d56Sopenharmony_ci 7207db96d56Sopenharmony_ci class Foo: 7217db96d56Sopenharmony_ci def return_self(self) -> Self: 7227db96d56Sopenharmony_ci ... 7237db96d56Sopenharmony_ci return self 7247db96d56Sopenharmony_ci 7257db96d56Sopenharmony_ci 7267db96d56Sopenharmony_ci This annotation is semantically equivalent to the following, 7277db96d56Sopenharmony_ci albeit in a more succinct fashion:: 7287db96d56Sopenharmony_ci 7297db96d56Sopenharmony_ci from typing import TypeVar 7307db96d56Sopenharmony_ci 7317db96d56Sopenharmony_ci Self = TypeVar("Self", bound="Foo") 7327db96d56Sopenharmony_ci 7337db96d56Sopenharmony_ci class Foo: 7347db96d56Sopenharmony_ci def return_self(self: Self) -> Self: 7357db96d56Sopenharmony_ci ... 7367db96d56Sopenharmony_ci return self 7377db96d56Sopenharmony_ci 7387db96d56Sopenharmony_ci In general if something currently follows the pattern of:: 7397db96d56Sopenharmony_ci 7407db96d56Sopenharmony_ci class Foo: 7417db96d56Sopenharmony_ci def return_self(self) -> "Foo": 7427db96d56Sopenharmony_ci ... 7437db96d56Sopenharmony_ci return self 7447db96d56Sopenharmony_ci 7457db96d56Sopenharmony_ci You should use :data:`Self` as calls to ``SubclassOfFoo.return_self`` would have 7467db96d56Sopenharmony_ci ``Foo`` as the return type and not ``SubclassOfFoo``. 7477db96d56Sopenharmony_ci 7487db96d56Sopenharmony_ci Other common use cases include: 7497db96d56Sopenharmony_ci 7507db96d56Sopenharmony_ci - :class:`classmethod`\s that are used as alternative constructors and return instances 7517db96d56Sopenharmony_ci of the ``cls`` parameter. 7527db96d56Sopenharmony_ci - Annotating an :meth:`~object.__enter__` method which returns self. 7537db96d56Sopenharmony_ci 7547db96d56Sopenharmony_ci See :pep:`673` for more details. 7557db96d56Sopenharmony_ci 7567db96d56Sopenharmony_ci .. versionadded:: 3.11 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_ci.. data:: TypeAlias 7597db96d56Sopenharmony_ci 7607db96d56Sopenharmony_ci Special annotation for explicitly declaring a :ref:`type alias <type-aliases>`. 7617db96d56Sopenharmony_ci For example:: 7627db96d56Sopenharmony_ci 7637db96d56Sopenharmony_ci from typing import TypeAlias 7647db96d56Sopenharmony_ci 7657db96d56Sopenharmony_ci Factors: TypeAlias = list[int] 7667db96d56Sopenharmony_ci 7677db96d56Sopenharmony_ci See :pep:`613` for more details about explicit type aliases. 7687db96d56Sopenharmony_ci 7697db96d56Sopenharmony_ci .. versionadded:: 3.10 7707db96d56Sopenharmony_ci 7717db96d56Sopenharmony_ciSpecial forms 7727db96d56Sopenharmony_ci""""""""""""" 7737db96d56Sopenharmony_ci 7747db96d56Sopenharmony_ciThese can be used as types in annotations using ``[]``, each having a unique syntax. 7757db96d56Sopenharmony_ci 7767db96d56Sopenharmony_ci.. data:: Tuple 7777db96d56Sopenharmony_ci 7787db96d56Sopenharmony_ci Tuple type; ``Tuple[X, Y]`` is the type of a tuple of two items 7797db96d56Sopenharmony_ci with the first item of type X and the second of type Y. The type of 7807db96d56Sopenharmony_ci the empty tuple can be written as ``Tuple[()]``. 7817db96d56Sopenharmony_ci 7827db96d56Sopenharmony_ci Example: ``Tuple[T1, T2]`` is a tuple of two elements corresponding 7837db96d56Sopenharmony_ci to type variables T1 and T2. ``Tuple[int, float, str]`` is a tuple 7847db96d56Sopenharmony_ci of an int, a float and a string. 7857db96d56Sopenharmony_ci 7867db96d56Sopenharmony_ci To specify a variable-length tuple of homogeneous type, 7877db96d56Sopenharmony_ci use literal ellipsis, e.g. ``Tuple[int, ...]``. A plain :data:`Tuple` 7887db96d56Sopenharmony_ci is equivalent to ``Tuple[Any, ...]``, and in turn to :class:`tuple`. 7897db96d56Sopenharmony_ci 7907db96d56Sopenharmony_ci .. deprecated:: 3.9 7917db96d56Sopenharmony_ci :class:`builtins.tuple <tuple>` now supports subscripting (``[]``). 7927db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 7937db96d56Sopenharmony_ci 7947db96d56Sopenharmony_ci.. data:: Union 7957db96d56Sopenharmony_ci 7967db96d56Sopenharmony_ci Union type; ``Union[X, Y]`` is equivalent to ``X | Y`` and means either X or Y. 7977db96d56Sopenharmony_ci 7987db96d56Sopenharmony_ci To define a union, use e.g. ``Union[int, str]`` or the shorthand ``int | str``. Using that shorthand is recommended. Details: 7997db96d56Sopenharmony_ci 8007db96d56Sopenharmony_ci * The arguments must be types and there must be at least one. 8017db96d56Sopenharmony_ci 8027db96d56Sopenharmony_ci * Unions of unions are flattened, e.g.:: 8037db96d56Sopenharmony_ci 8047db96d56Sopenharmony_ci Union[Union[int, str], float] == Union[int, str, float] 8057db96d56Sopenharmony_ci 8067db96d56Sopenharmony_ci * Unions of a single argument vanish, e.g.:: 8077db96d56Sopenharmony_ci 8087db96d56Sopenharmony_ci Union[int] == int # The constructor actually returns int 8097db96d56Sopenharmony_ci 8107db96d56Sopenharmony_ci * Redundant arguments are skipped, e.g.:: 8117db96d56Sopenharmony_ci 8127db96d56Sopenharmony_ci Union[int, str, int] == Union[int, str] == int | str 8137db96d56Sopenharmony_ci 8147db96d56Sopenharmony_ci * When comparing unions, the argument order is ignored, e.g.:: 8157db96d56Sopenharmony_ci 8167db96d56Sopenharmony_ci Union[int, str] == Union[str, int] 8177db96d56Sopenharmony_ci 8187db96d56Sopenharmony_ci * You cannot subclass or instantiate a ``Union``. 8197db96d56Sopenharmony_ci 8207db96d56Sopenharmony_ci * You cannot write ``Union[X][Y]``. 8217db96d56Sopenharmony_ci 8227db96d56Sopenharmony_ci .. versionchanged:: 3.7 8237db96d56Sopenharmony_ci Don't remove explicit subclasses from unions at runtime. 8247db96d56Sopenharmony_ci 8257db96d56Sopenharmony_ci .. versionchanged:: 3.10 8267db96d56Sopenharmony_ci Unions can now be written as ``X | Y``. See 8277db96d56Sopenharmony_ci :ref:`union type expressions<types-union>`. 8287db96d56Sopenharmony_ci 8297db96d56Sopenharmony_ci.. data:: Optional 8307db96d56Sopenharmony_ci 8317db96d56Sopenharmony_ci Optional type. 8327db96d56Sopenharmony_ci 8337db96d56Sopenharmony_ci ``Optional[X]`` is equivalent to ``X | None`` (or ``Union[X, None]``). 8347db96d56Sopenharmony_ci 8357db96d56Sopenharmony_ci Note that this is not the same concept as an optional argument, 8367db96d56Sopenharmony_ci which is one that has a default. An optional argument with a 8377db96d56Sopenharmony_ci default does not require the ``Optional`` qualifier on its type 8387db96d56Sopenharmony_ci annotation just because it is optional. For example:: 8397db96d56Sopenharmony_ci 8407db96d56Sopenharmony_ci def foo(arg: int = 0) -> None: 8417db96d56Sopenharmony_ci ... 8427db96d56Sopenharmony_ci 8437db96d56Sopenharmony_ci On the other hand, if an explicit value of ``None`` is allowed, the 8447db96d56Sopenharmony_ci use of ``Optional`` is appropriate, whether the argument is optional 8457db96d56Sopenharmony_ci or not. For example:: 8467db96d56Sopenharmony_ci 8477db96d56Sopenharmony_ci def foo(arg: Optional[int] = None) -> None: 8487db96d56Sopenharmony_ci ... 8497db96d56Sopenharmony_ci 8507db96d56Sopenharmony_ci .. versionchanged:: 3.10 8517db96d56Sopenharmony_ci Optional can now be written as ``X | None``. See 8527db96d56Sopenharmony_ci :ref:`union type expressions<types-union>`. 8537db96d56Sopenharmony_ci 8547db96d56Sopenharmony_ci.. data:: Callable 8557db96d56Sopenharmony_ci 8567db96d56Sopenharmony_ci Callable type; ``Callable[[int], str]`` is a function of (int) -> str. 8577db96d56Sopenharmony_ci 8587db96d56Sopenharmony_ci The subscription syntax must always be used with exactly two 8597db96d56Sopenharmony_ci values: the argument list and the return type. The argument list 8607db96d56Sopenharmony_ci must be a list of types or an ellipsis; the return type must be 8617db96d56Sopenharmony_ci a single type. 8627db96d56Sopenharmony_ci 8637db96d56Sopenharmony_ci There is no syntax to indicate optional or keyword arguments; 8647db96d56Sopenharmony_ci such function types are rarely used as callback types. 8657db96d56Sopenharmony_ci ``Callable[..., ReturnType]`` (literal ellipsis) can be used to 8667db96d56Sopenharmony_ci type hint a callable taking any number of arguments and returning 8677db96d56Sopenharmony_ci ``ReturnType``. A plain :data:`Callable` is equivalent to 8687db96d56Sopenharmony_ci ``Callable[..., Any]``, and in turn to 8697db96d56Sopenharmony_ci :class:`collections.abc.Callable`. 8707db96d56Sopenharmony_ci 8717db96d56Sopenharmony_ci Callables which take other callables as arguments may indicate that their 8727db96d56Sopenharmony_ci parameter types are dependent on each other using :class:`ParamSpec`. 8737db96d56Sopenharmony_ci Additionally, if that callable adds or removes arguments from other 8747db96d56Sopenharmony_ci callables, the :data:`Concatenate` operator may be used. They 8757db96d56Sopenharmony_ci take the form ``Callable[ParamSpecVariable, ReturnType]`` and 8767db96d56Sopenharmony_ci ``Callable[Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable], ReturnType]`` 8777db96d56Sopenharmony_ci respectively. 8787db96d56Sopenharmony_ci 8797db96d56Sopenharmony_ci .. deprecated:: 3.9 8807db96d56Sopenharmony_ci :class:`collections.abc.Callable` now supports subscripting (``[]``). 8817db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 8827db96d56Sopenharmony_ci 8837db96d56Sopenharmony_ci .. versionchanged:: 3.10 8847db96d56Sopenharmony_ci ``Callable`` now supports :class:`ParamSpec` and :data:`Concatenate`. 8857db96d56Sopenharmony_ci See :pep:`612` for more details. 8867db96d56Sopenharmony_ci 8877db96d56Sopenharmony_ci .. seealso:: 8887db96d56Sopenharmony_ci The documentation for :class:`ParamSpec` and :class:`Concatenate` provide 8897db96d56Sopenharmony_ci examples of usage with ``Callable``. 8907db96d56Sopenharmony_ci 8917db96d56Sopenharmony_ci.. data:: Concatenate 8927db96d56Sopenharmony_ci 8937db96d56Sopenharmony_ci Used with :data:`Callable` and :class:`ParamSpec` to type annotate a higher 8947db96d56Sopenharmony_ci order callable which adds, removes, or transforms parameters of another 8957db96d56Sopenharmony_ci callable. Usage is in the form 8967db96d56Sopenharmony_ci ``Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]``. ``Concatenate`` 8977db96d56Sopenharmony_ci is currently only valid when used as the first argument to a :data:`Callable`. 8987db96d56Sopenharmony_ci The last parameter to ``Concatenate`` must be a :class:`ParamSpec` or 8997db96d56Sopenharmony_ci ellipsis (``...``). 9007db96d56Sopenharmony_ci 9017db96d56Sopenharmony_ci For example, to annotate a decorator ``with_lock`` which provides a 9027db96d56Sopenharmony_ci :class:`threading.Lock` to the decorated function, ``Concatenate`` can be 9037db96d56Sopenharmony_ci used to indicate that ``with_lock`` expects a callable which takes in a 9047db96d56Sopenharmony_ci ``Lock`` as the first argument, and returns a callable with a different type 9057db96d56Sopenharmony_ci signature. In this case, the :class:`ParamSpec` indicates that the returned 9067db96d56Sopenharmony_ci callable's parameter types are dependent on the parameter types of the 9077db96d56Sopenharmony_ci callable being passed in:: 9087db96d56Sopenharmony_ci 9097db96d56Sopenharmony_ci from collections.abc import Callable 9107db96d56Sopenharmony_ci from threading import Lock 9117db96d56Sopenharmony_ci from typing import Concatenate, ParamSpec, TypeVar 9127db96d56Sopenharmony_ci 9137db96d56Sopenharmony_ci P = ParamSpec('P') 9147db96d56Sopenharmony_ci R = TypeVar('R') 9157db96d56Sopenharmony_ci 9167db96d56Sopenharmony_ci # Use this lock to ensure that only one thread is executing a function 9177db96d56Sopenharmony_ci # at any time. 9187db96d56Sopenharmony_ci my_lock = Lock() 9197db96d56Sopenharmony_ci 9207db96d56Sopenharmony_ci def with_lock(f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]: 9217db96d56Sopenharmony_ci '''A type-safe decorator which provides a lock.''' 9227db96d56Sopenharmony_ci def inner(*args: P.args, **kwargs: P.kwargs) -> R: 9237db96d56Sopenharmony_ci # Provide the lock as the first argument. 9247db96d56Sopenharmony_ci return f(my_lock, *args, **kwargs) 9257db96d56Sopenharmony_ci return inner 9267db96d56Sopenharmony_ci 9277db96d56Sopenharmony_ci @with_lock 9287db96d56Sopenharmony_ci def sum_threadsafe(lock: Lock, numbers: list[float]) -> float: 9297db96d56Sopenharmony_ci '''Add a list of numbers together in a thread-safe manner.''' 9307db96d56Sopenharmony_ci with lock: 9317db96d56Sopenharmony_ci return sum(numbers) 9327db96d56Sopenharmony_ci 9337db96d56Sopenharmony_ci # We don't need to pass in the lock ourselves thanks to the decorator. 9347db96d56Sopenharmony_ci sum_threadsafe([1.1, 2.2, 3.3]) 9357db96d56Sopenharmony_ci 9367db96d56Sopenharmony_ci .. versionadded:: 3.10 9377db96d56Sopenharmony_ci 9387db96d56Sopenharmony_ci .. seealso:: 9397db96d56Sopenharmony_ci 9407db96d56Sopenharmony_ci * :pep:`612` -- Parameter Specification Variables (the PEP which introduced 9417db96d56Sopenharmony_ci ``ParamSpec`` and ``Concatenate``). 9427db96d56Sopenharmony_ci * :class:`ParamSpec` and :class:`Callable`. 9437db96d56Sopenharmony_ci 9447db96d56Sopenharmony_ci 9457db96d56Sopenharmony_ci.. class:: Type(Generic[CT_co]) 9467db96d56Sopenharmony_ci 9477db96d56Sopenharmony_ci A variable annotated with ``C`` may accept a value of type ``C``. In 9487db96d56Sopenharmony_ci contrast, a variable annotated with ``Type[C]`` may accept values that are 9497db96d56Sopenharmony_ci classes themselves -- specifically, it will accept the *class object* of 9507db96d56Sopenharmony_ci ``C``. For example:: 9517db96d56Sopenharmony_ci 9527db96d56Sopenharmony_ci a = 3 # Has type 'int' 9537db96d56Sopenharmony_ci b = int # Has type 'Type[int]' 9547db96d56Sopenharmony_ci c = type(a) # Also has type 'Type[int]' 9557db96d56Sopenharmony_ci 9567db96d56Sopenharmony_ci Note that ``Type[C]`` is covariant:: 9577db96d56Sopenharmony_ci 9587db96d56Sopenharmony_ci class User: ... 9597db96d56Sopenharmony_ci class BasicUser(User): ... 9607db96d56Sopenharmony_ci class ProUser(User): ... 9617db96d56Sopenharmony_ci class TeamUser(User): ... 9627db96d56Sopenharmony_ci 9637db96d56Sopenharmony_ci # Accepts User, BasicUser, ProUser, TeamUser, ... 9647db96d56Sopenharmony_ci def make_new_user(user_class: Type[User]) -> User: 9657db96d56Sopenharmony_ci # ... 9667db96d56Sopenharmony_ci return user_class() 9677db96d56Sopenharmony_ci 9687db96d56Sopenharmony_ci The fact that ``Type[C]`` is covariant implies that all subclasses of 9697db96d56Sopenharmony_ci ``C`` should implement the same constructor signature and class method 9707db96d56Sopenharmony_ci signatures as ``C``. The type checker should flag violations of this, 9717db96d56Sopenharmony_ci but should also allow constructor calls in subclasses that match the 9727db96d56Sopenharmony_ci constructor calls in the indicated base class. How the type checker is 9737db96d56Sopenharmony_ci required to handle this particular case may change in future revisions of 9747db96d56Sopenharmony_ci :pep:`484`. 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_ci The only legal parameters for :class:`Type` are classes, :data:`Any`, 9777db96d56Sopenharmony_ci :ref:`type variables <generics>`, and unions of any of these types. 9787db96d56Sopenharmony_ci For example:: 9797db96d56Sopenharmony_ci 9807db96d56Sopenharmony_ci def new_non_team_user(user_class: Type[BasicUser | ProUser]): ... 9817db96d56Sopenharmony_ci 9827db96d56Sopenharmony_ci ``Type[Any]`` is equivalent to ``Type`` which in turn is equivalent 9837db96d56Sopenharmony_ci to ``type``, which is the root of Python's metaclass hierarchy. 9847db96d56Sopenharmony_ci 9857db96d56Sopenharmony_ci .. versionadded:: 3.5.2 9867db96d56Sopenharmony_ci 9877db96d56Sopenharmony_ci .. deprecated:: 3.9 9887db96d56Sopenharmony_ci :class:`builtins.type <type>` now supports subscripting (``[]``). 9897db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 9907db96d56Sopenharmony_ci 9917db96d56Sopenharmony_ci.. data:: Literal 9927db96d56Sopenharmony_ci 9937db96d56Sopenharmony_ci A type that can be used to indicate to type checkers that the 9947db96d56Sopenharmony_ci corresponding variable or function parameter has a value equivalent to 9957db96d56Sopenharmony_ci the provided literal (or one of several literals). For example:: 9967db96d56Sopenharmony_ci 9977db96d56Sopenharmony_ci def validate_simple(data: Any) -> Literal[True]: # always returns True 9987db96d56Sopenharmony_ci ... 9997db96d56Sopenharmony_ci 10007db96d56Sopenharmony_ci MODE = Literal['r', 'rb', 'w', 'wb'] 10017db96d56Sopenharmony_ci def open_helper(file: str, mode: MODE) -> str: 10027db96d56Sopenharmony_ci ... 10037db96d56Sopenharmony_ci 10047db96d56Sopenharmony_ci open_helper('/some/path', 'r') # Passes type check 10057db96d56Sopenharmony_ci open_helper('/other/path', 'typo') # Error in type checker 10067db96d56Sopenharmony_ci 10077db96d56Sopenharmony_ci ``Literal[...]`` cannot be subclassed. At runtime, an arbitrary value 10087db96d56Sopenharmony_ci is allowed as type argument to ``Literal[...]``, but type checkers may 10097db96d56Sopenharmony_ci impose restrictions. See :pep:`586` for more details about literal types. 10107db96d56Sopenharmony_ci 10117db96d56Sopenharmony_ci .. versionadded:: 3.8 10127db96d56Sopenharmony_ci 10137db96d56Sopenharmony_ci .. versionchanged:: 3.9.1 10147db96d56Sopenharmony_ci ``Literal`` now de-duplicates parameters. Equality comparisons of 10157db96d56Sopenharmony_ci ``Literal`` objects are no longer order dependent. ``Literal`` objects 10167db96d56Sopenharmony_ci will now raise a :exc:`TypeError` exception during equality comparisons 10177db96d56Sopenharmony_ci if one of their parameters are not :term:`hashable`. 10187db96d56Sopenharmony_ci 10197db96d56Sopenharmony_ci.. data:: ClassVar 10207db96d56Sopenharmony_ci 10217db96d56Sopenharmony_ci Special type construct to mark class variables. 10227db96d56Sopenharmony_ci 10237db96d56Sopenharmony_ci As introduced in :pep:`526`, a variable annotation wrapped in ClassVar 10247db96d56Sopenharmony_ci indicates that a given attribute is intended to be used as a class variable 10257db96d56Sopenharmony_ci and should not be set on instances of that class. Usage:: 10267db96d56Sopenharmony_ci 10277db96d56Sopenharmony_ci class Starship: 10287db96d56Sopenharmony_ci stats: ClassVar[dict[str, int]] = {} # class variable 10297db96d56Sopenharmony_ci damage: int = 10 # instance variable 10307db96d56Sopenharmony_ci 10317db96d56Sopenharmony_ci :data:`ClassVar` accepts only types and cannot be further subscribed. 10327db96d56Sopenharmony_ci 10337db96d56Sopenharmony_ci :data:`ClassVar` is not a class itself, and should not 10347db96d56Sopenharmony_ci be used with :func:`isinstance` or :func:`issubclass`. 10357db96d56Sopenharmony_ci :data:`ClassVar` does not change Python runtime behavior, but 10367db96d56Sopenharmony_ci it can be used by third-party type checkers. For example, a type checker 10377db96d56Sopenharmony_ci might flag the following code as an error:: 10387db96d56Sopenharmony_ci 10397db96d56Sopenharmony_ci enterprise_d = Starship(3000) 10407db96d56Sopenharmony_ci enterprise_d.stats = {} # Error, setting class variable on instance 10417db96d56Sopenharmony_ci Starship.stats = {} # This is OK 10427db96d56Sopenharmony_ci 10437db96d56Sopenharmony_ci .. versionadded:: 3.5.3 10447db96d56Sopenharmony_ci 10457db96d56Sopenharmony_ci.. data:: Final 10467db96d56Sopenharmony_ci 10477db96d56Sopenharmony_ci A special typing construct to indicate to type checkers that a name 10487db96d56Sopenharmony_ci cannot be re-assigned or overridden in a subclass. For example:: 10497db96d56Sopenharmony_ci 10507db96d56Sopenharmony_ci MAX_SIZE: Final = 9000 10517db96d56Sopenharmony_ci MAX_SIZE += 1 # Error reported by type checker 10527db96d56Sopenharmony_ci 10537db96d56Sopenharmony_ci class Connection: 10547db96d56Sopenharmony_ci TIMEOUT: Final[int] = 10 10557db96d56Sopenharmony_ci 10567db96d56Sopenharmony_ci class FastConnector(Connection): 10577db96d56Sopenharmony_ci TIMEOUT = 1 # Error reported by type checker 10587db96d56Sopenharmony_ci 10597db96d56Sopenharmony_ci There is no runtime checking of these properties. See :pep:`591` for 10607db96d56Sopenharmony_ci more details. 10617db96d56Sopenharmony_ci 10627db96d56Sopenharmony_ci .. versionadded:: 3.8 10637db96d56Sopenharmony_ci 10647db96d56Sopenharmony_ci.. data:: Required 10657db96d56Sopenharmony_ci 10667db96d56Sopenharmony_ci.. data:: NotRequired 10677db96d56Sopenharmony_ci 10687db96d56Sopenharmony_ci Special typing constructs that mark individual keys of a :class:`TypedDict` 10697db96d56Sopenharmony_ci as either required or non-required respectively. 10707db96d56Sopenharmony_ci 10717db96d56Sopenharmony_ci See :class:`TypedDict` and :pep:`655` for more details. 10727db96d56Sopenharmony_ci 10737db96d56Sopenharmony_ci .. versionadded:: 3.11 10747db96d56Sopenharmony_ci 10757db96d56Sopenharmony_ci.. data:: Annotated 10767db96d56Sopenharmony_ci 10777db96d56Sopenharmony_ci A type, introduced in :pep:`593` (``Flexible function and variable 10787db96d56Sopenharmony_ci annotations``), to decorate existing types with context-specific metadata 10797db96d56Sopenharmony_ci (possibly multiple pieces of it, as ``Annotated`` is variadic). 10807db96d56Sopenharmony_ci Specifically, a type ``T`` can be annotated with metadata ``x`` via the 10817db96d56Sopenharmony_ci typehint ``Annotated[T, x]``. This metadata can be used for either static 10827db96d56Sopenharmony_ci analysis or at runtime. If a library (or tool) encounters a typehint 10837db96d56Sopenharmony_ci ``Annotated[T, x]`` and has no special logic for metadata ``x``, it 10847db96d56Sopenharmony_ci should ignore it and simply treat the type as ``T``. Unlike the 10857db96d56Sopenharmony_ci ``no_type_check`` functionality that currently exists in the ``typing`` 10867db96d56Sopenharmony_ci module which completely disables typechecking annotations on a function 10877db96d56Sopenharmony_ci or a class, the ``Annotated`` type allows for both static typechecking 10887db96d56Sopenharmony_ci of ``T`` (which can safely ignore ``x``) 10897db96d56Sopenharmony_ci together with runtime access to ``x`` within a specific application. 10907db96d56Sopenharmony_ci 10917db96d56Sopenharmony_ci Ultimately, the responsibility of how to interpret the annotations (if 10927db96d56Sopenharmony_ci at all) is the responsibility of the tool or library encountering the 10937db96d56Sopenharmony_ci ``Annotated`` type. A tool or library encountering an ``Annotated`` type 10947db96d56Sopenharmony_ci can scan through the annotations to determine if they are of interest 10957db96d56Sopenharmony_ci (e.g., using ``isinstance()``). 10967db96d56Sopenharmony_ci 10977db96d56Sopenharmony_ci When a tool or a library does not support annotations or encounters an 10987db96d56Sopenharmony_ci unknown annotation it should just ignore it and treat annotated type as 10997db96d56Sopenharmony_ci the underlying type. 11007db96d56Sopenharmony_ci 11017db96d56Sopenharmony_ci It's up to the tool consuming the annotations to decide whether the 11027db96d56Sopenharmony_ci client is allowed to have several annotations on one type and how to 11037db96d56Sopenharmony_ci merge those annotations. 11047db96d56Sopenharmony_ci 11057db96d56Sopenharmony_ci Since the ``Annotated`` type allows you to put several annotations of 11067db96d56Sopenharmony_ci the same (or different) type(s) on any node, the tools or libraries 11077db96d56Sopenharmony_ci consuming those annotations are in charge of dealing with potential 11087db96d56Sopenharmony_ci duplicates. For example, if you are doing value range analysis you might 11097db96d56Sopenharmony_ci allow this:: 11107db96d56Sopenharmony_ci 11117db96d56Sopenharmony_ci T1 = Annotated[int, ValueRange(-10, 5)] 11127db96d56Sopenharmony_ci T2 = Annotated[T1, ValueRange(-20, 3)] 11137db96d56Sopenharmony_ci 11147db96d56Sopenharmony_ci Passing ``include_extras=True`` to :func:`get_type_hints` lets one 11157db96d56Sopenharmony_ci access the extra annotations at runtime. 11167db96d56Sopenharmony_ci 11177db96d56Sopenharmony_ci The details of the syntax: 11187db96d56Sopenharmony_ci 11197db96d56Sopenharmony_ci * The first argument to ``Annotated`` must be a valid type 11207db96d56Sopenharmony_ci 11217db96d56Sopenharmony_ci * Multiple type annotations are supported (``Annotated`` supports variadic 11227db96d56Sopenharmony_ci arguments):: 11237db96d56Sopenharmony_ci 11247db96d56Sopenharmony_ci Annotated[int, ValueRange(3, 10), ctype("char")] 11257db96d56Sopenharmony_ci 11267db96d56Sopenharmony_ci * ``Annotated`` must be called with at least two arguments ( 11277db96d56Sopenharmony_ci ``Annotated[int]`` is not valid) 11287db96d56Sopenharmony_ci 11297db96d56Sopenharmony_ci * The order of the annotations is preserved and matters for equality 11307db96d56Sopenharmony_ci checks:: 11317db96d56Sopenharmony_ci 11327db96d56Sopenharmony_ci Annotated[int, ValueRange(3, 10), ctype("char")] != Annotated[ 11337db96d56Sopenharmony_ci int, ctype("char"), ValueRange(3, 10) 11347db96d56Sopenharmony_ci ] 11357db96d56Sopenharmony_ci 11367db96d56Sopenharmony_ci * Nested ``Annotated`` types are flattened, with metadata ordered 11377db96d56Sopenharmony_ci starting with the innermost annotation:: 11387db96d56Sopenharmony_ci 11397db96d56Sopenharmony_ci Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[ 11407db96d56Sopenharmony_ci int, ValueRange(3, 10), ctype("char") 11417db96d56Sopenharmony_ci ] 11427db96d56Sopenharmony_ci 11437db96d56Sopenharmony_ci * Duplicated annotations are not removed:: 11447db96d56Sopenharmony_ci 11457db96d56Sopenharmony_ci Annotated[int, ValueRange(3, 10)] != Annotated[ 11467db96d56Sopenharmony_ci int, ValueRange(3, 10), ValueRange(3, 10) 11477db96d56Sopenharmony_ci ] 11487db96d56Sopenharmony_ci 11497db96d56Sopenharmony_ci * ``Annotated`` can be used with nested and generic aliases:: 11507db96d56Sopenharmony_ci 11517db96d56Sopenharmony_ci T = TypeVar('T') 11527db96d56Sopenharmony_ci Vec = Annotated[list[tuple[T, T]], MaxLen(10)] 11537db96d56Sopenharmony_ci V = Vec[int] 11547db96d56Sopenharmony_ci 11557db96d56Sopenharmony_ci V == Annotated[list[tuple[int, int]], MaxLen(10)] 11567db96d56Sopenharmony_ci 11577db96d56Sopenharmony_ci .. versionadded:: 3.9 11587db96d56Sopenharmony_ci 11597db96d56Sopenharmony_ci 11607db96d56Sopenharmony_ci.. data:: TypeGuard 11617db96d56Sopenharmony_ci 11627db96d56Sopenharmony_ci Special typing form used to annotate the return type of a user-defined 11637db96d56Sopenharmony_ci type guard function. ``TypeGuard`` only accepts a single type argument. 11647db96d56Sopenharmony_ci At runtime, functions marked this way should return a boolean. 11657db96d56Sopenharmony_ci 11667db96d56Sopenharmony_ci ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static 11677db96d56Sopenharmony_ci type checkers to determine a more precise type of an expression within a 11687db96d56Sopenharmony_ci program's code flow. Usually type narrowing is done by analyzing 11697db96d56Sopenharmony_ci conditional code flow and applying the narrowing to a block of code. The 11707db96d56Sopenharmony_ci conditional expression here is sometimes referred to as a "type guard":: 11717db96d56Sopenharmony_ci 11727db96d56Sopenharmony_ci def is_str(val: str | float): 11737db96d56Sopenharmony_ci # "isinstance" type guard 11747db96d56Sopenharmony_ci if isinstance(val, str): 11757db96d56Sopenharmony_ci # Type of ``val`` is narrowed to ``str`` 11767db96d56Sopenharmony_ci ... 11777db96d56Sopenharmony_ci else: 11787db96d56Sopenharmony_ci # Else, type of ``val`` is narrowed to ``float``. 11797db96d56Sopenharmony_ci ... 11807db96d56Sopenharmony_ci 11817db96d56Sopenharmony_ci Sometimes it would be convenient to use a user-defined boolean function 11827db96d56Sopenharmony_ci as a type guard. Such a function should use ``TypeGuard[...]`` as its 11837db96d56Sopenharmony_ci return type to alert static type checkers to this intention. 11847db96d56Sopenharmony_ci 11857db96d56Sopenharmony_ci Using ``-> TypeGuard`` tells the static type checker that for a given 11867db96d56Sopenharmony_ci function: 11877db96d56Sopenharmony_ci 11887db96d56Sopenharmony_ci 1. The return value is a boolean. 11897db96d56Sopenharmony_ci 2. If the return value is ``True``, the type of its argument 11907db96d56Sopenharmony_ci is the type inside ``TypeGuard``. 11917db96d56Sopenharmony_ci 11927db96d56Sopenharmony_ci For example:: 11937db96d56Sopenharmony_ci 11947db96d56Sopenharmony_ci def is_str_list(val: list[object]) -> TypeGuard[list[str]]: 11957db96d56Sopenharmony_ci '''Determines whether all objects in the list are strings''' 11967db96d56Sopenharmony_ci return all(isinstance(x, str) for x in val) 11977db96d56Sopenharmony_ci 11987db96d56Sopenharmony_ci def func1(val: list[object]): 11997db96d56Sopenharmony_ci if is_str_list(val): 12007db96d56Sopenharmony_ci # Type of ``val`` is narrowed to ``list[str]``. 12017db96d56Sopenharmony_ci print(" ".join(val)) 12027db96d56Sopenharmony_ci else: 12037db96d56Sopenharmony_ci # Type of ``val`` remains as ``list[object]``. 12047db96d56Sopenharmony_ci print("Not a list of strings!") 12057db96d56Sopenharmony_ci 12067db96d56Sopenharmony_ci If ``is_str_list`` is a class or instance method, then the type in 12077db96d56Sopenharmony_ci ``TypeGuard`` maps to the type of the second parameter after ``cls`` or 12087db96d56Sopenharmony_ci ``self``. 12097db96d56Sopenharmony_ci 12107db96d56Sopenharmony_ci In short, the form ``def foo(arg: TypeA) -> TypeGuard[TypeB]: ...``, 12117db96d56Sopenharmony_ci means that if ``foo(arg)`` returns ``True``, then ``arg`` narrows from 12127db96d56Sopenharmony_ci ``TypeA`` to ``TypeB``. 12137db96d56Sopenharmony_ci 12147db96d56Sopenharmony_ci .. note:: 12157db96d56Sopenharmony_ci 12167db96d56Sopenharmony_ci ``TypeB`` need not be a narrower form of ``TypeA`` -- it can even be a 12177db96d56Sopenharmony_ci wider form. The main reason is to allow for things like 12187db96d56Sopenharmony_ci narrowing ``list[object]`` to ``list[str]`` even though the latter 12197db96d56Sopenharmony_ci is not a subtype of the former, since ``list`` is invariant. 12207db96d56Sopenharmony_ci The responsibility of writing type-safe type guards is left to the user. 12217db96d56Sopenharmony_ci 12227db96d56Sopenharmony_ci ``TypeGuard`` also works with type variables. See :pep:`647` for more details. 12237db96d56Sopenharmony_ci 12247db96d56Sopenharmony_ci .. versionadded:: 3.10 12257db96d56Sopenharmony_ci 12267db96d56Sopenharmony_ci 12277db96d56Sopenharmony_ci.. data:: Unpack 12287db96d56Sopenharmony_ci 12297db96d56Sopenharmony_ci A typing operator that conceptually marks an object as having been 12307db96d56Sopenharmony_ci unpacked. For example, using the unpack operator ``*`` on a 12317db96d56Sopenharmony_ci :class:`type variable tuple <TypeVarTuple>` is equivalent to using ``Unpack`` 12327db96d56Sopenharmony_ci to mark the type variable tuple as having been unpacked:: 12337db96d56Sopenharmony_ci 12347db96d56Sopenharmony_ci Ts = TypeVarTuple('Ts') 12357db96d56Sopenharmony_ci tup: tuple[*Ts] 12367db96d56Sopenharmony_ci # Effectively does: 12377db96d56Sopenharmony_ci tup: tuple[Unpack[Ts]] 12387db96d56Sopenharmony_ci 12397db96d56Sopenharmony_ci In fact, ``Unpack`` can be used interchangeably with ``*`` in the context 12407db96d56Sopenharmony_ci of :class:`typing.TypeVarTuple <TypeVarTuple>` and 12417db96d56Sopenharmony_ci :class:`builtins.tuple <tuple>` types. You might see ``Unpack`` being used 12427db96d56Sopenharmony_ci explicitly in older versions of Python, where ``*`` couldn't be used in 12437db96d56Sopenharmony_ci certain places:: 12447db96d56Sopenharmony_ci 12457db96d56Sopenharmony_ci # In older versions of Python, TypeVarTuple and Unpack 12467db96d56Sopenharmony_ci # are located in the `typing_extensions` backports package. 12477db96d56Sopenharmony_ci from typing_extensions import TypeVarTuple, Unpack 12487db96d56Sopenharmony_ci 12497db96d56Sopenharmony_ci Ts = TypeVarTuple('Ts') 12507db96d56Sopenharmony_ci tup: tuple[*Ts] # Syntax error on Python <= 3.10! 12517db96d56Sopenharmony_ci tup: tuple[Unpack[Ts]] # Semantically equivalent, and backwards-compatible 12527db96d56Sopenharmony_ci 12537db96d56Sopenharmony_ci .. versionadded:: 3.11 12547db96d56Sopenharmony_ci 12557db96d56Sopenharmony_ciBuilding generic types 12567db96d56Sopenharmony_ci"""""""""""""""""""""" 12577db96d56Sopenharmony_ci 12587db96d56Sopenharmony_ciThe following objects are not used directly in annotations. Instead, they are building blocks 12597db96d56Sopenharmony_cifor creating generic types. 12607db96d56Sopenharmony_ci 12617db96d56Sopenharmony_ci.. class:: Generic 12627db96d56Sopenharmony_ci 12637db96d56Sopenharmony_ci Abstract base class for generic types. 12647db96d56Sopenharmony_ci 12657db96d56Sopenharmony_ci A generic type is typically declared by inheriting from an 12667db96d56Sopenharmony_ci instantiation of this class with one or more type variables. 12677db96d56Sopenharmony_ci For example, a generic mapping type might be defined as:: 12687db96d56Sopenharmony_ci 12697db96d56Sopenharmony_ci class Mapping(Generic[KT, VT]): 12707db96d56Sopenharmony_ci def __getitem__(self, key: KT) -> VT: 12717db96d56Sopenharmony_ci ... 12727db96d56Sopenharmony_ci # Etc. 12737db96d56Sopenharmony_ci 12747db96d56Sopenharmony_ci This class can then be used as follows:: 12757db96d56Sopenharmony_ci 12767db96d56Sopenharmony_ci X = TypeVar('X') 12777db96d56Sopenharmony_ci Y = TypeVar('Y') 12787db96d56Sopenharmony_ci 12797db96d56Sopenharmony_ci def lookup_name(mapping: Mapping[X, Y], key: X, default: Y) -> Y: 12807db96d56Sopenharmony_ci try: 12817db96d56Sopenharmony_ci return mapping[key] 12827db96d56Sopenharmony_ci except KeyError: 12837db96d56Sopenharmony_ci return default 12847db96d56Sopenharmony_ci 12857db96d56Sopenharmony_ci.. class:: TypeVar(name, *constraints, bound=None, covariant=False, contravariant=False) 12867db96d56Sopenharmony_ci 12877db96d56Sopenharmony_ci Type variable. 12887db96d56Sopenharmony_ci 12897db96d56Sopenharmony_ci Usage:: 12907db96d56Sopenharmony_ci 12917db96d56Sopenharmony_ci T = TypeVar('T') # Can be anything 12927db96d56Sopenharmony_ci S = TypeVar('S', bound=str) # Can be any subtype of str 12937db96d56Sopenharmony_ci A = TypeVar('A', str, bytes) # Must be exactly str or bytes 12947db96d56Sopenharmony_ci 12957db96d56Sopenharmony_ci Type variables exist primarily for the benefit of static type 12967db96d56Sopenharmony_ci checkers. They serve as the parameters for generic types as well 12977db96d56Sopenharmony_ci as for generic function and type alias definitions. 12987db96d56Sopenharmony_ci See :class:`Generic` for more 12997db96d56Sopenharmony_ci information on generic types. Generic functions work as follows:: 13007db96d56Sopenharmony_ci 13017db96d56Sopenharmony_ci def repeat(x: T, n: int) -> Sequence[T]: 13027db96d56Sopenharmony_ci """Return a list containing n references to x.""" 13037db96d56Sopenharmony_ci return [x]*n 13047db96d56Sopenharmony_ci 13057db96d56Sopenharmony_ci 13067db96d56Sopenharmony_ci def print_capitalized(x: S) -> S: 13077db96d56Sopenharmony_ci """Print x capitalized, and return x.""" 13087db96d56Sopenharmony_ci print(x.capitalize()) 13097db96d56Sopenharmony_ci return x 13107db96d56Sopenharmony_ci 13117db96d56Sopenharmony_ci 13127db96d56Sopenharmony_ci def concatenate(x: A, y: A) -> A: 13137db96d56Sopenharmony_ci """Add two strings or bytes objects together.""" 13147db96d56Sopenharmony_ci return x + y 13157db96d56Sopenharmony_ci 13167db96d56Sopenharmony_ci Note that type variables can be *bound*, *constrained*, or neither, but 13177db96d56Sopenharmony_ci cannot be both bound *and* constrained. 13187db96d56Sopenharmony_ci 13197db96d56Sopenharmony_ci Created type variables may be explicitly marked covariant or contravariant by passing 13207db96d56Sopenharmony_ci ``covariant=True`` or ``contravariant=True``. 13217db96d56Sopenharmony_ci By default, type variables are invariant. 13227db96d56Sopenharmony_ci See :pep:`484` and :pep:`695` for more details. 13237db96d56Sopenharmony_ci 13247db96d56Sopenharmony_ci Bound type variables and constrained type variables have different 13257db96d56Sopenharmony_ci semantics in several important ways. Using a *bound* type variable means 13267db96d56Sopenharmony_ci that the ``TypeVar`` will be solved using the most specific type possible:: 13277db96d56Sopenharmony_ci 13287db96d56Sopenharmony_ci x = print_capitalized('a string') 13297db96d56Sopenharmony_ci reveal_type(x) # revealed type is str 13307db96d56Sopenharmony_ci 13317db96d56Sopenharmony_ci class StringSubclass(str): 13327db96d56Sopenharmony_ci pass 13337db96d56Sopenharmony_ci 13347db96d56Sopenharmony_ci y = print_capitalized(StringSubclass('another string')) 13357db96d56Sopenharmony_ci reveal_type(y) # revealed type is StringSubclass 13367db96d56Sopenharmony_ci 13377db96d56Sopenharmony_ci z = print_capitalized(45) # error: int is not a subtype of str 13387db96d56Sopenharmony_ci 13397db96d56Sopenharmony_ci Type variables can be bound to concrete types, abstract types (ABCs or 13407db96d56Sopenharmony_ci protocols), and even unions of types:: 13417db96d56Sopenharmony_ci 13427db96d56Sopenharmony_ci U = TypeVar('U', bound=str|bytes) # Can be any subtype of the union str|bytes 13437db96d56Sopenharmony_ci V = TypeVar('V', bound=SupportsAbs) # Can be anything with an __abs__ method 13447db96d56Sopenharmony_ci 13457db96d56Sopenharmony_ci .. _typing-constrained-typevar: 13467db96d56Sopenharmony_ci 13477db96d56Sopenharmony_ci Using a *constrained* type variable, however, means that the ``TypeVar`` 13487db96d56Sopenharmony_ci can only ever be solved as being exactly one of the constraints given:: 13497db96d56Sopenharmony_ci 13507db96d56Sopenharmony_ci a = concatenate('one', 'two') 13517db96d56Sopenharmony_ci reveal_type(a) # revealed type is str 13527db96d56Sopenharmony_ci 13537db96d56Sopenharmony_ci b = concatenate(StringSubclass('one'), StringSubclass('two')) 13547db96d56Sopenharmony_ci reveal_type(b) # revealed type is str, despite StringSubclass being passed in 13557db96d56Sopenharmony_ci 13567db96d56Sopenharmony_ci c = concatenate('one', b'two') # error: type variable 'A' can be either str or bytes in a function call, but not both 13577db96d56Sopenharmony_ci 13587db96d56Sopenharmony_ci At runtime, ``isinstance(x, T)`` will raise :exc:`TypeError`. 13597db96d56Sopenharmony_ci 13607db96d56Sopenharmony_ci .. attribute:: __name__ 13617db96d56Sopenharmony_ci 13627db96d56Sopenharmony_ci The name of the type variable. 13637db96d56Sopenharmony_ci 13647db96d56Sopenharmony_ci .. attribute:: __covariant__ 13657db96d56Sopenharmony_ci 13667db96d56Sopenharmony_ci Whether the type var has been marked as covariant. 13677db96d56Sopenharmony_ci 13687db96d56Sopenharmony_ci .. attribute:: __contravariant__ 13697db96d56Sopenharmony_ci 13707db96d56Sopenharmony_ci Whether the type var has been marked as contravariant. 13717db96d56Sopenharmony_ci 13727db96d56Sopenharmony_ci .. attribute:: __bound__ 13737db96d56Sopenharmony_ci 13747db96d56Sopenharmony_ci The bound of the type variable, if any. 13757db96d56Sopenharmony_ci 13767db96d56Sopenharmony_ci .. attribute:: __constraints__ 13777db96d56Sopenharmony_ci 13787db96d56Sopenharmony_ci A tuple containing the constraints of the type variable, if any. 13797db96d56Sopenharmony_ci 13807db96d56Sopenharmony_ci.. class:: TypeVarTuple(name) 13817db96d56Sopenharmony_ci 13827db96d56Sopenharmony_ci Type variable tuple. A specialized form of :class:`type variable <TypeVar>` 13837db96d56Sopenharmony_ci that enables *variadic* generics. 13847db96d56Sopenharmony_ci 13857db96d56Sopenharmony_ci Usage:: 13867db96d56Sopenharmony_ci 13877db96d56Sopenharmony_ci T = TypeVar("T") 13887db96d56Sopenharmony_ci Ts = TypeVarTuple("Ts") 13897db96d56Sopenharmony_ci 13907db96d56Sopenharmony_ci def move_first_element_to_last(tup: tuple[T, *Ts]) -> tuple[*Ts, T]: 13917db96d56Sopenharmony_ci return (*tup[1:], tup[0]) 13927db96d56Sopenharmony_ci 13937db96d56Sopenharmony_ci A normal type variable enables parameterization with a single type. A type 13947db96d56Sopenharmony_ci variable tuple, in contrast, allows parameterization with an 13957db96d56Sopenharmony_ci *arbitrary* number of types by acting like an *arbitrary* number of type 13967db96d56Sopenharmony_ci variables wrapped in a tuple. For example:: 13977db96d56Sopenharmony_ci 13987db96d56Sopenharmony_ci # T is bound to int, Ts is bound to () 13997db96d56Sopenharmony_ci # Return value is (1,), which has type tuple[int] 14007db96d56Sopenharmony_ci move_first_element_to_last(tup=(1,)) 14017db96d56Sopenharmony_ci 14027db96d56Sopenharmony_ci # T is bound to int, Ts is bound to (str,) 14037db96d56Sopenharmony_ci # Return value is ('spam', 1), which has type tuple[str, int] 14047db96d56Sopenharmony_ci move_first_element_to_last(tup=(1, 'spam')) 14057db96d56Sopenharmony_ci 14067db96d56Sopenharmony_ci # T is bound to int, Ts is bound to (str, float) 14077db96d56Sopenharmony_ci # Return value is ('spam', 3.0, 1), which has type tuple[str, float, int] 14087db96d56Sopenharmony_ci move_first_element_to_last(tup=(1, 'spam', 3.0)) 14097db96d56Sopenharmony_ci 14107db96d56Sopenharmony_ci # This fails to type check (and fails at runtime) 14117db96d56Sopenharmony_ci # because tuple[()] is not compatible with tuple[T, *Ts] 14127db96d56Sopenharmony_ci # (at least one element is required) 14137db96d56Sopenharmony_ci move_first_element_to_last(tup=()) 14147db96d56Sopenharmony_ci 14157db96d56Sopenharmony_ci Note the use of the unpacking operator ``*`` in ``tuple[T, *Ts]``. 14167db96d56Sopenharmony_ci Conceptually, you can think of ``Ts`` as a tuple of type variables 14177db96d56Sopenharmony_ci ``(T1, T2, ...)``. ``tuple[T, *Ts]`` would then become 14187db96d56Sopenharmony_ci ``tuple[T, *(T1, T2, ...)]``, which is equivalent to 14197db96d56Sopenharmony_ci ``tuple[T, T1, T2, ...]``. (Note that in older versions of Python, you might 14207db96d56Sopenharmony_ci see this written using :data:`Unpack <Unpack>` instead, as 14217db96d56Sopenharmony_ci ``Unpack[Ts]``.) 14227db96d56Sopenharmony_ci 14237db96d56Sopenharmony_ci Type variable tuples must *always* be unpacked. This helps distinguish type 14247db96d56Sopenharmony_ci variable tuples from normal type variables:: 14257db96d56Sopenharmony_ci 14267db96d56Sopenharmony_ci x: Ts # Not valid 14277db96d56Sopenharmony_ci x: tuple[Ts] # Not valid 14287db96d56Sopenharmony_ci x: tuple[*Ts] # The correct way to do it 14297db96d56Sopenharmony_ci 14307db96d56Sopenharmony_ci Type variable tuples can be used in the same contexts as normal type 14317db96d56Sopenharmony_ci variables. For example, in class definitions, arguments, and return types:: 14327db96d56Sopenharmony_ci 14337db96d56Sopenharmony_ci Shape = TypeVarTuple("Shape") 14347db96d56Sopenharmony_ci class Array(Generic[*Shape]): 14357db96d56Sopenharmony_ci def __getitem__(self, key: tuple[*Shape]) -> float: ... 14367db96d56Sopenharmony_ci def __abs__(self) -> "Array[*Shape]": ... 14377db96d56Sopenharmony_ci def get_shape(self) -> tuple[*Shape]: ... 14387db96d56Sopenharmony_ci 14397db96d56Sopenharmony_ci Type variable tuples can be happily combined with normal type variables:: 14407db96d56Sopenharmony_ci 14417db96d56Sopenharmony_ci DType = TypeVar('DType') 14427db96d56Sopenharmony_ci 14437db96d56Sopenharmony_ci class Array(Generic[DType, *Shape]): # This is fine 14447db96d56Sopenharmony_ci pass 14457db96d56Sopenharmony_ci 14467db96d56Sopenharmony_ci class Array2(Generic[*Shape, DType]): # This would also be fine 14477db96d56Sopenharmony_ci pass 14487db96d56Sopenharmony_ci 14497db96d56Sopenharmony_ci float_array_1d: Array[float, Height] = Array() # Totally fine 14507db96d56Sopenharmony_ci int_array_2d: Array[int, Height, Width] = Array() # Yup, fine too 14517db96d56Sopenharmony_ci 14527db96d56Sopenharmony_ci However, note that at most one type variable tuple may appear in a single 14537db96d56Sopenharmony_ci list of type arguments or type parameters:: 14547db96d56Sopenharmony_ci 14557db96d56Sopenharmony_ci x: tuple[*Ts, *Ts] # Not valid 14567db96d56Sopenharmony_ci class Array(Generic[*Shape, *Shape]): # Not valid 14577db96d56Sopenharmony_ci pass 14587db96d56Sopenharmony_ci 14597db96d56Sopenharmony_ci Finally, an unpacked type variable tuple can be used as the type annotation 14607db96d56Sopenharmony_ci of ``*args``:: 14617db96d56Sopenharmony_ci 14627db96d56Sopenharmony_ci def call_soon( 14637db96d56Sopenharmony_ci callback: Callable[[*Ts], None], 14647db96d56Sopenharmony_ci *args: *Ts 14657db96d56Sopenharmony_ci ) -> None: 14667db96d56Sopenharmony_ci ... 14677db96d56Sopenharmony_ci callback(*args) 14687db96d56Sopenharmony_ci 14697db96d56Sopenharmony_ci In contrast to non-unpacked annotations of ``*args`` - e.g. ``*args: int``, 14707db96d56Sopenharmony_ci which would specify that *all* arguments are ``int`` - ``*args: *Ts`` 14717db96d56Sopenharmony_ci enables reference to the types of the *individual* arguments in ``*args``. 14727db96d56Sopenharmony_ci Here, this allows us to ensure the types of the ``*args`` passed 14737db96d56Sopenharmony_ci to ``call_soon`` match the types of the (positional) arguments of 14747db96d56Sopenharmony_ci ``callback``. 14757db96d56Sopenharmony_ci 14767db96d56Sopenharmony_ci See :pep:`646` for more details on type variable tuples. 14777db96d56Sopenharmony_ci 14787db96d56Sopenharmony_ci .. attribute:: __name__ 14797db96d56Sopenharmony_ci 14807db96d56Sopenharmony_ci The name of the type variable tuple. 14817db96d56Sopenharmony_ci 14827db96d56Sopenharmony_ci .. versionadded:: 3.11 14837db96d56Sopenharmony_ci 14847db96d56Sopenharmony_ci.. class:: ParamSpec(name, *, bound=None, covariant=False, contravariant=False) 14857db96d56Sopenharmony_ci 14867db96d56Sopenharmony_ci Parameter specification variable. A specialized version of 14877db96d56Sopenharmony_ci :class:`type variables <TypeVar>`. 14887db96d56Sopenharmony_ci 14897db96d56Sopenharmony_ci Usage:: 14907db96d56Sopenharmony_ci 14917db96d56Sopenharmony_ci P = ParamSpec('P') 14927db96d56Sopenharmony_ci 14937db96d56Sopenharmony_ci Parameter specification variables exist primarily for the benefit of static 14947db96d56Sopenharmony_ci type checkers. They are used to forward the parameter types of one 14957db96d56Sopenharmony_ci callable to another callable -- a pattern commonly found in higher order 14967db96d56Sopenharmony_ci functions and decorators. They are only valid when used in ``Concatenate``, 14977db96d56Sopenharmony_ci or as the first argument to ``Callable``, or as parameters for user-defined 14987db96d56Sopenharmony_ci Generics. See :class:`Generic` for more information on generic types. 14997db96d56Sopenharmony_ci 15007db96d56Sopenharmony_ci For example, to add basic logging to a function, one can create a decorator 15017db96d56Sopenharmony_ci ``add_logging`` to log function calls. The parameter specification variable 15027db96d56Sopenharmony_ci tells the type checker that the callable passed into the decorator and the 15037db96d56Sopenharmony_ci new callable returned by it have inter-dependent type parameters:: 15047db96d56Sopenharmony_ci 15057db96d56Sopenharmony_ci from collections.abc import Callable 15067db96d56Sopenharmony_ci from typing import TypeVar, ParamSpec 15077db96d56Sopenharmony_ci import logging 15087db96d56Sopenharmony_ci 15097db96d56Sopenharmony_ci T = TypeVar('T') 15107db96d56Sopenharmony_ci P = ParamSpec('P') 15117db96d56Sopenharmony_ci 15127db96d56Sopenharmony_ci def add_logging(f: Callable[P, T]) -> Callable[P, T]: 15137db96d56Sopenharmony_ci '''A type-safe decorator to add logging to a function.''' 15147db96d56Sopenharmony_ci def inner(*args: P.args, **kwargs: P.kwargs) -> T: 15157db96d56Sopenharmony_ci logging.info(f'{f.__name__} was called') 15167db96d56Sopenharmony_ci return f(*args, **kwargs) 15177db96d56Sopenharmony_ci return inner 15187db96d56Sopenharmony_ci 15197db96d56Sopenharmony_ci @add_logging 15207db96d56Sopenharmony_ci def add_two(x: float, y: float) -> float: 15217db96d56Sopenharmony_ci '''Add two numbers together.''' 15227db96d56Sopenharmony_ci return x + y 15237db96d56Sopenharmony_ci 15247db96d56Sopenharmony_ci Without ``ParamSpec``, the simplest way to annotate this previously was to 15257db96d56Sopenharmony_ci use a :class:`TypeVar` with bound ``Callable[..., Any]``. However this 15267db96d56Sopenharmony_ci causes two problems: 15277db96d56Sopenharmony_ci 15287db96d56Sopenharmony_ci 1. The type checker can't type check the ``inner`` function because 15297db96d56Sopenharmony_ci ``*args`` and ``**kwargs`` have to be typed :data:`Any`. 15307db96d56Sopenharmony_ci 2. :func:`~cast` may be required in the body of the ``add_logging`` 15317db96d56Sopenharmony_ci decorator when returning the ``inner`` function, or the static type 15327db96d56Sopenharmony_ci checker must be told to ignore the ``return inner``. 15337db96d56Sopenharmony_ci 15347db96d56Sopenharmony_ci .. attribute:: args 15357db96d56Sopenharmony_ci .. attribute:: kwargs 15367db96d56Sopenharmony_ci 15377db96d56Sopenharmony_ci Since ``ParamSpec`` captures both positional and keyword parameters, 15387db96d56Sopenharmony_ci ``P.args`` and ``P.kwargs`` can be used to split a ``ParamSpec`` into its 15397db96d56Sopenharmony_ci components. ``P.args`` represents the tuple of positional parameters in a 15407db96d56Sopenharmony_ci given call and should only be used to annotate ``*args``. ``P.kwargs`` 15417db96d56Sopenharmony_ci represents the mapping of keyword parameters to their values in a given call, 15427db96d56Sopenharmony_ci and should be only be used to annotate ``**kwargs``. Both 15437db96d56Sopenharmony_ci attributes require the annotated parameter to be in scope. At runtime, 15447db96d56Sopenharmony_ci ``P.args`` and ``P.kwargs`` are instances respectively of 15457db96d56Sopenharmony_ci :class:`ParamSpecArgs` and :class:`ParamSpecKwargs`. 15467db96d56Sopenharmony_ci 15477db96d56Sopenharmony_ci .. attribute:: __name__ 15487db96d56Sopenharmony_ci 15497db96d56Sopenharmony_ci The name of the parameter specification. 15507db96d56Sopenharmony_ci 15517db96d56Sopenharmony_ci Parameter specification variables created with ``covariant=True`` or 15527db96d56Sopenharmony_ci ``contravariant=True`` can be used to declare covariant or contravariant 15537db96d56Sopenharmony_ci generic types. The ``bound`` argument is also accepted, similar to 15547db96d56Sopenharmony_ci :class:`TypeVar`. However the actual semantics of these keywords are yet to 15557db96d56Sopenharmony_ci be decided. 15567db96d56Sopenharmony_ci 15577db96d56Sopenharmony_ci .. versionadded:: 3.10 15587db96d56Sopenharmony_ci 15597db96d56Sopenharmony_ci .. note:: 15607db96d56Sopenharmony_ci Only parameter specification variables defined in global scope can 15617db96d56Sopenharmony_ci be pickled. 15627db96d56Sopenharmony_ci 15637db96d56Sopenharmony_ci .. seealso:: 15647db96d56Sopenharmony_ci * :pep:`612` -- Parameter Specification Variables (the PEP which introduced 15657db96d56Sopenharmony_ci ``ParamSpec`` and ``Concatenate``). 15667db96d56Sopenharmony_ci * :class:`Callable` and :class:`Concatenate`. 15677db96d56Sopenharmony_ci 15687db96d56Sopenharmony_ci.. data:: ParamSpecArgs 15697db96d56Sopenharmony_ci.. data:: ParamSpecKwargs 15707db96d56Sopenharmony_ci 15717db96d56Sopenharmony_ci Arguments and keyword arguments attributes of a :class:`ParamSpec`. The 15727db96d56Sopenharmony_ci ``P.args`` attribute of a ``ParamSpec`` is an instance of ``ParamSpecArgs``, 15737db96d56Sopenharmony_ci and ``P.kwargs`` is an instance of ``ParamSpecKwargs``. They are intended 15747db96d56Sopenharmony_ci for runtime introspection and have no special meaning to static type checkers. 15757db96d56Sopenharmony_ci 15767db96d56Sopenharmony_ci Calling :func:`get_origin` on either of these objects will return the 15777db96d56Sopenharmony_ci original ``ParamSpec``:: 15787db96d56Sopenharmony_ci 15797db96d56Sopenharmony_ci P = ParamSpec("P") 15807db96d56Sopenharmony_ci get_origin(P.args) # returns P 15817db96d56Sopenharmony_ci get_origin(P.kwargs) # returns P 15827db96d56Sopenharmony_ci 15837db96d56Sopenharmony_ci .. versionadded:: 3.10 15847db96d56Sopenharmony_ci 15857db96d56Sopenharmony_ci 15867db96d56Sopenharmony_ciOther special directives 15877db96d56Sopenharmony_ci"""""""""""""""""""""""" 15887db96d56Sopenharmony_ci 15897db96d56Sopenharmony_ciThese are not used in annotations. They are building blocks for declaring types. 15907db96d56Sopenharmony_ci 15917db96d56Sopenharmony_ci.. class:: NamedTuple 15927db96d56Sopenharmony_ci 15937db96d56Sopenharmony_ci Typed version of :func:`collections.namedtuple`. 15947db96d56Sopenharmony_ci 15957db96d56Sopenharmony_ci Usage:: 15967db96d56Sopenharmony_ci 15977db96d56Sopenharmony_ci class Employee(NamedTuple): 15987db96d56Sopenharmony_ci name: str 15997db96d56Sopenharmony_ci id: int 16007db96d56Sopenharmony_ci 16017db96d56Sopenharmony_ci This is equivalent to:: 16027db96d56Sopenharmony_ci 16037db96d56Sopenharmony_ci Employee = collections.namedtuple('Employee', ['name', 'id']) 16047db96d56Sopenharmony_ci 16057db96d56Sopenharmony_ci To give a field a default value, you can assign to it in the class body:: 16067db96d56Sopenharmony_ci 16077db96d56Sopenharmony_ci class Employee(NamedTuple): 16087db96d56Sopenharmony_ci name: str 16097db96d56Sopenharmony_ci id: int = 3 16107db96d56Sopenharmony_ci 16117db96d56Sopenharmony_ci employee = Employee('Guido') 16127db96d56Sopenharmony_ci assert employee.id == 3 16137db96d56Sopenharmony_ci 16147db96d56Sopenharmony_ci Fields with a default value must come after any fields without a default. 16157db96d56Sopenharmony_ci 16167db96d56Sopenharmony_ci The resulting class has an extra attribute ``__annotations__`` giving a 16177db96d56Sopenharmony_ci dict that maps the field names to the field types. (The field names are in 16187db96d56Sopenharmony_ci the ``_fields`` attribute and the default values are in the 16197db96d56Sopenharmony_ci ``_field_defaults`` attribute, both of which are part of the :func:`~collections.namedtuple` 16207db96d56Sopenharmony_ci API.) 16217db96d56Sopenharmony_ci 16227db96d56Sopenharmony_ci ``NamedTuple`` subclasses can also have docstrings and methods:: 16237db96d56Sopenharmony_ci 16247db96d56Sopenharmony_ci class Employee(NamedTuple): 16257db96d56Sopenharmony_ci """Represents an employee.""" 16267db96d56Sopenharmony_ci name: str 16277db96d56Sopenharmony_ci id: int = 3 16287db96d56Sopenharmony_ci 16297db96d56Sopenharmony_ci def __repr__(self) -> str: 16307db96d56Sopenharmony_ci return f'<Employee {self.name}, id={self.id}>' 16317db96d56Sopenharmony_ci 16327db96d56Sopenharmony_ci ``NamedTuple`` subclasses can be generic:: 16337db96d56Sopenharmony_ci 16347db96d56Sopenharmony_ci class Group(NamedTuple, Generic[T]): 16357db96d56Sopenharmony_ci key: T 16367db96d56Sopenharmony_ci group: list[T] 16377db96d56Sopenharmony_ci 16387db96d56Sopenharmony_ci Backward-compatible usage:: 16397db96d56Sopenharmony_ci 16407db96d56Sopenharmony_ci Employee = NamedTuple('Employee', [('name', str), ('id', int)]) 16417db96d56Sopenharmony_ci 16427db96d56Sopenharmony_ci .. versionchanged:: 3.6 16437db96d56Sopenharmony_ci Added support for :pep:`526` variable annotation syntax. 16447db96d56Sopenharmony_ci 16457db96d56Sopenharmony_ci .. versionchanged:: 3.6.1 16467db96d56Sopenharmony_ci Added support for default values, methods, and docstrings. 16477db96d56Sopenharmony_ci 16487db96d56Sopenharmony_ci .. versionchanged:: 3.8 16497db96d56Sopenharmony_ci The ``_field_types`` and ``__annotations__`` attributes are 16507db96d56Sopenharmony_ci now regular dictionaries instead of instances of ``OrderedDict``. 16517db96d56Sopenharmony_ci 16527db96d56Sopenharmony_ci .. versionchanged:: 3.9 16537db96d56Sopenharmony_ci Removed the ``_field_types`` attribute in favor of the more 16547db96d56Sopenharmony_ci standard ``__annotations__`` attribute which has the same information. 16557db96d56Sopenharmony_ci 16567db96d56Sopenharmony_ci .. versionchanged:: 3.11 16577db96d56Sopenharmony_ci Added support for generic namedtuples. 16587db96d56Sopenharmony_ci 16597db96d56Sopenharmony_ci.. class:: NewType(name, tp) 16607db96d56Sopenharmony_ci 16617db96d56Sopenharmony_ci A helper class to indicate a distinct type to a typechecker, 16627db96d56Sopenharmony_ci see :ref:`distinct`. At runtime it returns an object that returns 16637db96d56Sopenharmony_ci its argument when called. 16647db96d56Sopenharmony_ci Usage:: 16657db96d56Sopenharmony_ci 16667db96d56Sopenharmony_ci UserId = NewType('UserId', int) 16677db96d56Sopenharmony_ci first_user = UserId(1) 16687db96d56Sopenharmony_ci 16697db96d56Sopenharmony_ci .. attribute:: __module__ 16707db96d56Sopenharmony_ci 16717db96d56Sopenharmony_ci The module in which the new type is defined. 16727db96d56Sopenharmony_ci 16737db96d56Sopenharmony_ci .. attribute:: __name__ 16747db96d56Sopenharmony_ci 16757db96d56Sopenharmony_ci The name of the new type. 16767db96d56Sopenharmony_ci 16777db96d56Sopenharmony_ci .. attribute:: __supertype__ 16787db96d56Sopenharmony_ci 16797db96d56Sopenharmony_ci The type that the new type is based on. 16807db96d56Sopenharmony_ci 16817db96d56Sopenharmony_ci .. versionadded:: 3.5.2 16827db96d56Sopenharmony_ci 16837db96d56Sopenharmony_ci .. versionchanged:: 3.10 16847db96d56Sopenharmony_ci ``NewType`` is now a class rather than a function. 16857db96d56Sopenharmony_ci 16867db96d56Sopenharmony_ci.. class:: Protocol(Generic) 16877db96d56Sopenharmony_ci 16887db96d56Sopenharmony_ci Base class for protocol classes. Protocol classes are defined like this:: 16897db96d56Sopenharmony_ci 16907db96d56Sopenharmony_ci class Proto(Protocol): 16917db96d56Sopenharmony_ci def meth(self) -> int: 16927db96d56Sopenharmony_ci ... 16937db96d56Sopenharmony_ci 16947db96d56Sopenharmony_ci Such classes are primarily used with static type checkers that recognize 16957db96d56Sopenharmony_ci structural subtyping (static duck-typing), for example:: 16967db96d56Sopenharmony_ci 16977db96d56Sopenharmony_ci class C: 16987db96d56Sopenharmony_ci def meth(self) -> int: 16997db96d56Sopenharmony_ci return 0 17007db96d56Sopenharmony_ci 17017db96d56Sopenharmony_ci def func(x: Proto) -> int: 17027db96d56Sopenharmony_ci return x.meth() 17037db96d56Sopenharmony_ci 17047db96d56Sopenharmony_ci func(C()) # Passes static type check 17057db96d56Sopenharmony_ci 17067db96d56Sopenharmony_ci See :pep:`544` for more details. Protocol classes decorated with 17077db96d56Sopenharmony_ci :func:`runtime_checkable` (described later) act as simple-minded runtime 17087db96d56Sopenharmony_ci protocols that check only the presence of given attributes, ignoring their 17097db96d56Sopenharmony_ci type signatures. 17107db96d56Sopenharmony_ci 17117db96d56Sopenharmony_ci Protocol classes can be generic, for example:: 17127db96d56Sopenharmony_ci 17137db96d56Sopenharmony_ci T = TypeVar("T") 17147db96d56Sopenharmony_ci 17157db96d56Sopenharmony_ci class GenProto(Protocol[T]): 17167db96d56Sopenharmony_ci def meth(self) -> T: 17177db96d56Sopenharmony_ci ... 17187db96d56Sopenharmony_ci 17197db96d56Sopenharmony_ci .. versionadded:: 3.8 17207db96d56Sopenharmony_ci 17217db96d56Sopenharmony_ci.. decorator:: runtime_checkable 17227db96d56Sopenharmony_ci 17237db96d56Sopenharmony_ci Mark a protocol class as a runtime protocol. 17247db96d56Sopenharmony_ci 17257db96d56Sopenharmony_ci Such a protocol can be used with :func:`isinstance` and :func:`issubclass`. 17267db96d56Sopenharmony_ci This raises :exc:`TypeError` when applied to a non-protocol class. This 17277db96d56Sopenharmony_ci allows a simple-minded structural check, very similar to "one trick ponies" 17287db96d56Sopenharmony_ci in :mod:`collections.abc` such as :class:`~collections.abc.Iterable`. For example:: 17297db96d56Sopenharmony_ci 17307db96d56Sopenharmony_ci @runtime_checkable 17317db96d56Sopenharmony_ci class Closable(Protocol): 17327db96d56Sopenharmony_ci def close(self): ... 17337db96d56Sopenharmony_ci 17347db96d56Sopenharmony_ci assert isinstance(open('/some/file'), Closable) 17357db96d56Sopenharmony_ci 17367db96d56Sopenharmony_ci @runtime_checkable 17377db96d56Sopenharmony_ci class Named(Protocol): 17387db96d56Sopenharmony_ci name: str 17397db96d56Sopenharmony_ci 17407db96d56Sopenharmony_ci import threading 17417db96d56Sopenharmony_ci assert isinstance(threading.Thread(name='Bob'), Named) 17427db96d56Sopenharmony_ci 17437db96d56Sopenharmony_ci .. note:: 17447db96d56Sopenharmony_ci 17457db96d56Sopenharmony_ci :func:`!runtime_checkable` will check only the presence of the required 17467db96d56Sopenharmony_ci methods or attributes, not their type signatures or types. 17477db96d56Sopenharmony_ci For example, :class:`ssl.SSLObject` 17487db96d56Sopenharmony_ci is a class, therefore it passes an :func:`issubclass` 17497db96d56Sopenharmony_ci check against :data:`Callable`. However, the 17507db96d56Sopenharmony_ci ``ssl.SSLObject.__init__`` method exists only to raise a 17517db96d56Sopenharmony_ci :exc:`TypeError` with a more informative message, therefore making 17527db96d56Sopenharmony_ci it impossible to call (instantiate) :class:`ssl.SSLObject`. 17537db96d56Sopenharmony_ci 17547db96d56Sopenharmony_ci .. note:: 17557db96d56Sopenharmony_ci 17567db96d56Sopenharmony_ci An :func:`isinstance` check against a runtime-checkable protocol can be 17577db96d56Sopenharmony_ci surprisingly slow compared to an ``isinstance()`` check against 17587db96d56Sopenharmony_ci a non-protocol class. Consider using alternative idioms such as 17597db96d56Sopenharmony_ci :func:`hasattr` calls for structural checks in performance-sensitive 17607db96d56Sopenharmony_ci code. 17617db96d56Sopenharmony_ci 17627db96d56Sopenharmony_ci .. versionadded:: 3.8 17637db96d56Sopenharmony_ci 17647db96d56Sopenharmony_ci 17657db96d56Sopenharmony_ci.. class:: TypedDict(dict) 17667db96d56Sopenharmony_ci 17677db96d56Sopenharmony_ci Special construct to add type hints to a dictionary. 17687db96d56Sopenharmony_ci At runtime it is a plain :class:`dict`. 17697db96d56Sopenharmony_ci 17707db96d56Sopenharmony_ci ``TypedDict`` declares a dictionary type that expects all of its 17717db96d56Sopenharmony_ci instances to have a certain set of keys, where each key is 17727db96d56Sopenharmony_ci associated with a value of a consistent type. This expectation 17737db96d56Sopenharmony_ci is not checked at runtime but is only enforced by type checkers. 17747db96d56Sopenharmony_ci Usage:: 17757db96d56Sopenharmony_ci 17767db96d56Sopenharmony_ci class Point2D(TypedDict): 17777db96d56Sopenharmony_ci x: int 17787db96d56Sopenharmony_ci y: int 17797db96d56Sopenharmony_ci label: str 17807db96d56Sopenharmony_ci 17817db96d56Sopenharmony_ci a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK 17827db96d56Sopenharmony_ci b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check 17837db96d56Sopenharmony_ci 17847db96d56Sopenharmony_ci assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') 17857db96d56Sopenharmony_ci 17867db96d56Sopenharmony_ci To allow using this feature with older versions of Python that do not 17877db96d56Sopenharmony_ci support :pep:`526`, ``TypedDict`` supports two additional equivalent 17887db96d56Sopenharmony_ci syntactic forms: 17897db96d56Sopenharmony_ci 17907db96d56Sopenharmony_ci * Using a literal :class:`dict` as the second argument:: 17917db96d56Sopenharmony_ci 17927db96d56Sopenharmony_ci Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) 17937db96d56Sopenharmony_ci 17947db96d56Sopenharmony_ci * Using keyword arguments:: 17957db96d56Sopenharmony_ci 17967db96d56Sopenharmony_ci Point2D = TypedDict('Point2D', x=int, y=int, label=str) 17977db96d56Sopenharmony_ci 17987db96d56Sopenharmony_ci .. deprecated-removed:: 3.11 3.13 17997db96d56Sopenharmony_ci The keyword-argument syntax is deprecated in 3.11 and will be removed 18007db96d56Sopenharmony_ci in 3.13. It may also be unsupported by static type checkers. 18017db96d56Sopenharmony_ci 18027db96d56Sopenharmony_ci The functional syntax should also be used when any of the keys are not valid 18037db96d56Sopenharmony_ci :ref:`identifiers <identifiers>`, for example because they are keywords or contain hyphens. 18047db96d56Sopenharmony_ci Example:: 18057db96d56Sopenharmony_ci 18067db96d56Sopenharmony_ci # raises SyntaxError 18077db96d56Sopenharmony_ci class Point2D(TypedDict): 18087db96d56Sopenharmony_ci in: int # 'in' is a keyword 18097db96d56Sopenharmony_ci x-y: int # name with hyphens 18107db96d56Sopenharmony_ci 18117db96d56Sopenharmony_ci # OK, functional syntax 18127db96d56Sopenharmony_ci Point2D = TypedDict('Point2D', {'in': int, 'x-y': int}) 18137db96d56Sopenharmony_ci 18147db96d56Sopenharmony_ci By default, all keys must be present in a ``TypedDict``. It is possible to 18157db96d56Sopenharmony_ci mark individual keys as non-required using :data:`NotRequired`:: 18167db96d56Sopenharmony_ci 18177db96d56Sopenharmony_ci class Point2D(TypedDict): 18187db96d56Sopenharmony_ci x: int 18197db96d56Sopenharmony_ci y: int 18207db96d56Sopenharmony_ci label: NotRequired[str] 18217db96d56Sopenharmony_ci 18227db96d56Sopenharmony_ci # Alternative syntax 18237db96d56Sopenharmony_ci Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': NotRequired[str]}) 18247db96d56Sopenharmony_ci 18257db96d56Sopenharmony_ci This means that a ``Point2D`` ``TypedDict`` can have the ``label`` 18267db96d56Sopenharmony_ci key omitted. 18277db96d56Sopenharmony_ci 18287db96d56Sopenharmony_ci It is also possible to mark all keys as non-required by default 18297db96d56Sopenharmony_ci by specifying a totality of ``False``:: 18307db96d56Sopenharmony_ci 18317db96d56Sopenharmony_ci class Point2D(TypedDict, total=False): 18327db96d56Sopenharmony_ci x: int 18337db96d56Sopenharmony_ci y: int 18347db96d56Sopenharmony_ci 18357db96d56Sopenharmony_ci # Alternative syntax 18367db96d56Sopenharmony_ci Point2D = TypedDict('Point2D', {'x': int, 'y': int}, total=False) 18377db96d56Sopenharmony_ci 18387db96d56Sopenharmony_ci This means that a ``Point2D`` ``TypedDict`` can have any of the keys 18397db96d56Sopenharmony_ci omitted. A type checker is only expected to support a literal ``False`` or 18407db96d56Sopenharmony_ci ``True`` as the value of the ``total`` argument. ``True`` is the default, 18417db96d56Sopenharmony_ci and makes all items defined in the class body required. 18427db96d56Sopenharmony_ci 18437db96d56Sopenharmony_ci Individual keys of a ``total=False`` ``TypedDict`` can be marked as 18447db96d56Sopenharmony_ci required using :data:`Required`:: 18457db96d56Sopenharmony_ci 18467db96d56Sopenharmony_ci class Point2D(TypedDict, total=False): 18477db96d56Sopenharmony_ci x: Required[int] 18487db96d56Sopenharmony_ci y: Required[int] 18497db96d56Sopenharmony_ci label: str 18507db96d56Sopenharmony_ci 18517db96d56Sopenharmony_ci # Alternative syntax 18527db96d56Sopenharmony_ci Point2D = TypedDict('Point2D', { 18537db96d56Sopenharmony_ci 'x': Required[int], 18547db96d56Sopenharmony_ci 'y': Required[int], 18557db96d56Sopenharmony_ci 'label': str 18567db96d56Sopenharmony_ci }, total=False) 18577db96d56Sopenharmony_ci 18587db96d56Sopenharmony_ci It is possible for a ``TypedDict`` type to inherit from one or more other ``TypedDict`` types 18597db96d56Sopenharmony_ci using the class-based syntax. 18607db96d56Sopenharmony_ci Usage:: 18617db96d56Sopenharmony_ci 18627db96d56Sopenharmony_ci class Point3D(Point2D): 18637db96d56Sopenharmony_ci z: int 18647db96d56Sopenharmony_ci 18657db96d56Sopenharmony_ci ``Point3D`` has three items: ``x``, ``y`` and ``z``. It is equivalent to this 18667db96d56Sopenharmony_ci definition:: 18677db96d56Sopenharmony_ci 18687db96d56Sopenharmony_ci class Point3D(TypedDict): 18697db96d56Sopenharmony_ci x: int 18707db96d56Sopenharmony_ci y: int 18717db96d56Sopenharmony_ci z: int 18727db96d56Sopenharmony_ci 18737db96d56Sopenharmony_ci A ``TypedDict`` cannot inherit from a non-\ ``TypedDict`` class, 18747db96d56Sopenharmony_ci except for :class:`Generic`. For example:: 18757db96d56Sopenharmony_ci 18767db96d56Sopenharmony_ci class X(TypedDict): 18777db96d56Sopenharmony_ci x: int 18787db96d56Sopenharmony_ci 18797db96d56Sopenharmony_ci class Y(TypedDict): 18807db96d56Sopenharmony_ci y: int 18817db96d56Sopenharmony_ci 18827db96d56Sopenharmony_ci class Z(object): pass # A non-TypedDict class 18837db96d56Sopenharmony_ci 18847db96d56Sopenharmony_ci class XY(X, Y): pass # OK 18857db96d56Sopenharmony_ci 18867db96d56Sopenharmony_ci class XZ(X, Z): pass # raises TypeError 18877db96d56Sopenharmony_ci 18887db96d56Sopenharmony_ci T = TypeVar('T') 18897db96d56Sopenharmony_ci class XT(X, Generic[T]): pass # raises TypeError 18907db96d56Sopenharmony_ci 18917db96d56Sopenharmony_ci A ``TypedDict`` can be generic:: 18927db96d56Sopenharmony_ci 18937db96d56Sopenharmony_ci class Group(TypedDict, Generic[T]): 18947db96d56Sopenharmony_ci key: T 18957db96d56Sopenharmony_ci group: list[T] 18967db96d56Sopenharmony_ci 18977db96d56Sopenharmony_ci A ``TypedDict`` can be introspected via annotations dicts 18987db96d56Sopenharmony_ci (see :ref:`annotations-howto` for more information on annotations best practices), 18997db96d56Sopenharmony_ci :attr:`__total__`, :attr:`__required_keys__`, and :attr:`__optional_keys__`. 19007db96d56Sopenharmony_ci 19017db96d56Sopenharmony_ci .. attribute:: __total__ 19027db96d56Sopenharmony_ci 19037db96d56Sopenharmony_ci ``Point2D.__total__`` gives the value of the ``total`` argument. 19047db96d56Sopenharmony_ci Example:: 19057db96d56Sopenharmony_ci 19067db96d56Sopenharmony_ci >>> from typing import TypedDict 19077db96d56Sopenharmony_ci >>> class Point2D(TypedDict): pass 19087db96d56Sopenharmony_ci >>> Point2D.__total__ 19097db96d56Sopenharmony_ci True 19107db96d56Sopenharmony_ci >>> class Point2D(TypedDict, total=False): pass 19117db96d56Sopenharmony_ci >>> Point2D.__total__ 19127db96d56Sopenharmony_ci False 19137db96d56Sopenharmony_ci >>> class Point3D(Point2D): pass 19147db96d56Sopenharmony_ci >>> Point3D.__total__ 19157db96d56Sopenharmony_ci True 19167db96d56Sopenharmony_ci 19177db96d56Sopenharmony_ci .. attribute:: __required_keys__ 19187db96d56Sopenharmony_ci 19197db96d56Sopenharmony_ci .. versionadded:: 3.9 19207db96d56Sopenharmony_ci 19217db96d56Sopenharmony_ci .. attribute:: __optional_keys__ 19227db96d56Sopenharmony_ci 19237db96d56Sopenharmony_ci ``Point2D.__required_keys__`` and ``Point2D.__optional_keys__`` return 19247db96d56Sopenharmony_ci :class:`frozenset` objects containing required and non-required keys, respectively. 19257db96d56Sopenharmony_ci 19267db96d56Sopenharmony_ci Keys marked with :data:`Required` will always appear in ``__required_keys__`` 19277db96d56Sopenharmony_ci and keys marked with :data:`NotRequired` will always appear in ``__optional_keys__``. 19287db96d56Sopenharmony_ci 19297db96d56Sopenharmony_ci For backwards compatibility with Python 3.10 and below, 19307db96d56Sopenharmony_ci it is also possible to use inheritance to declare both required and 19317db96d56Sopenharmony_ci non-required keys in the same ``TypedDict`` . This is done by declaring a 19327db96d56Sopenharmony_ci ``TypedDict`` with one value for the ``total`` argument and then 19337db96d56Sopenharmony_ci inheriting from it in another ``TypedDict`` with a different value for 19347db96d56Sopenharmony_ci ``total``:: 19357db96d56Sopenharmony_ci 19367db96d56Sopenharmony_ci >>> class Point2D(TypedDict, total=False): 19377db96d56Sopenharmony_ci ... x: int 19387db96d56Sopenharmony_ci ... y: int 19397db96d56Sopenharmony_ci ... 19407db96d56Sopenharmony_ci >>> class Point3D(Point2D): 19417db96d56Sopenharmony_ci ... z: int 19427db96d56Sopenharmony_ci ... 19437db96d56Sopenharmony_ci >>> Point3D.__required_keys__ == frozenset({'z'}) 19447db96d56Sopenharmony_ci True 19457db96d56Sopenharmony_ci >>> Point3D.__optional_keys__ == frozenset({'x', 'y'}) 19467db96d56Sopenharmony_ci True 19477db96d56Sopenharmony_ci 19487db96d56Sopenharmony_ci .. versionadded:: 3.9 19497db96d56Sopenharmony_ci 19507db96d56Sopenharmony_ci See :pep:`589` for more examples and detailed rules of using ``TypedDict``. 19517db96d56Sopenharmony_ci 19527db96d56Sopenharmony_ci .. versionadded:: 3.8 19537db96d56Sopenharmony_ci 19547db96d56Sopenharmony_ci .. versionchanged:: 3.11 19557db96d56Sopenharmony_ci Added support for marking individual keys as :data:`Required` or :data:`NotRequired`. 19567db96d56Sopenharmony_ci See :pep:`655`. 19577db96d56Sopenharmony_ci 19587db96d56Sopenharmony_ci .. versionchanged:: 3.11 19597db96d56Sopenharmony_ci Added support for generic ``TypedDict``\ s. 19607db96d56Sopenharmony_ci 19617db96d56Sopenharmony_ciGeneric concrete collections 19627db96d56Sopenharmony_ci---------------------------- 19637db96d56Sopenharmony_ci 19647db96d56Sopenharmony_ciCorresponding to built-in types 19657db96d56Sopenharmony_ci""""""""""""""""""""""""""""""" 19667db96d56Sopenharmony_ci 19677db96d56Sopenharmony_ci.. class:: Dict(dict, MutableMapping[KT, VT]) 19687db96d56Sopenharmony_ci 19697db96d56Sopenharmony_ci A generic version of :class:`dict`. 19707db96d56Sopenharmony_ci Useful for annotating return types. To annotate arguments it is preferred 19717db96d56Sopenharmony_ci to use an abstract collection type such as :class:`Mapping`. 19727db96d56Sopenharmony_ci 19737db96d56Sopenharmony_ci This type can be used as follows:: 19747db96d56Sopenharmony_ci 19757db96d56Sopenharmony_ci def count_words(text: str) -> Dict[str, int]: 19767db96d56Sopenharmony_ci ... 19777db96d56Sopenharmony_ci 19787db96d56Sopenharmony_ci .. deprecated:: 3.9 19797db96d56Sopenharmony_ci :class:`builtins.dict <dict>` now supports subscripting (``[]``). 19807db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 19817db96d56Sopenharmony_ci 19827db96d56Sopenharmony_ci.. class:: List(list, MutableSequence[T]) 19837db96d56Sopenharmony_ci 19847db96d56Sopenharmony_ci Generic version of :class:`list`. 19857db96d56Sopenharmony_ci Useful for annotating return types. To annotate arguments it is preferred 19867db96d56Sopenharmony_ci to use an abstract collection type such as :class:`Sequence` or 19877db96d56Sopenharmony_ci :class:`Iterable`. 19887db96d56Sopenharmony_ci 19897db96d56Sopenharmony_ci This type may be used as follows:: 19907db96d56Sopenharmony_ci 19917db96d56Sopenharmony_ci T = TypeVar('T', int, float) 19927db96d56Sopenharmony_ci 19937db96d56Sopenharmony_ci def vec2(x: T, y: T) -> List[T]: 19947db96d56Sopenharmony_ci return [x, y] 19957db96d56Sopenharmony_ci 19967db96d56Sopenharmony_ci def keep_positives(vector: Sequence[T]) -> List[T]: 19977db96d56Sopenharmony_ci return [item for item in vector if item > 0] 19987db96d56Sopenharmony_ci 19997db96d56Sopenharmony_ci .. deprecated:: 3.9 20007db96d56Sopenharmony_ci :class:`builtins.list <list>` now supports subscripting (``[]``). 20017db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 20027db96d56Sopenharmony_ci 20037db96d56Sopenharmony_ci.. class:: Set(set, MutableSet[T]) 20047db96d56Sopenharmony_ci 20057db96d56Sopenharmony_ci A generic version of :class:`builtins.set <set>`. 20067db96d56Sopenharmony_ci Useful for annotating return types. To annotate arguments it is preferred 20077db96d56Sopenharmony_ci to use an abstract collection type such as :class:`AbstractSet`. 20087db96d56Sopenharmony_ci 20097db96d56Sopenharmony_ci .. deprecated:: 3.9 20107db96d56Sopenharmony_ci :class:`builtins.set <set>` now supports subscripting (``[]``). 20117db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 20127db96d56Sopenharmony_ci 20137db96d56Sopenharmony_ci.. class:: FrozenSet(frozenset, AbstractSet[T_co]) 20147db96d56Sopenharmony_ci 20157db96d56Sopenharmony_ci A generic version of :class:`builtins.frozenset <frozenset>`. 20167db96d56Sopenharmony_ci 20177db96d56Sopenharmony_ci .. deprecated:: 3.9 20187db96d56Sopenharmony_ci :class:`builtins.frozenset <frozenset>` 20197db96d56Sopenharmony_ci now supports subscripting (``[]``). 20207db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 20217db96d56Sopenharmony_ci 20227db96d56Sopenharmony_ci.. note:: :data:`Tuple` is a special form. 20237db96d56Sopenharmony_ci 20247db96d56Sopenharmony_ciCorresponding to types in :mod:`collections` 20257db96d56Sopenharmony_ci"""""""""""""""""""""""""""""""""""""""""""" 20267db96d56Sopenharmony_ci 20277db96d56Sopenharmony_ci.. class:: DefaultDict(collections.defaultdict, MutableMapping[KT, VT]) 20287db96d56Sopenharmony_ci 20297db96d56Sopenharmony_ci A generic version of :class:`collections.defaultdict`. 20307db96d56Sopenharmony_ci 20317db96d56Sopenharmony_ci .. versionadded:: 3.5.2 20327db96d56Sopenharmony_ci 20337db96d56Sopenharmony_ci .. deprecated:: 3.9 20347db96d56Sopenharmony_ci :class:`collections.defaultdict` now supports subscripting (``[]``). 20357db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 20367db96d56Sopenharmony_ci 20377db96d56Sopenharmony_ci.. class:: OrderedDict(collections.OrderedDict, MutableMapping[KT, VT]) 20387db96d56Sopenharmony_ci 20397db96d56Sopenharmony_ci A generic version of :class:`collections.OrderedDict`. 20407db96d56Sopenharmony_ci 20417db96d56Sopenharmony_ci .. versionadded:: 3.7.2 20427db96d56Sopenharmony_ci 20437db96d56Sopenharmony_ci .. deprecated:: 3.9 20447db96d56Sopenharmony_ci :class:`collections.OrderedDict` now supports subscripting (``[]``). 20457db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 20467db96d56Sopenharmony_ci 20477db96d56Sopenharmony_ci.. class:: ChainMap(collections.ChainMap, MutableMapping[KT, VT]) 20487db96d56Sopenharmony_ci 20497db96d56Sopenharmony_ci A generic version of :class:`collections.ChainMap`. 20507db96d56Sopenharmony_ci 20517db96d56Sopenharmony_ci .. versionadded:: 3.5.4 20527db96d56Sopenharmony_ci .. versionadded:: 3.6.1 20537db96d56Sopenharmony_ci 20547db96d56Sopenharmony_ci .. deprecated:: 3.9 20557db96d56Sopenharmony_ci :class:`collections.ChainMap` now supports subscripting (``[]``). 20567db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 20577db96d56Sopenharmony_ci 20587db96d56Sopenharmony_ci.. class:: Counter(collections.Counter, Dict[T, int]) 20597db96d56Sopenharmony_ci 20607db96d56Sopenharmony_ci A generic version of :class:`collections.Counter`. 20617db96d56Sopenharmony_ci 20627db96d56Sopenharmony_ci .. versionadded:: 3.5.4 20637db96d56Sopenharmony_ci .. versionadded:: 3.6.1 20647db96d56Sopenharmony_ci 20657db96d56Sopenharmony_ci .. deprecated:: 3.9 20667db96d56Sopenharmony_ci :class:`collections.Counter` now supports subscripting (``[]``). 20677db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 20687db96d56Sopenharmony_ci 20697db96d56Sopenharmony_ci.. class:: Deque(deque, MutableSequence[T]) 20707db96d56Sopenharmony_ci 20717db96d56Sopenharmony_ci A generic version of :class:`collections.deque`. 20727db96d56Sopenharmony_ci 20737db96d56Sopenharmony_ci .. versionadded:: 3.5.4 20747db96d56Sopenharmony_ci .. versionadded:: 3.6.1 20757db96d56Sopenharmony_ci 20767db96d56Sopenharmony_ci .. deprecated:: 3.9 20777db96d56Sopenharmony_ci :class:`collections.deque` now supports subscripting (``[]``). 20787db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 20797db96d56Sopenharmony_ci 20807db96d56Sopenharmony_ciOther concrete types 20817db96d56Sopenharmony_ci"""""""""""""""""""" 20827db96d56Sopenharmony_ci 20837db96d56Sopenharmony_ci.. class:: IO 20847db96d56Sopenharmony_ci TextIO 20857db96d56Sopenharmony_ci BinaryIO 20867db96d56Sopenharmony_ci 20877db96d56Sopenharmony_ci Generic type ``IO[AnyStr]`` and its subclasses ``TextIO(IO[str])`` 20887db96d56Sopenharmony_ci and ``BinaryIO(IO[bytes])`` 20897db96d56Sopenharmony_ci represent the types of I/O streams such as returned by 20907db96d56Sopenharmony_ci :func:`open`. 20917db96d56Sopenharmony_ci 20927db96d56Sopenharmony_ci .. deprecated-removed:: 3.8 3.13 20937db96d56Sopenharmony_ci The ``typing.io`` namespace is deprecated and will be removed. 20947db96d56Sopenharmony_ci These types should be directly imported from ``typing`` instead. 20957db96d56Sopenharmony_ci 20967db96d56Sopenharmony_ci.. class:: Pattern 20977db96d56Sopenharmony_ci Match 20987db96d56Sopenharmony_ci 20997db96d56Sopenharmony_ci These type aliases 21007db96d56Sopenharmony_ci correspond to the return types from :func:`re.compile` and 21017db96d56Sopenharmony_ci :func:`re.match`. These types (and the corresponding functions) 21027db96d56Sopenharmony_ci are generic in ``AnyStr`` and can be made specific by writing 21037db96d56Sopenharmony_ci ``Pattern[str]``, ``Pattern[bytes]``, ``Match[str]``, or 21047db96d56Sopenharmony_ci ``Match[bytes]``. 21057db96d56Sopenharmony_ci 21067db96d56Sopenharmony_ci .. deprecated-removed:: 3.8 3.13 21077db96d56Sopenharmony_ci The ``typing.re`` namespace is deprecated and will be removed. 21087db96d56Sopenharmony_ci These types should be directly imported from ``typing`` instead. 21097db96d56Sopenharmony_ci 21107db96d56Sopenharmony_ci .. deprecated:: 3.9 21117db96d56Sopenharmony_ci Classes ``Pattern`` and ``Match`` from :mod:`re` now support ``[]``. 21127db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 21137db96d56Sopenharmony_ci 21147db96d56Sopenharmony_ci.. class:: Text 21157db96d56Sopenharmony_ci 21167db96d56Sopenharmony_ci ``Text`` is an alias for ``str``. It is provided to supply a forward 21177db96d56Sopenharmony_ci compatible path for Python 2 code: in Python 2, ``Text`` is an alias for 21187db96d56Sopenharmony_ci ``unicode``. 21197db96d56Sopenharmony_ci 21207db96d56Sopenharmony_ci Use ``Text`` to indicate that a value must contain a unicode string in 21217db96d56Sopenharmony_ci a manner that is compatible with both Python 2 and Python 3:: 21227db96d56Sopenharmony_ci 21237db96d56Sopenharmony_ci def add_unicode_checkmark(text: Text) -> Text: 21247db96d56Sopenharmony_ci return text + u' \u2713' 21257db96d56Sopenharmony_ci 21267db96d56Sopenharmony_ci .. versionadded:: 3.5.2 21277db96d56Sopenharmony_ci 21287db96d56Sopenharmony_ci .. deprecated:: 3.11 21297db96d56Sopenharmony_ci Python 2 is no longer supported, and most type checkers also no longer 21307db96d56Sopenharmony_ci support type checking Python 2 code. Removal of the alias is not 21317db96d56Sopenharmony_ci currently planned, but users are encouraged to use 21327db96d56Sopenharmony_ci :class:`str` instead of ``Text``. 21337db96d56Sopenharmony_ci 21347db96d56Sopenharmony_ciAbstract Base Classes 21357db96d56Sopenharmony_ci--------------------- 21367db96d56Sopenharmony_ci 21377db96d56Sopenharmony_ciCorresponding to collections in :mod:`collections.abc` 21387db96d56Sopenharmony_ci"""""""""""""""""""""""""""""""""""""""""""""""""""""" 21397db96d56Sopenharmony_ci 21407db96d56Sopenharmony_ci.. class:: AbstractSet(Collection[T_co]) 21417db96d56Sopenharmony_ci 21427db96d56Sopenharmony_ci A generic version of :class:`collections.abc.Set`. 21437db96d56Sopenharmony_ci 21447db96d56Sopenharmony_ci .. deprecated:: 3.9 21457db96d56Sopenharmony_ci :class:`collections.abc.Set` now supports subscripting (``[]``). 21467db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 21477db96d56Sopenharmony_ci 21487db96d56Sopenharmony_ci.. class:: ByteString(Sequence[int]) 21497db96d56Sopenharmony_ci 21507db96d56Sopenharmony_ci This type represents the types :class:`bytes`, :class:`bytearray`, 21517db96d56Sopenharmony_ci and :class:`memoryview` of byte sequences. 21527db96d56Sopenharmony_ci 21537db96d56Sopenharmony_ci .. deprecated-removed:: 3.9 3.14 21547db96d56Sopenharmony_ci Prefer ``typing_extensions.Buffer``, or a union like ``bytes | bytearray | memoryview``. 21557db96d56Sopenharmony_ci 21567db96d56Sopenharmony_ci.. class:: Collection(Sized, Iterable[T_co], Container[T_co]) 21577db96d56Sopenharmony_ci 21587db96d56Sopenharmony_ci A generic version of :class:`collections.abc.Collection` 21597db96d56Sopenharmony_ci 21607db96d56Sopenharmony_ci .. versionadded:: 3.6.0 21617db96d56Sopenharmony_ci 21627db96d56Sopenharmony_ci .. deprecated:: 3.9 21637db96d56Sopenharmony_ci :class:`collections.abc.Collection` now supports subscripting (``[]``). 21647db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 21657db96d56Sopenharmony_ci 21667db96d56Sopenharmony_ci.. class:: Container(Generic[T_co]) 21677db96d56Sopenharmony_ci 21687db96d56Sopenharmony_ci A generic version of :class:`collections.abc.Container`. 21697db96d56Sopenharmony_ci 21707db96d56Sopenharmony_ci .. deprecated:: 3.9 21717db96d56Sopenharmony_ci :class:`collections.abc.Container` now supports subscripting (``[]``). 21727db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 21737db96d56Sopenharmony_ci 21747db96d56Sopenharmony_ci.. class:: ItemsView(MappingView, AbstractSet[tuple[KT_co, VT_co]]) 21757db96d56Sopenharmony_ci 21767db96d56Sopenharmony_ci A generic version of :class:`collections.abc.ItemsView`. 21777db96d56Sopenharmony_ci 21787db96d56Sopenharmony_ci .. deprecated:: 3.9 21797db96d56Sopenharmony_ci :class:`collections.abc.ItemsView` now supports subscripting (``[]``). 21807db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 21817db96d56Sopenharmony_ci 21827db96d56Sopenharmony_ci.. class:: KeysView(MappingView, AbstractSet[KT_co]) 21837db96d56Sopenharmony_ci 21847db96d56Sopenharmony_ci A generic version of :class:`collections.abc.KeysView`. 21857db96d56Sopenharmony_ci 21867db96d56Sopenharmony_ci .. deprecated:: 3.9 21877db96d56Sopenharmony_ci :class:`collections.abc.KeysView` now supports subscripting (``[]``). 21887db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 21897db96d56Sopenharmony_ci 21907db96d56Sopenharmony_ci.. class:: Mapping(Collection[KT], Generic[KT, VT_co]) 21917db96d56Sopenharmony_ci 21927db96d56Sopenharmony_ci A generic version of :class:`collections.abc.Mapping`. 21937db96d56Sopenharmony_ci This type can be used as follows:: 21947db96d56Sopenharmony_ci 21957db96d56Sopenharmony_ci def get_position_in_index(word_list: Mapping[str, int], word: str) -> int: 21967db96d56Sopenharmony_ci return word_list[word] 21977db96d56Sopenharmony_ci 21987db96d56Sopenharmony_ci .. deprecated:: 3.9 21997db96d56Sopenharmony_ci :class:`collections.abc.Mapping` now supports subscripting (``[]``). 22007db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 22017db96d56Sopenharmony_ci 22027db96d56Sopenharmony_ci.. class:: MappingView(Sized) 22037db96d56Sopenharmony_ci 22047db96d56Sopenharmony_ci A generic version of :class:`collections.abc.MappingView`. 22057db96d56Sopenharmony_ci 22067db96d56Sopenharmony_ci .. deprecated:: 3.9 22077db96d56Sopenharmony_ci :class:`collections.abc.MappingView` now supports subscripting (``[]``). 22087db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 22097db96d56Sopenharmony_ci 22107db96d56Sopenharmony_ci.. class:: MutableMapping(Mapping[KT, VT]) 22117db96d56Sopenharmony_ci 22127db96d56Sopenharmony_ci A generic version of :class:`collections.abc.MutableMapping`. 22137db96d56Sopenharmony_ci 22147db96d56Sopenharmony_ci .. deprecated:: 3.9 22157db96d56Sopenharmony_ci :class:`collections.abc.MutableMapping` 22167db96d56Sopenharmony_ci now supports subscripting (``[]``). 22177db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 22187db96d56Sopenharmony_ci 22197db96d56Sopenharmony_ci.. class:: MutableSequence(Sequence[T]) 22207db96d56Sopenharmony_ci 22217db96d56Sopenharmony_ci A generic version of :class:`collections.abc.MutableSequence`. 22227db96d56Sopenharmony_ci 22237db96d56Sopenharmony_ci .. deprecated:: 3.9 22247db96d56Sopenharmony_ci :class:`collections.abc.MutableSequence` 22257db96d56Sopenharmony_ci now supports subscripting (``[]``). 22267db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 22277db96d56Sopenharmony_ci 22287db96d56Sopenharmony_ci.. class:: MutableSet(AbstractSet[T]) 22297db96d56Sopenharmony_ci 22307db96d56Sopenharmony_ci A generic version of :class:`collections.abc.MutableSet`. 22317db96d56Sopenharmony_ci 22327db96d56Sopenharmony_ci .. deprecated:: 3.9 22337db96d56Sopenharmony_ci :class:`collections.abc.MutableSet` now supports subscripting (``[]``). 22347db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 22357db96d56Sopenharmony_ci 22367db96d56Sopenharmony_ci.. class:: Sequence(Reversible[T_co], Collection[T_co]) 22377db96d56Sopenharmony_ci 22387db96d56Sopenharmony_ci A generic version of :class:`collections.abc.Sequence`. 22397db96d56Sopenharmony_ci 22407db96d56Sopenharmony_ci .. deprecated:: 3.9 22417db96d56Sopenharmony_ci :class:`collections.abc.Sequence` now supports subscripting (``[]``). 22427db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 22437db96d56Sopenharmony_ci 22447db96d56Sopenharmony_ci.. class:: ValuesView(MappingView, Collection[_VT_co]) 22457db96d56Sopenharmony_ci 22467db96d56Sopenharmony_ci A generic version of :class:`collections.abc.ValuesView`. 22477db96d56Sopenharmony_ci 22487db96d56Sopenharmony_ci .. deprecated:: 3.9 22497db96d56Sopenharmony_ci :class:`collections.abc.ValuesView` now supports subscripting (``[]``). 22507db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 22517db96d56Sopenharmony_ci 22527db96d56Sopenharmony_ciCorresponding to other types in :mod:`collections.abc` 22537db96d56Sopenharmony_ci"""""""""""""""""""""""""""""""""""""""""""""""""""""" 22547db96d56Sopenharmony_ci 22557db96d56Sopenharmony_ci.. class:: Iterable(Generic[T_co]) 22567db96d56Sopenharmony_ci 22577db96d56Sopenharmony_ci A generic version of :class:`collections.abc.Iterable`. 22587db96d56Sopenharmony_ci 22597db96d56Sopenharmony_ci .. deprecated:: 3.9 22607db96d56Sopenharmony_ci :class:`collections.abc.Iterable` now supports subscripting (``[]``). 22617db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 22627db96d56Sopenharmony_ci 22637db96d56Sopenharmony_ci.. class:: Iterator(Iterable[T_co]) 22647db96d56Sopenharmony_ci 22657db96d56Sopenharmony_ci A generic version of :class:`collections.abc.Iterator`. 22667db96d56Sopenharmony_ci 22677db96d56Sopenharmony_ci .. deprecated:: 3.9 22687db96d56Sopenharmony_ci :class:`collections.abc.Iterator` now supports subscripting (``[]``). 22697db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 22707db96d56Sopenharmony_ci 22717db96d56Sopenharmony_ci.. class:: Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]) 22727db96d56Sopenharmony_ci 22737db96d56Sopenharmony_ci A generator can be annotated by the generic type 22747db96d56Sopenharmony_ci ``Generator[YieldType, SendType, ReturnType]``. For example:: 22757db96d56Sopenharmony_ci 22767db96d56Sopenharmony_ci def echo_round() -> Generator[int, float, str]: 22777db96d56Sopenharmony_ci sent = yield 0 22787db96d56Sopenharmony_ci while sent >= 0: 22797db96d56Sopenharmony_ci sent = yield round(sent) 22807db96d56Sopenharmony_ci return 'Done' 22817db96d56Sopenharmony_ci 22827db96d56Sopenharmony_ci Note that unlike many other generics in the typing module, the ``SendType`` 22837db96d56Sopenharmony_ci of :class:`Generator` behaves contravariantly, not covariantly or 22847db96d56Sopenharmony_ci invariantly. 22857db96d56Sopenharmony_ci 22867db96d56Sopenharmony_ci If your generator will only yield values, set the ``SendType`` and 22877db96d56Sopenharmony_ci ``ReturnType`` to ``None``:: 22887db96d56Sopenharmony_ci 22897db96d56Sopenharmony_ci def infinite_stream(start: int) -> Generator[int, None, None]: 22907db96d56Sopenharmony_ci while True: 22917db96d56Sopenharmony_ci yield start 22927db96d56Sopenharmony_ci start += 1 22937db96d56Sopenharmony_ci 22947db96d56Sopenharmony_ci Alternatively, annotate your generator as having a return type of 22957db96d56Sopenharmony_ci either ``Iterable[YieldType]`` or ``Iterator[YieldType]``:: 22967db96d56Sopenharmony_ci 22977db96d56Sopenharmony_ci def infinite_stream(start: int) -> Iterator[int]: 22987db96d56Sopenharmony_ci while True: 22997db96d56Sopenharmony_ci yield start 23007db96d56Sopenharmony_ci start += 1 23017db96d56Sopenharmony_ci 23027db96d56Sopenharmony_ci .. deprecated:: 3.9 23037db96d56Sopenharmony_ci :class:`collections.abc.Generator` now supports subscripting (``[]``). 23047db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 23057db96d56Sopenharmony_ci 23067db96d56Sopenharmony_ci.. class:: Hashable 23077db96d56Sopenharmony_ci 23087db96d56Sopenharmony_ci An alias to :class:`collections.abc.Hashable`. 23097db96d56Sopenharmony_ci 23107db96d56Sopenharmony_ci.. class:: Reversible(Iterable[T_co]) 23117db96d56Sopenharmony_ci 23127db96d56Sopenharmony_ci A generic version of :class:`collections.abc.Reversible`. 23137db96d56Sopenharmony_ci 23147db96d56Sopenharmony_ci .. deprecated:: 3.9 23157db96d56Sopenharmony_ci :class:`collections.abc.Reversible` now supports subscripting (``[]``). 23167db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 23177db96d56Sopenharmony_ci 23187db96d56Sopenharmony_ci.. class:: Sized 23197db96d56Sopenharmony_ci 23207db96d56Sopenharmony_ci An alias to :class:`collections.abc.Sized`. 23217db96d56Sopenharmony_ci 23227db96d56Sopenharmony_ciAsynchronous programming 23237db96d56Sopenharmony_ci"""""""""""""""""""""""" 23247db96d56Sopenharmony_ci 23257db96d56Sopenharmony_ci.. class:: Coroutine(Awaitable[V_co], Generic[T_co, T_contra, V_co]) 23267db96d56Sopenharmony_ci 23277db96d56Sopenharmony_ci A generic version of :class:`collections.abc.Coroutine`. 23287db96d56Sopenharmony_ci The variance and order of type variables 23297db96d56Sopenharmony_ci correspond to those of :class:`Generator`, for example:: 23307db96d56Sopenharmony_ci 23317db96d56Sopenharmony_ci from collections.abc import Coroutine 23327db96d56Sopenharmony_ci c: Coroutine[list[str], str, int] # Some coroutine defined elsewhere 23337db96d56Sopenharmony_ci x = c.send('hi') # Inferred type of 'x' is list[str] 23347db96d56Sopenharmony_ci async def bar() -> None: 23357db96d56Sopenharmony_ci y = await c # Inferred type of 'y' is int 23367db96d56Sopenharmony_ci 23377db96d56Sopenharmony_ci .. versionadded:: 3.5.3 23387db96d56Sopenharmony_ci 23397db96d56Sopenharmony_ci .. deprecated:: 3.9 23407db96d56Sopenharmony_ci :class:`collections.abc.Coroutine` now supports subscripting (``[]``). 23417db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 23427db96d56Sopenharmony_ci 23437db96d56Sopenharmony_ci.. class:: AsyncGenerator(AsyncIterator[T_co], Generic[T_co, T_contra]) 23447db96d56Sopenharmony_ci 23457db96d56Sopenharmony_ci An async generator can be annotated by the generic type 23467db96d56Sopenharmony_ci ``AsyncGenerator[YieldType, SendType]``. For example:: 23477db96d56Sopenharmony_ci 23487db96d56Sopenharmony_ci async def echo_round() -> AsyncGenerator[int, float]: 23497db96d56Sopenharmony_ci sent = yield 0 23507db96d56Sopenharmony_ci while sent >= 0.0: 23517db96d56Sopenharmony_ci rounded = await round(sent) 23527db96d56Sopenharmony_ci sent = yield rounded 23537db96d56Sopenharmony_ci 23547db96d56Sopenharmony_ci Unlike normal generators, async generators cannot return a value, so there 23557db96d56Sopenharmony_ci is no ``ReturnType`` type parameter. As with :class:`Generator`, the 23567db96d56Sopenharmony_ci ``SendType`` behaves contravariantly. 23577db96d56Sopenharmony_ci 23587db96d56Sopenharmony_ci If your generator will only yield values, set the ``SendType`` to 23597db96d56Sopenharmony_ci ``None``:: 23607db96d56Sopenharmony_ci 23617db96d56Sopenharmony_ci async def infinite_stream(start: int) -> AsyncGenerator[int, None]: 23627db96d56Sopenharmony_ci while True: 23637db96d56Sopenharmony_ci yield start 23647db96d56Sopenharmony_ci start = await increment(start) 23657db96d56Sopenharmony_ci 23667db96d56Sopenharmony_ci Alternatively, annotate your generator as having a return type of 23677db96d56Sopenharmony_ci either ``AsyncIterable[YieldType]`` or ``AsyncIterator[YieldType]``:: 23687db96d56Sopenharmony_ci 23697db96d56Sopenharmony_ci async def infinite_stream(start: int) -> AsyncIterator[int]: 23707db96d56Sopenharmony_ci while True: 23717db96d56Sopenharmony_ci yield start 23727db96d56Sopenharmony_ci start = await increment(start) 23737db96d56Sopenharmony_ci 23747db96d56Sopenharmony_ci .. versionadded:: 3.6.1 23757db96d56Sopenharmony_ci 23767db96d56Sopenharmony_ci .. deprecated:: 3.9 23777db96d56Sopenharmony_ci :class:`collections.abc.AsyncGenerator` 23787db96d56Sopenharmony_ci now supports subscripting (``[]``). 23797db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 23807db96d56Sopenharmony_ci 23817db96d56Sopenharmony_ci.. class:: AsyncIterable(Generic[T_co]) 23827db96d56Sopenharmony_ci 23837db96d56Sopenharmony_ci A generic version of :class:`collections.abc.AsyncIterable`. 23847db96d56Sopenharmony_ci 23857db96d56Sopenharmony_ci .. versionadded:: 3.5.2 23867db96d56Sopenharmony_ci 23877db96d56Sopenharmony_ci .. deprecated:: 3.9 23887db96d56Sopenharmony_ci :class:`collections.abc.AsyncIterable` now supports subscripting (``[]``). 23897db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 23907db96d56Sopenharmony_ci 23917db96d56Sopenharmony_ci.. class:: AsyncIterator(AsyncIterable[T_co]) 23927db96d56Sopenharmony_ci 23937db96d56Sopenharmony_ci A generic version of :class:`collections.abc.AsyncIterator`. 23947db96d56Sopenharmony_ci 23957db96d56Sopenharmony_ci .. versionadded:: 3.5.2 23967db96d56Sopenharmony_ci 23977db96d56Sopenharmony_ci .. deprecated:: 3.9 23987db96d56Sopenharmony_ci :class:`collections.abc.AsyncIterator` now supports subscripting (``[]``). 23997db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 24007db96d56Sopenharmony_ci 24017db96d56Sopenharmony_ci.. class:: Awaitable(Generic[T_co]) 24027db96d56Sopenharmony_ci 24037db96d56Sopenharmony_ci A generic version of :class:`collections.abc.Awaitable`. 24047db96d56Sopenharmony_ci 24057db96d56Sopenharmony_ci .. versionadded:: 3.5.2 24067db96d56Sopenharmony_ci 24077db96d56Sopenharmony_ci .. deprecated:: 3.9 24087db96d56Sopenharmony_ci :class:`collections.abc.Awaitable` now supports subscripting (``[]``). 24097db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 24107db96d56Sopenharmony_ci 24117db96d56Sopenharmony_ci 24127db96d56Sopenharmony_ciContext manager types 24137db96d56Sopenharmony_ci""""""""""""""""""""" 24147db96d56Sopenharmony_ci 24157db96d56Sopenharmony_ci.. class:: ContextManager(Generic[T_co]) 24167db96d56Sopenharmony_ci 24177db96d56Sopenharmony_ci A generic version of :class:`contextlib.AbstractContextManager`. 24187db96d56Sopenharmony_ci 24197db96d56Sopenharmony_ci .. versionadded:: 3.5.4 24207db96d56Sopenharmony_ci .. versionadded:: 3.6.0 24217db96d56Sopenharmony_ci 24227db96d56Sopenharmony_ci .. deprecated:: 3.9 24237db96d56Sopenharmony_ci :class:`contextlib.AbstractContextManager` 24247db96d56Sopenharmony_ci now supports subscripting (``[]``). 24257db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 24267db96d56Sopenharmony_ci 24277db96d56Sopenharmony_ci.. class:: AsyncContextManager(Generic[T_co]) 24287db96d56Sopenharmony_ci 24297db96d56Sopenharmony_ci A generic version of :class:`contextlib.AbstractAsyncContextManager`. 24307db96d56Sopenharmony_ci 24317db96d56Sopenharmony_ci .. versionadded:: 3.5.4 24327db96d56Sopenharmony_ci .. versionadded:: 3.6.2 24337db96d56Sopenharmony_ci 24347db96d56Sopenharmony_ci .. deprecated:: 3.9 24357db96d56Sopenharmony_ci :class:`contextlib.AbstractAsyncContextManager` 24367db96d56Sopenharmony_ci now supports subscripting (``[]``). 24377db96d56Sopenharmony_ci See :pep:`585` and :ref:`types-genericalias`. 24387db96d56Sopenharmony_ci 24397db96d56Sopenharmony_ciProtocols 24407db96d56Sopenharmony_ci--------- 24417db96d56Sopenharmony_ci 24427db96d56Sopenharmony_ciThese protocols are decorated with :func:`runtime_checkable`. 24437db96d56Sopenharmony_ci 24447db96d56Sopenharmony_ci.. class:: SupportsAbs 24457db96d56Sopenharmony_ci 24467db96d56Sopenharmony_ci An ABC with one abstract method ``__abs__`` that is covariant 24477db96d56Sopenharmony_ci in its return type. 24487db96d56Sopenharmony_ci 24497db96d56Sopenharmony_ci.. class:: SupportsBytes 24507db96d56Sopenharmony_ci 24517db96d56Sopenharmony_ci An ABC with one abstract method ``__bytes__``. 24527db96d56Sopenharmony_ci 24537db96d56Sopenharmony_ci.. class:: SupportsComplex 24547db96d56Sopenharmony_ci 24557db96d56Sopenharmony_ci An ABC with one abstract method ``__complex__``. 24567db96d56Sopenharmony_ci 24577db96d56Sopenharmony_ci.. class:: SupportsFloat 24587db96d56Sopenharmony_ci 24597db96d56Sopenharmony_ci An ABC with one abstract method ``__float__``. 24607db96d56Sopenharmony_ci 24617db96d56Sopenharmony_ci.. class:: SupportsIndex 24627db96d56Sopenharmony_ci 24637db96d56Sopenharmony_ci An ABC with one abstract method ``__index__``. 24647db96d56Sopenharmony_ci 24657db96d56Sopenharmony_ci .. versionadded:: 3.8 24667db96d56Sopenharmony_ci 24677db96d56Sopenharmony_ci.. class:: SupportsInt 24687db96d56Sopenharmony_ci 24697db96d56Sopenharmony_ci An ABC with one abstract method ``__int__``. 24707db96d56Sopenharmony_ci 24717db96d56Sopenharmony_ci.. class:: SupportsRound 24727db96d56Sopenharmony_ci 24737db96d56Sopenharmony_ci An ABC with one abstract method ``__round__`` 24747db96d56Sopenharmony_ci that is covariant in its return type. 24757db96d56Sopenharmony_ci 24767db96d56Sopenharmony_ciFunctions and decorators 24777db96d56Sopenharmony_ci------------------------ 24787db96d56Sopenharmony_ci 24797db96d56Sopenharmony_ci.. function:: cast(typ, val) 24807db96d56Sopenharmony_ci 24817db96d56Sopenharmony_ci Cast a value to a type. 24827db96d56Sopenharmony_ci 24837db96d56Sopenharmony_ci This returns the value unchanged. To the type checker this 24847db96d56Sopenharmony_ci signals that the return value has the designated type, but at 24857db96d56Sopenharmony_ci runtime we intentionally don't check anything (we want this 24867db96d56Sopenharmony_ci to be as fast as possible). 24877db96d56Sopenharmony_ci 24887db96d56Sopenharmony_ci.. function:: assert_type(val, typ, /) 24897db96d56Sopenharmony_ci 24907db96d56Sopenharmony_ci Ask a static type checker to confirm that *val* has an inferred type of *typ*. 24917db96d56Sopenharmony_ci 24927db96d56Sopenharmony_ci At runtime this does nothing: it returns the first argument unchanged with no 24937db96d56Sopenharmony_ci checks or side effects, no matter the actual type of the argument. 24947db96d56Sopenharmony_ci 24957db96d56Sopenharmony_ci When a static type checker encounters a call to ``assert_type()``, it 24967db96d56Sopenharmony_ci emits an error if the value is not of the specified type:: 24977db96d56Sopenharmony_ci 24987db96d56Sopenharmony_ci def greet(name: str) -> None: 24997db96d56Sopenharmony_ci assert_type(name, str) # OK, inferred type of `name` is `str` 25007db96d56Sopenharmony_ci assert_type(name, int) # type checker error 25017db96d56Sopenharmony_ci 25027db96d56Sopenharmony_ci This function is useful for ensuring the type checker's understanding of a 25037db96d56Sopenharmony_ci script is in line with the developer's intentions:: 25047db96d56Sopenharmony_ci 25057db96d56Sopenharmony_ci def complex_function(arg: object): 25067db96d56Sopenharmony_ci # Do some complex type-narrowing logic, 25077db96d56Sopenharmony_ci # after which we hope the inferred type will be `int` 25087db96d56Sopenharmony_ci ... 25097db96d56Sopenharmony_ci # Test whether the type checker correctly understands our function 25107db96d56Sopenharmony_ci assert_type(arg, int) 25117db96d56Sopenharmony_ci 25127db96d56Sopenharmony_ci .. versionadded:: 3.11 25137db96d56Sopenharmony_ci 25147db96d56Sopenharmony_ci.. function:: assert_never(arg, /) 25157db96d56Sopenharmony_ci 25167db96d56Sopenharmony_ci Ask a static type checker to confirm that a line of code is unreachable. 25177db96d56Sopenharmony_ci 25187db96d56Sopenharmony_ci Example:: 25197db96d56Sopenharmony_ci 25207db96d56Sopenharmony_ci def int_or_str(arg: int | str) -> None: 25217db96d56Sopenharmony_ci match arg: 25227db96d56Sopenharmony_ci case int(): 25237db96d56Sopenharmony_ci print("It's an int") 25247db96d56Sopenharmony_ci case str(): 25257db96d56Sopenharmony_ci print("It's a str") 25267db96d56Sopenharmony_ci case _ as unreachable: 25277db96d56Sopenharmony_ci assert_never(unreachable) 25287db96d56Sopenharmony_ci 25297db96d56Sopenharmony_ci Here, the annotations allow the type checker to infer that the 25307db96d56Sopenharmony_ci last case can never execute, because ``arg`` is either 25317db96d56Sopenharmony_ci an :class:`int` or a :class:`str`, and both options are covered by 25327db96d56Sopenharmony_ci earlier cases. 25337db96d56Sopenharmony_ci If a type checker finds that a call to ``assert_never()`` is 25347db96d56Sopenharmony_ci reachable, it will emit an error. For example, if the type annotation 25357db96d56Sopenharmony_ci for ``arg`` was instead ``int | str | float``, the type checker would 25367db96d56Sopenharmony_ci emit an error pointing out that ``unreachable`` is of type :class:`float`. 25377db96d56Sopenharmony_ci For a call to ``assert_never`` to pass type checking, the inferred type of 25387db96d56Sopenharmony_ci the argument passed in must be the bottom type, :data:`Never`, and nothing 25397db96d56Sopenharmony_ci else. 25407db96d56Sopenharmony_ci 25417db96d56Sopenharmony_ci At runtime, this throws an exception when called. 25427db96d56Sopenharmony_ci 25437db96d56Sopenharmony_ci .. seealso:: 25447db96d56Sopenharmony_ci `Unreachable Code and Exhaustiveness Checking 25457db96d56Sopenharmony_ci <https://typing.readthedocs.io/en/latest/source/unreachable.html>`__ has more 25467db96d56Sopenharmony_ci information about exhaustiveness checking with static typing. 25477db96d56Sopenharmony_ci 25487db96d56Sopenharmony_ci .. versionadded:: 3.11 25497db96d56Sopenharmony_ci 25507db96d56Sopenharmony_ci.. function:: reveal_type(obj, /) 25517db96d56Sopenharmony_ci 25527db96d56Sopenharmony_ci Reveal the inferred static type of an expression. 25537db96d56Sopenharmony_ci 25547db96d56Sopenharmony_ci When a static type checker encounters a call to this function, 25557db96d56Sopenharmony_ci it emits a diagnostic with the type of the argument. For example:: 25567db96d56Sopenharmony_ci 25577db96d56Sopenharmony_ci x: int = 1 25587db96d56Sopenharmony_ci reveal_type(x) # Revealed type is "builtins.int" 25597db96d56Sopenharmony_ci 25607db96d56Sopenharmony_ci This can be useful when you want to debug how your type checker 25617db96d56Sopenharmony_ci handles a particular piece of code. 25627db96d56Sopenharmony_ci 25637db96d56Sopenharmony_ci The function returns its argument unchanged, which allows using 25647db96d56Sopenharmony_ci it within an expression:: 25657db96d56Sopenharmony_ci 25667db96d56Sopenharmony_ci x = reveal_type(1) # Revealed type is "builtins.int" 25677db96d56Sopenharmony_ci 25687db96d56Sopenharmony_ci Most type checkers support ``reveal_type()`` anywhere, even if the 25697db96d56Sopenharmony_ci name is not imported from ``typing``. Importing the name from 25707db96d56Sopenharmony_ci ``typing`` allows your code to run without runtime errors and 25717db96d56Sopenharmony_ci communicates intent more clearly. 25727db96d56Sopenharmony_ci 25737db96d56Sopenharmony_ci At runtime, this function prints the runtime type of its argument to stderr 25747db96d56Sopenharmony_ci and returns it unchanged:: 25757db96d56Sopenharmony_ci 25767db96d56Sopenharmony_ci x = reveal_type(1) # prints "Runtime type is int" 25777db96d56Sopenharmony_ci print(x) # prints "1" 25787db96d56Sopenharmony_ci 25797db96d56Sopenharmony_ci .. versionadded:: 3.11 25807db96d56Sopenharmony_ci 25817db96d56Sopenharmony_ci.. decorator:: dataclass_transform 25827db96d56Sopenharmony_ci 25837db96d56Sopenharmony_ci :data:`~typing.dataclass_transform` may be used to 25847db96d56Sopenharmony_ci decorate a class, metaclass, or a function that is itself a decorator. 25857db96d56Sopenharmony_ci The presence of ``@dataclass_transform()`` tells a static type checker that the 25867db96d56Sopenharmony_ci decorated object performs runtime "magic" that 25877db96d56Sopenharmony_ci transforms a class, giving it :func:`dataclasses.dataclass`-like behaviors. 25887db96d56Sopenharmony_ci 25897db96d56Sopenharmony_ci Example usage with a decorator function:: 25907db96d56Sopenharmony_ci 25917db96d56Sopenharmony_ci T = TypeVar("T") 25927db96d56Sopenharmony_ci 25937db96d56Sopenharmony_ci @dataclass_transform() 25947db96d56Sopenharmony_ci def create_model(cls: type[T]) -> type[T]: 25957db96d56Sopenharmony_ci ... 25967db96d56Sopenharmony_ci return cls 25977db96d56Sopenharmony_ci 25987db96d56Sopenharmony_ci @create_model 25997db96d56Sopenharmony_ci class CustomerModel: 26007db96d56Sopenharmony_ci id: int 26017db96d56Sopenharmony_ci name: str 26027db96d56Sopenharmony_ci 26037db96d56Sopenharmony_ci On a base class:: 26047db96d56Sopenharmony_ci 26057db96d56Sopenharmony_ci @dataclass_transform() 26067db96d56Sopenharmony_ci class ModelBase: ... 26077db96d56Sopenharmony_ci 26087db96d56Sopenharmony_ci class CustomerModel(ModelBase): 26097db96d56Sopenharmony_ci id: int 26107db96d56Sopenharmony_ci name: str 26117db96d56Sopenharmony_ci 26127db96d56Sopenharmony_ci On a metaclass:: 26137db96d56Sopenharmony_ci 26147db96d56Sopenharmony_ci @dataclass_transform() 26157db96d56Sopenharmony_ci class ModelMeta(type): ... 26167db96d56Sopenharmony_ci 26177db96d56Sopenharmony_ci class ModelBase(metaclass=ModelMeta): ... 26187db96d56Sopenharmony_ci 26197db96d56Sopenharmony_ci class CustomerModel(ModelBase): 26207db96d56Sopenharmony_ci id: int 26217db96d56Sopenharmony_ci name: str 26227db96d56Sopenharmony_ci 26237db96d56Sopenharmony_ci The ``CustomerModel`` classes defined above will 26247db96d56Sopenharmony_ci be treated by type checkers similarly to classes created with 26257db96d56Sopenharmony_ci :func:`@dataclasses.dataclass <dataclasses.dataclass>`. 26267db96d56Sopenharmony_ci For example, type checkers will assume these classes have 26277db96d56Sopenharmony_ci ``__init__`` methods that accept ``id`` and ``name``. 26287db96d56Sopenharmony_ci 26297db96d56Sopenharmony_ci The decorated class, metaclass, or function may accept the following bool 26307db96d56Sopenharmony_ci arguments which type checkers will assume have the same effect as they 26317db96d56Sopenharmony_ci would have on the 26327db96d56Sopenharmony_ci :func:`@dataclasses.dataclass<dataclasses.dataclass>` decorator: ``init``, 26337db96d56Sopenharmony_ci ``eq``, ``order``, ``unsafe_hash``, ``frozen``, ``match_args``, 26347db96d56Sopenharmony_ci ``kw_only``, and ``slots``. It must be possible for the value of these 26357db96d56Sopenharmony_ci arguments (``True`` or ``False``) to be statically evaluated. 26367db96d56Sopenharmony_ci 26377db96d56Sopenharmony_ci The arguments to the ``dataclass_transform`` decorator can be used to 26387db96d56Sopenharmony_ci customize the default behaviors of the decorated class, metaclass, or 26397db96d56Sopenharmony_ci function: 26407db96d56Sopenharmony_ci 26417db96d56Sopenharmony_ci * ``eq_default`` indicates whether the ``eq`` parameter is assumed to be 26427db96d56Sopenharmony_ci ``True`` or ``False`` if it is omitted by the caller. 26437db96d56Sopenharmony_ci * ``order_default`` indicates whether the ``order`` parameter is 26447db96d56Sopenharmony_ci assumed to be True or False if it is omitted by the caller. 26457db96d56Sopenharmony_ci * ``kw_only_default`` indicates whether the ``kw_only`` parameter is 26467db96d56Sopenharmony_ci assumed to be True or False if it is omitted by the caller. 26477db96d56Sopenharmony_ci * ``field_specifiers`` specifies a static list of supported classes 26487db96d56Sopenharmony_ci or functions that describe fields, similar to ``dataclasses.field()``. 26497db96d56Sopenharmony_ci * Arbitrary other keyword arguments are accepted in order to allow for 26507db96d56Sopenharmony_ci possible future extensions. 26517db96d56Sopenharmony_ci 26527db96d56Sopenharmony_ci Type checkers recognize the following optional arguments on field 26537db96d56Sopenharmony_ci specifiers: 26547db96d56Sopenharmony_ci 26557db96d56Sopenharmony_ci * ``init`` indicates whether the field should be included in the 26567db96d56Sopenharmony_ci synthesized ``__init__`` method. If unspecified, ``init`` defaults to 26577db96d56Sopenharmony_ci ``True``. 26587db96d56Sopenharmony_ci * ``default`` provides the default value for the field. 26597db96d56Sopenharmony_ci * ``default_factory`` provides a runtime callback that returns the 26607db96d56Sopenharmony_ci default value for the field. If neither ``default`` nor 26617db96d56Sopenharmony_ci ``default_factory`` are specified, the field is assumed to have no 26627db96d56Sopenharmony_ci default value and must be provided a value when the class is 26637db96d56Sopenharmony_ci instantiated. 26647db96d56Sopenharmony_ci * ``factory`` is an alias for ``default_factory``. 26657db96d56Sopenharmony_ci * ``kw_only`` indicates whether the field should be marked as 26667db96d56Sopenharmony_ci keyword-only. If ``True``, the field will be keyword-only. If 26677db96d56Sopenharmony_ci ``False``, it will not be keyword-only. If unspecified, the value of 26687db96d56Sopenharmony_ci the ``kw_only`` parameter on the object decorated with 26697db96d56Sopenharmony_ci ``dataclass_transform`` will be used, or if that is unspecified, the 26707db96d56Sopenharmony_ci value of ``kw_only_default`` on ``dataclass_transform`` will be used. 26717db96d56Sopenharmony_ci * ``alias`` provides an alternative name for the field. This alternative 26727db96d56Sopenharmony_ci name is used in the synthesized ``__init__`` method. 26737db96d56Sopenharmony_ci 26747db96d56Sopenharmony_ci At runtime, this decorator records its arguments in the 26757db96d56Sopenharmony_ci ``__dataclass_transform__`` attribute on the decorated object. 26767db96d56Sopenharmony_ci It has no other runtime effect. 26777db96d56Sopenharmony_ci 26787db96d56Sopenharmony_ci See :pep:`681` for more details. 26797db96d56Sopenharmony_ci 26807db96d56Sopenharmony_ci .. versionadded:: 3.11 26817db96d56Sopenharmony_ci 26827db96d56Sopenharmony_ci.. decorator:: overload 26837db96d56Sopenharmony_ci 26847db96d56Sopenharmony_ci The ``@overload`` decorator allows describing functions and methods 26857db96d56Sopenharmony_ci that support multiple different combinations of argument types. A series 26867db96d56Sopenharmony_ci of ``@overload``-decorated definitions must be followed by exactly one 26877db96d56Sopenharmony_ci non-``@overload``-decorated definition (for the same function/method). 26887db96d56Sopenharmony_ci The ``@overload``-decorated definitions are for the benefit of the 26897db96d56Sopenharmony_ci type checker only, since they will be overwritten by the 26907db96d56Sopenharmony_ci non-``@overload``-decorated definition, while the latter is used at 26917db96d56Sopenharmony_ci runtime but should be ignored by a type checker. At runtime, calling 26927db96d56Sopenharmony_ci a ``@overload``-decorated function directly will raise 26937db96d56Sopenharmony_ci :exc:`NotImplementedError`. An example of overload that gives a more 26947db96d56Sopenharmony_ci precise type than can be expressed using a union or a type variable:: 26957db96d56Sopenharmony_ci 26967db96d56Sopenharmony_ci @overload 26977db96d56Sopenharmony_ci def process(response: None) -> None: 26987db96d56Sopenharmony_ci ... 26997db96d56Sopenharmony_ci @overload 27007db96d56Sopenharmony_ci def process(response: int) -> tuple[int, str]: 27017db96d56Sopenharmony_ci ... 27027db96d56Sopenharmony_ci @overload 27037db96d56Sopenharmony_ci def process(response: bytes) -> str: 27047db96d56Sopenharmony_ci ... 27057db96d56Sopenharmony_ci def process(response): 27067db96d56Sopenharmony_ci <actual implementation> 27077db96d56Sopenharmony_ci 27087db96d56Sopenharmony_ci See :pep:`484` for more details and comparison with other typing semantics. 27097db96d56Sopenharmony_ci 27107db96d56Sopenharmony_ci .. versionchanged:: 3.11 27117db96d56Sopenharmony_ci Overloaded functions can now be introspected at runtime using 27127db96d56Sopenharmony_ci :func:`get_overloads`. 27137db96d56Sopenharmony_ci 27147db96d56Sopenharmony_ci 27157db96d56Sopenharmony_ci.. function:: get_overloads(func) 27167db96d56Sopenharmony_ci 27177db96d56Sopenharmony_ci Return a sequence of :func:`@overload <overload>`-decorated definitions for 27187db96d56Sopenharmony_ci *func*. *func* is the function object for the implementation of the 27197db96d56Sopenharmony_ci overloaded function. For example, given the definition of ``process`` in 27207db96d56Sopenharmony_ci the documentation for :func:`@overload <overload>`, 27217db96d56Sopenharmony_ci ``get_overloads(process)`` will return a sequence of three function objects 27227db96d56Sopenharmony_ci for the three defined overloads. If called on a function with no overloads, 27237db96d56Sopenharmony_ci ``get_overloads()`` returns an empty sequence. 27247db96d56Sopenharmony_ci 27257db96d56Sopenharmony_ci ``get_overloads()`` can be used for introspecting an overloaded function at 27267db96d56Sopenharmony_ci runtime. 27277db96d56Sopenharmony_ci 27287db96d56Sopenharmony_ci .. versionadded:: 3.11 27297db96d56Sopenharmony_ci 27307db96d56Sopenharmony_ci 27317db96d56Sopenharmony_ci.. function:: clear_overloads() 27327db96d56Sopenharmony_ci 27337db96d56Sopenharmony_ci Clear all registered overloads in the internal registry. This can be used 27347db96d56Sopenharmony_ci to reclaim the memory used by the registry. 27357db96d56Sopenharmony_ci 27367db96d56Sopenharmony_ci .. versionadded:: 3.11 27377db96d56Sopenharmony_ci 27387db96d56Sopenharmony_ci 27397db96d56Sopenharmony_ci.. decorator:: final 27407db96d56Sopenharmony_ci 27417db96d56Sopenharmony_ci A decorator to indicate to type checkers that the decorated method 27427db96d56Sopenharmony_ci cannot be overridden, and the decorated class cannot be subclassed. 27437db96d56Sopenharmony_ci For example:: 27447db96d56Sopenharmony_ci 27457db96d56Sopenharmony_ci class Base: 27467db96d56Sopenharmony_ci @final 27477db96d56Sopenharmony_ci def done(self) -> None: 27487db96d56Sopenharmony_ci ... 27497db96d56Sopenharmony_ci class Sub(Base): 27507db96d56Sopenharmony_ci def done(self) -> None: # Error reported by type checker 27517db96d56Sopenharmony_ci ... 27527db96d56Sopenharmony_ci 27537db96d56Sopenharmony_ci @final 27547db96d56Sopenharmony_ci class Leaf: 27557db96d56Sopenharmony_ci ... 27567db96d56Sopenharmony_ci class Other(Leaf): # Error reported by type checker 27577db96d56Sopenharmony_ci ... 27587db96d56Sopenharmony_ci 27597db96d56Sopenharmony_ci There is no runtime checking of these properties. See :pep:`591` for 27607db96d56Sopenharmony_ci more details. 27617db96d56Sopenharmony_ci 27627db96d56Sopenharmony_ci .. versionadded:: 3.8 27637db96d56Sopenharmony_ci 27647db96d56Sopenharmony_ci .. versionchanged:: 3.11 27657db96d56Sopenharmony_ci The decorator will now set the ``__final__`` attribute to ``True`` 27667db96d56Sopenharmony_ci on the decorated object. Thus, a check like 27677db96d56Sopenharmony_ci ``if getattr(obj, "__final__", False)`` can be used at runtime 27687db96d56Sopenharmony_ci to determine whether an object ``obj`` has been marked as final. 27697db96d56Sopenharmony_ci If the decorated object does not support setting attributes, 27707db96d56Sopenharmony_ci the decorator returns the object unchanged without raising an exception. 27717db96d56Sopenharmony_ci 27727db96d56Sopenharmony_ci 27737db96d56Sopenharmony_ci.. decorator:: no_type_check 27747db96d56Sopenharmony_ci 27757db96d56Sopenharmony_ci Decorator to indicate that annotations are not type hints. 27767db96d56Sopenharmony_ci 27777db96d56Sopenharmony_ci This works as class or function :term:`decorator`. With a class, it 27787db96d56Sopenharmony_ci applies recursively to all methods and classes defined in that class 27797db96d56Sopenharmony_ci (but not to methods defined in its superclasses or subclasses). 27807db96d56Sopenharmony_ci 27817db96d56Sopenharmony_ci This mutates the function(s) in place. 27827db96d56Sopenharmony_ci 27837db96d56Sopenharmony_ci.. decorator:: no_type_check_decorator 27847db96d56Sopenharmony_ci 27857db96d56Sopenharmony_ci Decorator to give another decorator the :func:`no_type_check` effect. 27867db96d56Sopenharmony_ci 27877db96d56Sopenharmony_ci This wraps the decorator with something that wraps the decorated 27887db96d56Sopenharmony_ci function in :func:`no_type_check`. 27897db96d56Sopenharmony_ci 27907db96d56Sopenharmony_ci.. decorator:: type_check_only 27917db96d56Sopenharmony_ci 27927db96d56Sopenharmony_ci Decorator to mark a class or function to be unavailable at runtime. 27937db96d56Sopenharmony_ci 27947db96d56Sopenharmony_ci This decorator is itself not available at runtime. It is mainly 27957db96d56Sopenharmony_ci intended to mark classes that are defined in type stub files if 27967db96d56Sopenharmony_ci an implementation returns an instance of a private class:: 27977db96d56Sopenharmony_ci 27987db96d56Sopenharmony_ci @type_check_only 27997db96d56Sopenharmony_ci class Response: # private or not available at runtime 28007db96d56Sopenharmony_ci code: int 28017db96d56Sopenharmony_ci def get_header(self, name: str) -> str: ... 28027db96d56Sopenharmony_ci 28037db96d56Sopenharmony_ci def fetch_response() -> Response: ... 28047db96d56Sopenharmony_ci 28057db96d56Sopenharmony_ci Note that returning instances of private classes is not recommended. 28067db96d56Sopenharmony_ci It is usually preferable to make such classes public. 28077db96d56Sopenharmony_ci 28087db96d56Sopenharmony_ciIntrospection helpers 28097db96d56Sopenharmony_ci--------------------- 28107db96d56Sopenharmony_ci 28117db96d56Sopenharmony_ci.. function:: get_type_hints(obj, globalns=None, localns=None, include_extras=False) 28127db96d56Sopenharmony_ci 28137db96d56Sopenharmony_ci Return a dictionary containing type hints for a function, method, module 28147db96d56Sopenharmony_ci or class object. 28157db96d56Sopenharmony_ci 28167db96d56Sopenharmony_ci This is often the same as ``obj.__annotations__``. In addition, 28177db96d56Sopenharmony_ci forward references encoded as string literals are handled by evaluating 28187db96d56Sopenharmony_ci them in ``globals`` and ``locals`` namespaces. For a class ``C``, return 28197db96d56Sopenharmony_ci a dictionary constructed by merging all the ``__annotations__`` along 28207db96d56Sopenharmony_ci ``C.__mro__`` in reverse order. 28217db96d56Sopenharmony_ci 28227db96d56Sopenharmony_ci The function recursively replaces all ``Annotated[T, ...]`` with ``T``, 28237db96d56Sopenharmony_ci unless ``include_extras`` is set to ``True`` (see :class:`Annotated` for 28247db96d56Sopenharmony_ci more information). For example:: 28257db96d56Sopenharmony_ci 28267db96d56Sopenharmony_ci class Student(NamedTuple): 28277db96d56Sopenharmony_ci name: Annotated[str, 'some marker'] 28287db96d56Sopenharmony_ci 28297db96d56Sopenharmony_ci get_type_hints(Student) == {'name': str} 28307db96d56Sopenharmony_ci get_type_hints(Student, include_extras=False) == {'name': str} 28317db96d56Sopenharmony_ci get_type_hints(Student, include_extras=True) == { 28327db96d56Sopenharmony_ci 'name': Annotated[str, 'some marker'] 28337db96d56Sopenharmony_ci } 28347db96d56Sopenharmony_ci 28357db96d56Sopenharmony_ci .. note:: 28367db96d56Sopenharmony_ci 28377db96d56Sopenharmony_ci :func:`get_type_hints` does not work with imported 28387db96d56Sopenharmony_ci :ref:`type aliases <type-aliases>` that include forward references. 28397db96d56Sopenharmony_ci Enabling postponed evaluation of annotations (:pep:`563`) may remove 28407db96d56Sopenharmony_ci the need for most forward references. 28417db96d56Sopenharmony_ci 28427db96d56Sopenharmony_ci .. versionchanged:: 3.9 28437db96d56Sopenharmony_ci Added ``include_extras`` parameter as part of :pep:`593`. 28447db96d56Sopenharmony_ci 28457db96d56Sopenharmony_ci .. versionchanged:: 3.11 28467db96d56Sopenharmony_ci Previously, ``Optional[t]`` was added for function and method annotations 28477db96d56Sopenharmony_ci if a default value equal to ``None`` was set. 28487db96d56Sopenharmony_ci Now the annotation is returned unchanged. 28497db96d56Sopenharmony_ci 28507db96d56Sopenharmony_ci.. function:: get_origin(tp) 28517db96d56Sopenharmony_ci 28527db96d56Sopenharmony_ci Get the unsubscripted version of a type: for a typing object of the form 28537db96d56Sopenharmony_ci ``X[Y, Z, ...]`` return ``X``. If ``X`` is a generic alias for a builtin or 28547db96d56Sopenharmony_ci :mod:`collections` class, it gets normalized to the original class. 28557db96d56Sopenharmony_ci If ``X`` is an instance of :class:`ParamSpecArgs` or :class:`ParamSpecKwargs`, 28567db96d56Sopenharmony_ci return the underlying :class:`ParamSpec`. 28577db96d56Sopenharmony_ci Return ``None`` for unsupported objects. 28587db96d56Sopenharmony_ci Examples:: 28597db96d56Sopenharmony_ci 28607db96d56Sopenharmony_ci assert get_origin(str) is None 28617db96d56Sopenharmony_ci assert get_origin(Dict[str, int]) is dict 28627db96d56Sopenharmony_ci assert get_origin(Union[int, str]) is Union 28637db96d56Sopenharmony_ci P = ParamSpec('P') 28647db96d56Sopenharmony_ci assert get_origin(P.args) is P 28657db96d56Sopenharmony_ci assert get_origin(P.kwargs) is P 28667db96d56Sopenharmony_ci 28677db96d56Sopenharmony_ci .. versionadded:: 3.8 28687db96d56Sopenharmony_ci 28697db96d56Sopenharmony_ci.. function:: get_args(tp) 28707db96d56Sopenharmony_ci 28717db96d56Sopenharmony_ci Get type arguments with all substitutions performed: for a typing object 28727db96d56Sopenharmony_ci of the form ``X[Y, Z, ...]`` return ``(Y, Z, ...)``. 28737db96d56Sopenharmony_ci If ``X`` is a union or :class:`Literal` contained in another 28747db96d56Sopenharmony_ci generic type, the order of ``(Y, Z, ...)`` may be different from the order 28757db96d56Sopenharmony_ci of the original arguments ``[Y, Z, ...]`` due to type caching. 28767db96d56Sopenharmony_ci Return ``()`` for unsupported objects. 28777db96d56Sopenharmony_ci Examples:: 28787db96d56Sopenharmony_ci 28797db96d56Sopenharmony_ci assert get_args(int) == () 28807db96d56Sopenharmony_ci assert get_args(Dict[int, str]) == (int, str) 28817db96d56Sopenharmony_ci assert get_args(Union[int, str]) == (int, str) 28827db96d56Sopenharmony_ci 28837db96d56Sopenharmony_ci .. versionadded:: 3.8 28847db96d56Sopenharmony_ci 28857db96d56Sopenharmony_ci.. function:: is_typeddict(tp) 28867db96d56Sopenharmony_ci 28877db96d56Sopenharmony_ci Check if a type is a :class:`TypedDict`. 28887db96d56Sopenharmony_ci 28897db96d56Sopenharmony_ci For example:: 28907db96d56Sopenharmony_ci 28917db96d56Sopenharmony_ci class Film(TypedDict): 28927db96d56Sopenharmony_ci title: str 28937db96d56Sopenharmony_ci year: int 28947db96d56Sopenharmony_ci 28957db96d56Sopenharmony_ci is_typeddict(Film) # => True 28967db96d56Sopenharmony_ci is_typeddict(list | str) # => False 28977db96d56Sopenharmony_ci 28987db96d56Sopenharmony_ci .. versionadded:: 3.10 28997db96d56Sopenharmony_ci 29007db96d56Sopenharmony_ci.. class:: ForwardRef 29017db96d56Sopenharmony_ci 29027db96d56Sopenharmony_ci A class used for internal typing representation of string forward references. 29037db96d56Sopenharmony_ci For example, ``List["SomeClass"]`` is implicitly transformed into 29047db96d56Sopenharmony_ci ``List[ForwardRef("SomeClass")]``. This class should not be instantiated by 29057db96d56Sopenharmony_ci a user, but may be used by introspection tools. 29067db96d56Sopenharmony_ci 29077db96d56Sopenharmony_ci .. note:: 29087db96d56Sopenharmony_ci :pep:`585` generic types such as ``list["SomeClass"]`` will not be 29097db96d56Sopenharmony_ci implicitly transformed into ``list[ForwardRef("SomeClass")]`` and thus 29107db96d56Sopenharmony_ci will not automatically resolve to ``list[SomeClass]``. 29117db96d56Sopenharmony_ci 29127db96d56Sopenharmony_ci .. versionadded:: 3.7.4 29137db96d56Sopenharmony_ci 29147db96d56Sopenharmony_ciConstant 29157db96d56Sopenharmony_ci-------- 29167db96d56Sopenharmony_ci 29177db96d56Sopenharmony_ci.. data:: TYPE_CHECKING 29187db96d56Sopenharmony_ci 29197db96d56Sopenharmony_ci A special constant that is assumed to be ``True`` by 3rd party static 29207db96d56Sopenharmony_ci type checkers. It is ``False`` at runtime. Usage:: 29217db96d56Sopenharmony_ci 29227db96d56Sopenharmony_ci if TYPE_CHECKING: 29237db96d56Sopenharmony_ci import expensive_mod 29247db96d56Sopenharmony_ci 29257db96d56Sopenharmony_ci def fun(arg: 'expensive_mod.SomeType') -> None: 29267db96d56Sopenharmony_ci local_var: expensive_mod.AnotherType = other_fun() 29277db96d56Sopenharmony_ci 29287db96d56Sopenharmony_ci The first type annotation must be enclosed in quotes, making it a 29297db96d56Sopenharmony_ci "forward reference", to hide the ``expensive_mod`` reference from the 29307db96d56Sopenharmony_ci interpreter runtime. Type annotations for local variables are not 29317db96d56Sopenharmony_ci evaluated, so the second annotation does not need to be enclosed in quotes. 29327db96d56Sopenharmony_ci 29337db96d56Sopenharmony_ci .. note:: 29347db96d56Sopenharmony_ci 29357db96d56Sopenharmony_ci If ``from __future__ import annotations`` is used, 29367db96d56Sopenharmony_ci annotations are not evaluated at function definition time. 29377db96d56Sopenharmony_ci Instead, they are stored as strings in ``__annotations__``. 29387db96d56Sopenharmony_ci This makes it unnecessary to use quotes around the annotation 29397db96d56Sopenharmony_ci (see :pep:`563`). 29407db96d56Sopenharmony_ci 29417db96d56Sopenharmony_ci .. versionadded:: 3.5.2 29427db96d56Sopenharmony_ci 29437db96d56Sopenharmony_ciDeprecation Timeline of Major Features 29447db96d56Sopenharmony_ci====================================== 29457db96d56Sopenharmony_ci 29467db96d56Sopenharmony_ciCertain features in ``typing`` are deprecated and may be removed in a future 29477db96d56Sopenharmony_civersion of Python. The following table summarizes major deprecations for your 29487db96d56Sopenharmony_ciconvenience. This is subject to change, and not all deprecations are listed. 29497db96d56Sopenharmony_ci 29507db96d56Sopenharmony_ci+----------------------------------+---------------+-------------------+----------------+ 29517db96d56Sopenharmony_ci| Feature | Deprecated in | Projected removal | PEP/issue | 29527db96d56Sopenharmony_ci+==================================+===============+===================+================+ 29537db96d56Sopenharmony_ci| ``typing.io`` and ``typing.re`` | 3.8 | 3.13 | :issue:`38291` | 29547db96d56Sopenharmony_ci| submodules | | | | 29557db96d56Sopenharmony_ci+----------------------------------+---------------+-------------------+----------------+ 29567db96d56Sopenharmony_ci| ``typing`` versions of standard | 3.9 | Undecided | :pep:`585` | 29577db96d56Sopenharmony_ci| collections | | | | 29587db96d56Sopenharmony_ci+----------------------------------+---------------+-------------------+----------------+ 29597db96d56Sopenharmony_ci| ``typing.ByteString`` | 3.9 | 3.14 | :gh:`91896` | 29607db96d56Sopenharmony_ci+----------------------------------+---------------+-------------------+----------------+ 29617db96d56Sopenharmony_ci| ``typing.Text`` | 3.11 | Undecided | :gh:`92332` | 29627db96d56Sopenharmony_ci+----------------------------------+---------------+-------------------+----------------+ 2963