17db96d56Sopenharmony_ci""" 27db96d56Sopenharmony_ciThe typing module: Support for gradual typing as defined by PEP 484 and subsequent PEPs. 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ciAny name not present in __all__ is an implementation detail 57db96d56Sopenharmony_cithat may be changed without notice. Use at your own risk! 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ciAmong other things, the module includes the following: 87db96d56Sopenharmony_ci* Generic, Protocol, and internal machinery to support generic aliases. 97db96d56Sopenharmony_ci All subscripted types like X[int], Union[int, str] are generic aliases. 107db96d56Sopenharmony_ci* Various "special forms" that have unique meanings in type annotations: 117db96d56Sopenharmony_ci NoReturn, Never, ClassVar, Self, Concatenate, Unpack, and others. 127db96d56Sopenharmony_ci* Classes whose instances can be type arguments to generic classes and functions: 137db96d56Sopenharmony_ci TypeVar, ParamSpec, TypeVarTuple. 147db96d56Sopenharmony_ci* Public helper functions: get_type_hints, overload, cast, final, and others. 157db96d56Sopenharmony_ci* Several protocols to support duck-typing: 167db96d56Sopenharmony_ci SupportsFloat, SupportsIndex, SupportsAbs, and others. 177db96d56Sopenharmony_ci* Special types: NewType, NamedTuple, TypedDict. 187db96d56Sopenharmony_ci* Deprecated wrapper submodules for re and io related types. 197db96d56Sopenharmony_ci* Deprecated aliases for builtin types and collections.abc ABCs. 207db96d56Sopenharmony_ci""" 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_cifrom abc import abstractmethod, ABCMeta 237db96d56Sopenharmony_ciimport collections 247db96d56Sopenharmony_cifrom collections import defaultdict 257db96d56Sopenharmony_ciimport collections.abc 267db96d56Sopenharmony_ciimport contextlib 277db96d56Sopenharmony_ciimport functools 287db96d56Sopenharmony_ciimport operator 297db96d56Sopenharmony_ciimport re as stdlib_re # Avoid confusion with the re we export. 307db96d56Sopenharmony_ciimport sys 317db96d56Sopenharmony_ciimport types 327db96d56Sopenharmony_ciimport warnings 337db96d56Sopenharmony_cifrom types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType, GenericAlias 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_citry: 377db96d56Sopenharmony_ci from _typing import _idfunc 387db96d56Sopenharmony_ciexcept ImportError: 397db96d56Sopenharmony_ci def _idfunc(_, x): 407db96d56Sopenharmony_ci return x 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci# Please keep __all__ alphabetized within each category. 437db96d56Sopenharmony_ci__all__ = [ 447db96d56Sopenharmony_ci # Super-special typing primitives. 457db96d56Sopenharmony_ci 'Annotated', 467db96d56Sopenharmony_ci 'Any', 477db96d56Sopenharmony_ci 'Callable', 487db96d56Sopenharmony_ci 'ClassVar', 497db96d56Sopenharmony_ci 'Concatenate', 507db96d56Sopenharmony_ci 'Final', 517db96d56Sopenharmony_ci 'ForwardRef', 527db96d56Sopenharmony_ci 'Generic', 537db96d56Sopenharmony_ci 'Literal', 547db96d56Sopenharmony_ci 'Optional', 557db96d56Sopenharmony_ci 'ParamSpec', 567db96d56Sopenharmony_ci 'Protocol', 577db96d56Sopenharmony_ci 'Tuple', 587db96d56Sopenharmony_ci 'Type', 597db96d56Sopenharmony_ci 'TypeVar', 607db96d56Sopenharmony_ci 'TypeVarTuple', 617db96d56Sopenharmony_ci 'Union', 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci # ABCs (from collections.abc). 647db96d56Sopenharmony_ci 'AbstractSet', # collections.abc.Set. 657db96d56Sopenharmony_ci 'ByteString', 667db96d56Sopenharmony_ci 'Container', 677db96d56Sopenharmony_ci 'ContextManager', 687db96d56Sopenharmony_ci 'Hashable', 697db96d56Sopenharmony_ci 'ItemsView', 707db96d56Sopenharmony_ci 'Iterable', 717db96d56Sopenharmony_ci 'Iterator', 727db96d56Sopenharmony_ci 'KeysView', 737db96d56Sopenharmony_ci 'Mapping', 747db96d56Sopenharmony_ci 'MappingView', 757db96d56Sopenharmony_ci 'MutableMapping', 767db96d56Sopenharmony_ci 'MutableSequence', 777db96d56Sopenharmony_ci 'MutableSet', 787db96d56Sopenharmony_ci 'Sequence', 797db96d56Sopenharmony_ci 'Sized', 807db96d56Sopenharmony_ci 'ValuesView', 817db96d56Sopenharmony_ci 'Awaitable', 827db96d56Sopenharmony_ci 'AsyncIterator', 837db96d56Sopenharmony_ci 'AsyncIterable', 847db96d56Sopenharmony_ci 'Coroutine', 857db96d56Sopenharmony_ci 'Collection', 867db96d56Sopenharmony_ci 'AsyncGenerator', 877db96d56Sopenharmony_ci 'AsyncContextManager', 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci # Structural checks, a.k.a. protocols. 907db96d56Sopenharmony_ci 'Reversible', 917db96d56Sopenharmony_ci 'SupportsAbs', 927db96d56Sopenharmony_ci 'SupportsBytes', 937db96d56Sopenharmony_ci 'SupportsComplex', 947db96d56Sopenharmony_ci 'SupportsFloat', 957db96d56Sopenharmony_ci 'SupportsIndex', 967db96d56Sopenharmony_ci 'SupportsInt', 977db96d56Sopenharmony_ci 'SupportsRound', 987db96d56Sopenharmony_ci 997db96d56Sopenharmony_ci # Concrete collection types. 1007db96d56Sopenharmony_ci 'ChainMap', 1017db96d56Sopenharmony_ci 'Counter', 1027db96d56Sopenharmony_ci 'Deque', 1037db96d56Sopenharmony_ci 'Dict', 1047db96d56Sopenharmony_ci 'DefaultDict', 1057db96d56Sopenharmony_ci 'List', 1067db96d56Sopenharmony_ci 'OrderedDict', 1077db96d56Sopenharmony_ci 'Set', 1087db96d56Sopenharmony_ci 'FrozenSet', 1097db96d56Sopenharmony_ci 'NamedTuple', # Not really a type. 1107db96d56Sopenharmony_ci 'TypedDict', # Not really a type. 1117db96d56Sopenharmony_ci 'Generator', 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci # Other concrete types. 1147db96d56Sopenharmony_ci 'BinaryIO', 1157db96d56Sopenharmony_ci 'IO', 1167db96d56Sopenharmony_ci 'Match', 1177db96d56Sopenharmony_ci 'Pattern', 1187db96d56Sopenharmony_ci 'TextIO', 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ci # One-off things. 1217db96d56Sopenharmony_ci 'AnyStr', 1227db96d56Sopenharmony_ci 'assert_type', 1237db96d56Sopenharmony_ci 'assert_never', 1247db96d56Sopenharmony_ci 'cast', 1257db96d56Sopenharmony_ci 'clear_overloads', 1267db96d56Sopenharmony_ci 'dataclass_transform', 1277db96d56Sopenharmony_ci 'final', 1287db96d56Sopenharmony_ci 'get_args', 1297db96d56Sopenharmony_ci 'get_origin', 1307db96d56Sopenharmony_ci 'get_overloads', 1317db96d56Sopenharmony_ci 'get_type_hints', 1327db96d56Sopenharmony_ci 'is_typeddict', 1337db96d56Sopenharmony_ci 'LiteralString', 1347db96d56Sopenharmony_ci 'Never', 1357db96d56Sopenharmony_ci 'NewType', 1367db96d56Sopenharmony_ci 'no_type_check', 1377db96d56Sopenharmony_ci 'no_type_check_decorator', 1387db96d56Sopenharmony_ci 'NoReturn', 1397db96d56Sopenharmony_ci 'NotRequired', 1407db96d56Sopenharmony_ci 'overload', 1417db96d56Sopenharmony_ci 'ParamSpecArgs', 1427db96d56Sopenharmony_ci 'ParamSpecKwargs', 1437db96d56Sopenharmony_ci 'Required', 1447db96d56Sopenharmony_ci 'reveal_type', 1457db96d56Sopenharmony_ci 'runtime_checkable', 1467db96d56Sopenharmony_ci 'Self', 1477db96d56Sopenharmony_ci 'Text', 1487db96d56Sopenharmony_ci 'TYPE_CHECKING', 1497db96d56Sopenharmony_ci 'TypeAlias', 1507db96d56Sopenharmony_ci 'TypeGuard', 1517db96d56Sopenharmony_ci 'Unpack', 1527db96d56Sopenharmony_ci] 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_ci# The pseudo-submodules 're' and 'io' are part of the public 1557db96d56Sopenharmony_ci# namespace, but excluded from __all__ because they might stomp on 1567db96d56Sopenharmony_ci# legitimate imports of those modules. 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci 1597db96d56Sopenharmony_cidef _type_convert(arg, module=None, *, allow_special_forms=False): 1607db96d56Sopenharmony_ci """For converting None to type(None), and strings to ForwardRef.""" 1617db96d56Sopenharmony_ci if arg is None: 1627db96d56Sopenharmony_ci return type(None) 1637db96d56Sopenharmony_ci if isinstance(arg, str): 1647db96d56Sopenharmony_ci return ForwardRef(arg, module=module, is_class=allow_special_forms) 1657db96d56Sopenharmony_ci return arg 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_cidef _type_check(arg, msg, is_argument=True, module=None, *, allow_special_forms=False): 1697db96d56Sopenharmony_ci """Check that the argument is a type, and return it (internal helper). 1707db96d56Sopenharmony_ci 1717db96d56Sopenharmony_ci As a special case, accept None and return type(None) instead. Also wrap strings 1727db96d56Sopenharmony_ci into ForwardRef instances. Consider several corner cases, for example plain 1737db96d56Sopenharmony_ci special forms like Union are not valid, while Union[int, str] is OK, etc. 1747db96d56Sopenharmony_ci The msg argument is a human-readable error message, e.g.:: 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci "Union[arg, ...]: arg should be a type." 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ci We append the repr() of the actual value (truncated to 100 chars). 1797db96d56Sopenharmony_ci """ 1807db96d56Sopenharmony_ci invalid_generic_forms = (Generic, Protocol) 1817db96d56Sopenharmony_ci if not allow_special_forms: 1827db96d56Sopenharmony_ci invalid_generic_forms += (ClassVar,) 1837db96d56Sopenharmony_ci if is_argument: 1847db96d56Sopenharmony_ci invalid_generic_forms += (Final,) 1857db96d56Sopenharmony_ci 1867db96d56Sopenharmony_ci arg = _type_convert(arg, module=module, allow_special_forms=allow_special_forms) 1877db96d56Sopenharmony_ci if (isinstance(arg, _GenericAlias) and 1887db96d56Sopenharmony_ci arg.__origin__ in invalid_generic_forms): 1897db96d56Sopenharmony_ci raise TypeError(f"{arg} is not valid as type argument") 1907db96d56Sopenharmony_ci if arg in (Any, LiteralString, NoReturn, Never, Self, TypeAlias): 1917db96d56Sopenharmony_ci return arg 1927db96d56Sopenharmony_ci if allow_special_forms and arg in (ClassVar, Final): 1937db96d56Sopenharmony_ci return arg 1947db96d56Sopenharmony_ci if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol): 1957db96d56Sopenharmony_ci raise TypeError(f"Plain {arg} is not valid as type argument") 1967db96d56Sopenharmony_ci if type(arg) is tuple: 1977db96d56Sopenharmony_ci raise TypeError(f"{msg} Got {arg!r:.100}.") 1987db96d56Sopenharmony_ci return arg 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci 2017db96d56Sopenharmony_cidef _is_param_expr(arg): 2027db96d56Sopenharmony_ci return arg is ... or isinstance(arg, 2037db96d56Sopenharmony_ci (tuple, list, ParamSpec, _ConcatenateGenericAlias)) 2047db96d56Sopenharmony_ci 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_cidef _should_unflatten_callable_args(typ, args): 2077db96d56Sopenharmony_ci """Internal helper for munging collections.abc.Callable's __args__. 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci The canonical representation for a Callable's __args__ flattens the 2107db96d56Sopenharmony_ci argument types, see https://bugs.python.org/issue42195. For example:: 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_ci collections.abc.Callable[[int, int], str].__args__ == (int, int, str) 2137db96d56Sopenharmony_ci collections.abc.Callable[ParamSpec, str].__args__ == (ParamSpec, str) 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci As a result, if we need to reconstruct the Callable from its __args__, 2167db96d56Sopenharmony_ci we need to unflatten it. 2177db96d56Sopenharmony_ci """ 2187db96d56Sopenharmony_ci return ( 2197db96d56Sopenharmony_ci typ.__origin__ is collections.abc.Callable 2207db96d56Sopenharmony_ci and not (len(args) == 2 and _is_param_expr(args[0])) 2217db96d56Sopenharmony_ci ) 2227db96d56Sopenharmony_ci 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_cidef _type_repr(obj): 2257db96d56Sopenharmony_ci """Return the repr() of an object, special-casing types (internal helper). 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci If obj is a type, we return a shorter version than the default 2287db96d56Sopenharmony_ci type.__repr__, based on the module and qualified name, which is 2297db96d56Sopenharmony_ci typically enough to uniquely identify a type. For everything 2307db96d56Sopenharmony_ci else, we fall back on repr(obj). 2317db96d56Sopenharmony_ci """ 2327db96d56Sopenharmony_ci if isinstance(obj, types.GenericAlias): 2337db96d56Sopenharmony_ci return repr(obj) 2347db96d56Sopenharmony_ci if isinstance(obj, type): 2357db96d56Sopenharmony_ci if obj.__module__ == 'builtins': 2367db96d56Sopenharmony_ci return obj.__qualname__ 2377db96d56Sopenharmony_ci return f'{obj.__module__}.{obj.__qualname__}' 2387db96d56Sopenharmony_ci if obj is ...: 2397db96d56Sopenharmony_ci return('...') 2407db96d56Sopenharmony_ci if isinstance(obj, types.FunctionType): 2417db96d56Sopenharmony_ci return obj.__name__ 2427db96d56Sopenharmony_ci return repr(obj) 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_ci 2457db96d56Sopenharmony_cidef _collect_parameters(args): 2467db96d56Sopenharmony_ci """Collect all type variables and parameter specifications in args 2477db96d56Sopenharmony_ci in order of first appearance (lexicographic order). 2487db96d56Sopenharmony_ci 2497db96d56Sopenharmony_ci For example:: 2507db96d56Sopenharmony_ci 2517db96d56Sopenharmony_ci assert _collect_parameters((T, Callable[P, T])) == (T, P) 2527db96d56Sopenharmony_ci """ 2537db96d56Sopenharmony_ci parameters = [] 2547db96d56Sopenharmony_ci for t in args: 2557db96d56Sopenharmony_ci if isinstance(t, type): 2567db96d56Sopenharmony_ci # We don't want __parameters__ descriptor of a bare Python class. 2577db96d56Sopenharmony_ci pass 2587db96d56Sopenharmony_ci elif isinstance(t, tuple): 2597db96d56Sopenharmony_ci # `t` might be a tuple, when `ParamSpec` is substituted with 2607db96d56Sopenharmony_ci # `[T, int]`, or `[int, *Ts]`, etc. 2617db96d56Sopenharmony_ci for x in t: 2627db96d56Sopenharmony_ci for collected in _collect_parameters([x]): 2637db96d56Sopenharmony_ci if collected not in parameters: 2647db96d56Sopenharmony_ci parameters.append(collected) 2657db96d56Sopenharmony_ci elif hasattr(t, '__typing_subst__'): 2667db96d56Sopenharmony_ci if t not in parameters: 2677db96d56Sopenharmony_ci parameters.append(t) 2687db96d56Sopenharmony_ci else: 2697db96d56Sopenharmony_ci for x in getattr(t, '__parameters__', ()): 2707db96d56Sopenharmony_ci if x not in parameters: 2717db96d56Sopenharmony_ci parameters.append(x) 2727db96d56Sopenharmony_ci return tuple(parameters) 2737db96d56Sopenharmony_ci 2747db96d56Sopenharmony_ci 2757db96d56Sopenharmony_cidef _check_generic(cls, parameters, elen): 2767db96d56Sopenharmony_ci """Check correct count for parameters of a generic cls (internal helper). 2777db96d56Sopenharmony_ci 2787db96d56Sopenharmony_ci This gives a nice error message in case of count mismatch. 2797db96d56Sopenharmony_ci """ 2807db96d56Sopenharmony_ci if not elen: 2817db96d56Sopenharmony_ci raise TypeError(f"{cls} is not a generic class") 2827db96d56Sopenharmony_ci alen = len(parameters) 2837db96d56Sopenharmony_ci if alen != elen: 2847db96d56Sopenharmony_ci raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments for {cls};" 2857db96d56Sopenharmony_ci f" actual {alen}, expected {elen}") 2867db96d56Sopenharmony_ci 2877db96d56Sopenharmony_cidef _unpack_args(args): 2887db96d56Sopenharmony_ci newargs = [] 2897db96d56Sopenharmony_ci for arg in args: 2907db96d56Sopenharmony_ci subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) 2917db96d56Sopenharmony_ci if subargs is not None and not (subargs and subargs[-1] is ...): 2927db96d56Sopenharmony_ci newargs.extend(subargs) 2937db96d56Sopenharmony_ci else: 2947db96d56Sopenharmony_ci newargs.append(arg) 2957db96d56Sopenharmony_ci return newargs 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_cidef _deduplicate(params): 2987db96d56Sopenharmony_ci # Weed out strict duplicates, preserving the first of each occurrence. 2997db96d56Sopenharmony_ci all_params = set(params) 3007db96d56Sopenharmony_ci if len(all_params) < len(params): 3017db96d56Sopenharmony_ci new_params = [] 3027db96d56Sopenharmony_ci for t in params: 3037db96d56Sopenharmony_ci if t in all_params: 3047db96d56Sopenharmony_ci new_params.append(t) 3057db96d56Sopenharmony_ci all_params.remove(t) 3067db96d56Sopenharmony_ci params = new_params 3077db96d56Sopenharmony_ci assert not all_params, all_params 3087db96d56Sopenharmony_ci return params 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci 3117db96d56Sopenharmony_cidef _remove_dups_flatten(parameters): 3127db96d56Sopenharmony_ci """Internal helper for Union creation and substitution. 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci Flatten Unions among parameters, then remove duplicates. 3157db96d56Sopenharmony_ci """ 3167db96d56Sopenharmony_ci # Flatten out Union[Union[...], ...]. 3177db96d56Sopenharmony_ci params = [] 3187db96d56Sopenharmony_ci for p in parameters: 3197db96d56Sopenharmony_ci if isinstance(p, (_UnionGenericAlias, types.UnionType)): 3207db96d56Sopenharmony_ci params.extend(p.__args__) 3217db96d56Sopenharmony_ci else: 3227db96d56Sopenharmony_ci params.append(p) 3237db96d56Sopenharmony_ci 3247db96d56Sopenharmony_ci return tuple(_deduplicate(params)) 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci 3277db96d56Sopenharmony_cidef _flatten_literal_params(parameters): 3287db96d56Sopenharmony_ci """Internal helper for Literal creation: flatten Literals among parameters.""" 3297db96d56Sopenharmony_ci params = [] 3307db96d56Sopenharmony_ci for p in parameters: 3317db96d56Sopenharmony_ci if isinstance(p, _LiteralGenericAlias): 3327db96d56Sopenharmony_ci params.extend(p.__args__) 3337db96d56Sopenharmony_ci else: 3347db96d56Sopenharmony_ci params.append(p) 3357db96d56Sopenharmony_ci return tuple(params) 3367db96d56Sopenharmony_ci 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci_cleanups = [] 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci 3417db96d56Sopenharmony_cidef _tp_cache(func=None, /, *, typed=False): 3427db96d56Sopenharmony_ci """Internal wrapper caching __getitem__ of generic types with a fallback to 3437db96d56Sopenharmony_ci original function for non-hashable arguments. 3447db96d56Sopenharmony_ci """ 3457db96d56Sopenharmony_ci def decorator(func): 3467db96d56Sopenharmony_ci cached = functools.lru_cache(typed=typed)(func) 3477db96d56Sopenharmony_ci _cleanups.append(cached.cache_clear) 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci @functools.wraps(func) 3507db96d56Sopenharmony_ci def inner(*args, **kwds): 3517db96d56Sopenharmony_ci try: 3527db96d56Sopenharmony_ci return cached(*args, **kwds) 3537db96d56Sopenharmony_ci except TypeError: 3547db96d56Sopenharmony_ci pass # All real errors (not unhashable args) are raised below. 3557db96d56Sopenharmony_ci return func(*args, **kwds) 3567db96d56Sopenharmony_ci return inner 3577db96d56Sopenharmony_ci 3587db96d56Sopenharmony_ci if func is not None: 3597db96d56Sopenharmony_ci return decorator(func) 3607db96d56Sopenharmony_ci 3617db96d56Sopenharmony_ci return decorator 3627db96d56Sopenharmony_ci 3637db96d56Sopenharmony_cidef _eval_type(t, globalns, localns, recursive_guard=frozenset()): 3647db96d56Sopenharmony_ci """Evaluate all forward references in the given type t. 3657db96d56Sopenharmony_ci 3667db96d56Sopenharmony_ci For use of globalns and localns see the docstring for get_type_hints(). 3677db96d56Sopenharmony_ci recursive_guard is used to prevent infinite recursion with a recursive 3687db96d56Sopenharmony_ci ForwardRef. 3697db96d56Sopenharmony_ci """ 3707db96d56Sopenharmony_ci if isinstance(t, ForwardRef): 3717db96d56Sopenharmony_ci return t._evaluate(globalns, localns, recursive_guard) 3727db96d56Sopenharmony_ci if isinstance(t, (_GenericAlias, GenericAlias, types.UnionType)): 3737db96d56Sopenharmony_ci if isinstance(t, GenericAlias): 3747db96d56Sopenharmony_ci args = tuple( 3757db96d56Sopenharmony_ci ForwardRef(arg) if isinstance(arg, str) else arg 3767db96d56Sopenharmony_ci for arg in t.__args__ 3777db96d56Sopenharmony_ci ) 3787db96d56Sopenharmony_ci is_unpacked = t.__unpacked__ 3797db96d56Sopenharmony_ci if _should_unflatten_callable_args(t, args): 3807db96d56Sopenharmony_ci t = t.__origin__[(args[:-1], args[-1])] 3817db96d56Sopenharmony_ci else: 3827db96d56Sopenharmony_ci t = t.__origin__[args] 3837db96d56Sopenharmony_ci if is_unpacked: 3847db96d56Sopenharmony_ci t = Unpack[t] 3857db96d56Sopenharmony_ci ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__) 3867db96d56Sopenharmony_ci if ev_args == t.__args__: 3877db96d56Sopenharmony_ci return t 3887db96d56Sopenharmony_ci if isinstance(t, GenericAlias): 3897db96d56Sopenharmony_ci return GenericAlias(t.__origin__, ev_args) 3907db96d56Sopenharmony_ci if isinstance(t, types.UnionType): 3917db96d56Sopenharmony_ci return functools.reduce(operator.or_, ev_args) 3927db96d56Sopenharmony_ci else: 3937db96d56Sopenharmony_ci return t.copy_with(ev_args) 3947db96d56Sopenharmony_ci return t 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci 3977db96d56Sopenharmony_ciclass _Final: 3987db96d56Sopenharmony_ci """Mixin to prohibit subclassing.""" 3997db96d56Sopenharmony_ci 4007db96d56Sopenharmony_ci __slots__ = ('__weakref__',) 4017db96d56Sopenharmony_ci 4027db96d56Sopenharmony_ci def __init_subclass__(cls, /, *args, **kwds): 4037db96d56Sopenharmony_ci if '_root' not in kwds: 4047db96d56Sopenharmony_ci raise TypeError("Cannot subclass special typing classes") 4057db96d56Sopenharmony_ci 4067db96d56Sopenharmony_ciclass _Immutable: 4077db96d56Sopenharmony_ci """Mixin to indicate that object should not be copied.""" 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci __slots__ = () 4107db96d56Sopenharmony_ci 4117db96d56Sopenharmony_ci def __copy__(self): 4127db96d56Sopenharmony_ci return self 4137db96d56Sopenharmony_ci 4147db96d56Sopenharmony_ci def __deepcopy__(self, memo): 4157db96d56Sopenharmony_ci return self 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ci 4187db96d56Sopenharmony_ciclass _NotIterable: 4197db96d56Sopenharmony_ci """Mixin to prevent iteration, without being compatible with Iterable. 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_ci That is, we could do:: 4227db96d56Sopenharmony_ci 4237db96d56Sopenharmony_ci def __iter__(self): raise TypeError() 4247db96d56Sopenharmony_ci 4257db96d56Sopenharmony_ci But this would make users of this mixin duck type-compatible with 4267db96d56Sopenharmony_ci collections.abc.Iterable - isinstance(foo, Iterable) would be True. 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci Luckily, we can instead prevent iteration by setting __iter__ to None, which 4297db96d56Sopenharmony_ci is treated specially. 4307db96d56Sopenharmony_ci """ 4317db96d56Sopenharmony_ci 4327db96d56Sopenharmony_ci __slots__ = () 4337db96d56Sopenharmony_ci __iter__ = None 4347db96d56Sopenharmony_ci 4357db96d56Sopenharmony_ci 4367db96d56Sopenharmony_ci# Internal indicator of special typing constructs. 4377db96d56Sopenharmony_ci# See __doc__ instance attribute for specific docs. 4387db96d56Sopenharmony_ciclass _SpecialForm(_Final, _NotIterable, _root=True): 4397db96d56Sopenharmony_ci __slots__ = ('_name', '__doc__', '_getitem') 4407db96d56Sopenharmony_ci 4417db96d56Sopenharmony_ci def __init__(self, getitem): 4427db96d56Sopenharmony_ci self._getitem = getitem 4437db96d56Sopenharmony_ci self._name = getitem.__name__ 4447db96d56Sopenharmony_ci self.__doc__ = getitem.__doc__ 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ci def __getattr__(self, item): 4477db96d56Sopenharmony_ci if item in {'__name__', '__qualname__'}: 4487db96d56Sopenharmony_ci return self._name 4497db96d56Sopenharmony_ci 4507db96d56Sopenharmony_ci raise AttributeError(item) 4517db96d56Sopenharmony_ci 4527db96d56Sopenharmony_ci def __mro_entries__(self, bases): 4537db96d56Sopenharmony_ci raise TypeError(f"Cannot subclass {self!r}") 4547db96d56Sopenharmony_ci 4557db96d56Sopenharmony_ci def __repr__(self): 4567db96d56Sopenharmony_ci return 'typing.' + self._name 4577db96d56Sopenharmony_ci 4587db96d56Sopenharmony_ci def __reduce__(self): 4597db96d56Sopenharmony_ci return self._name 4607db96d56Sopenharmony_ci 4617db96d56Sopenharmony_ci def __call__(self, *args, **kwds): 4627db96d56Sopenharmony_ci raise TypeError(f"Cannot instantiate {self!r}") 4637db96d56Sopenharmony_ci 4647db96d56Sopenharmony_ci def __or__(self, other): 4657db96d56Sopenharmony_ci return Union[self, other] 4667db96d56Sopenharmony_ci 4677db96d56Sopenharmony_ci def __ror__(self, other): 4687db96d56Sopenharmony_ci return Union[other, self] 4697db96d56Sopenharmony_ci 4707db96d56Sopenharmony_ci def __instancecheck__(self, obj): 4717db96d56Sopenharmony_ci raise TypeError(f"{self} cannot be used with isinstance()") 4727db96d56Sopenharmony_ci 4737db96d56Sopenharmony_ci def __subclasscheck__(self, cls): 4747db96d56Sopenharmony_ci raise TypeError(f"{self} cannot be used with issubclass()") 4757db96d56Sopenharmony_ci 4767db96d56Sopenharmony_ci @_tp_cache 4777db96d56Sopenharmony_ci def __getitem__(self, parameters): 4787db96d56Sopenharmony_ci return self._getitem(self, parameters) 4797db96d56Sopenharmony_ci 4807db96d56Sopenharmony_ci 4817db96d56Sopenharmony_ciclass _LiteralSpecialForm(_SpecialForm, _root=True): 4827db96d56Sopenharmony_ci def __getitem__(self, parameters): 4837db96d56Sopenharmony_ci if not isinstance(parameters, tuple): 4847db96d56Sopenharmony_ci parameters = (parameters,) 4857db96d56Sopenharmony_ci return self._getitem(self, *parameters) 4867db96d56Sopenharmony_ci 4877db96d56Sopenharmony_ci 4887db96d56Sopenharmony_ciclass _AnyMeta(type): 4897db96d56Sopenharmony_ci def __instancecheck__(self, obj): 4907db96d56Sopenharmony_ci if self is Any: 4917db96d56Sopenharmony_ci raise TypeError("typing.Any cannot be used with isinstance()") 4927db96d56Sopenharmony_ci return super().__instancecheck__(obj) 4937db96d56Sopenharmony_ci 4947db96d56Sopenharmony_ci def __repr__(self): 4957db96d56Sopenharmony_ci if self is Any: 4967db96d56Sopenharmony_ci return "typing.Any" 4977db96d56Sopenharmony_ci return super().__repr__() # respect to subclasses 4987db96d56Sopenharmony_ci 4997db96d56Sopenharmony_ci 5007db96d56Sopenharmony_ciclass Any(metaclass=_AnyMeta): 5017db96d56Sopenharmony_ci """Special type indicating an unconstrained type. 5027db96d56Sopenharmony_ci 5037db96d56Sopenharmony_ci - Any is compatible with every type. 5047db96d56Sopenharmony_ci - Any assumed to have all methods. 5057db96d56Sopenharmony_ci - All values assumed to be instances of Any. 5067db96d56Sopenharmony_ci 5077db96d56Sopenharmony_ci Note that all the above statements are true from the point of view of 5087db96d56Sopenharmony_ci static type checkers. At runtime, Any should not be used with instance 5097db96d56Sopenharmony_ci checks. 5107db96d56Sopenharmony_ci """ 5117db96d56Sopenharmony_ci 5127db96d56Sopenharmony_ci def __new__(cls, *args, **kwargs): 5137db96d56Sopenharmony_ci if cls is Any: 5147db96d56Sopenharmony_ci raise TypeError("Any cannot be instantiated") 5157db96d56Sopenharmony_ci return super().__new__(cls, *args, **kwargs) 5167db96d56Sopenharmony_ci 5177db96d56Sopenharmony_ci 5187db96d56Sopenharmony_ci@_SpecialForm 5197db96d56Sopenharmony_cidef NoReturn(self, parameters): 5207db96d56Sopenharmony_ci """Special type indicating functions that never return. 5217db96d56Sopenharmony_ci 5227db96d56Sopenharmony_ci Example:: 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ci from typing import NoReturn 5257db96d56Sopenharmony_ci 5267db96d56Sopenharmony_ci def stop() -> NoReturn: 5277db96d56Sopenharmony_ci raise Exception('no way') 5287db96d56Sopenharmony_ci 5297db96d56Sopenharmony_ci NoReturn can also be used as a bottom type, a type that 5307db96d56Sopenharmony_ci has no values. Starting in Python 3.11, the Never type should 5317db96d56Sopenharmony_ci be used for this concept instead. Type checkers should treat the two 5327db96d56Sopenharmony_ci equivalently. 5337db96d56Sopenharmony_ci """ 5347db96d56Sopenharmony_ci raise TypeError(f"{self} is not subscriptable") 5357db96d56Sopenharmony_ci 5367db96d56Sopenharmony_ci# This is semantically identical to NoReturn, but it is implemented 5377db96d56Sopenharmony_ci# separately so that type checkers can distinguish between the two 5387db96d56Sopenharmony_ci# if they want. 5397db96d56Sopenharmony_ci@_SpecialForm 5407db96d56Sopenharmony_cidef Never(self, parameters): 5417db96d56Sopenharmony_ci """The bottom type, a type that has no members. 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ci This can be used to define a function that should never be 5447db96d56Sopenharmony_ci called, or a function that never returns:: 5457db96d56Sopenharmony_ci 5467db96d56Sopenharmony_ci from typing import Never 5477db96d56Sopenharmony_ci 5487db96d56Sopenharmony_ci def never_call_me(arg: Never) -> None: 5497db96d56Sopenharmony_ci pass 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_ci def int_or_str(arg: int | str) -> None: 5527db96d56Sopenharmony_ci never_call_me(arg) # type checker error 5537db96d56Sopenharmony_ci match arg: 5547db96d56Sopenharmony_ci case int(): 5557db96d56Sopenharmony_ci print("It's an int") 5567db96d56Sopenharmony_ci case str(): 5577db96d56Sopenharmony_ci print("It's a str") 5587db96d56Sopenharmony_ci case _: 5597db96d56Sopenharmony_ci never_call_me(arg) # ok, arg is of type Never 5607db96d56Sopenharmony_ci """ 5617db96d56Sopenharmony_ci raise TypeError(f"{self} is not subscriptable") 5627db96d56Sopenharmony_ci 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci@_SpecialForm 5657db96d56Sopenharmony_cidef Self(self, parameters): 5667db96d56Sopenharmony_ci """Used to spell the type of "self" in classes. 5677db96d56Sopenharmony_ci 5687db96d56Sopenharmony_ci Example:: 5697db96d56Sopenharmony_ci 5707db96d56Sopenharmony_ci from typing import Self 5717db96d56Sopenharmony_ci 5727db96d56Sopenharmony_ci class Foo: 5737db96d56Sopenharmony_ci def return_self(self) -> Self: 5747db96d56Sopenharmony_ci ... 5757db96d56Sopenharmony_ci return self 5767db96d56Sopenharmony_ci 5777db96d56Sopenharmony_ci This is especially useful for: 5787db96d56Sopenharmony_ci - classmethods that are used as alternative constructors 5797db96d56Sopenharmony_ci - annotating an `__enter__` method which returns self 5807db96d56Sopenharmony_ci """ 5817db96d56Sopenharmony_ci raise TypeError(f"{self} is not subscriptable") 5827db96d56Sopenharmony_ci 5837db96d56Sopenharmony_ci 5847db96d56Sopenharmony_ci@_SpecialForm 5857db96d56Sopenharmony_cidef LiteralString(self, parameters): 5867db96d56Sopenharmony_ci """Represents an arbitrary literal string. 5877db96d56Sopenharmony_ci 5887db96d56Sopenharmony_ci Example:: 5897db96d56Sopenharmony_ci 5907db96d56Sopenharmony_ci from typing import LiteralString 5917db96d56Sopenharmony_ci 5927db96d56Sopenharmony_ci def run_query(sql: LiteralString) -> ... 5937db96d56Sopenharmony_ci ... 5947db96d56Sopenharmony_ci 5957db96d56Sopenharmony_ci def caller(arbitrary_string: str, literal_string: LiteralString) -> None: 5967db96d56Sopenharmony_ci run_query("SELECT * FROM students") # ok 5977db96d56Sopenharmony_ci run_query(literal_string) # ok 5987db96d56Sopenharmony_ci run_query("SELECT * FROM " + literal_string) # ok 5997db96d56Sopenharmony_ci run_query(arbitrary_string) # type checker error 6007db96d56Sopenharmony_ci run_query( # type checker error 6017db96d56Sopenharmony_ci f"SELECT * FROM students WHERE name = {arbitrary_string}" 6027db96d56Sopenharmony_ci ) 6037db96d56Sopenharmony_ci 6047db96d56Sopenharmony_ci Only string literals and other LiteralStrings are compatible 6057db96d56Sopenharmony_ci with LiteralString. This provides a tool to help prevent 6067db96d56Sopenharmony_ci security issues such as SQL injection. 6077db96d56Sopenharmony_ci """ 6087db96d56Sopenharmony_ci raise TypeError(f"{self} is not subscriptable") 6097db96d56Sopenharmony_ci 6107db96d56Sopenharmony_ci 6117db96d56Sopenharmony_ci@_SpecialForm 6127db96d56Sopenharmony_cidef ClassVar(self, parameters): 6137db96d56Sopenharmony_ci """Special type construct to mark class variables. 6147db96d56Sopenharmony_ci 6157db96d56Sopenharmony_ci An annotation wrapped in ClassVar indicates that a given 6167db96d56Sopenharmony_ci attribute is intended to be used as a class variable and 6177db96d56Sopenharmony_ci should not be set on instances of that class. Usage:: 6187db96d56Sopenharmony_ci 6197db96d56Sopenharmony_ci class Starship: 6207db96d56Sopenharmony_ci stats: ClassVar[Dict[str, int]] = {} # class variable 6217db96d56Sopenharmony_ci damage: int = 10 # instance variable 6227db96d56Sopenharmony_ci 6237db96d56Sopenharmony_ci ClassVar accepts only types and cannot be further subscribed. 6247db96d56Sopenharmony_ci 6257db96d56Sopenharmony_ci Note that ClassVar is not a class itself, and should not 6267db96d56Sopenharmony_ci be used with isinstance() or issubclass(). 6277db96d56Sopenharmony_ci """ 6287db96d56Sopenharmony_ci item = _type_check(parameters, f'{self} accepts only single type.') 6297db96d56Sopenharmony_ci return _GenericAlias(self, (item,)) 6307db96d56Sopenharmony_ci 6317db96d56Sopenharmony_ci@_SpecialForm 6327db96d56Sopenharmony_cidef Final(self, parameters): 6337db96d56Sopenharmony_ci """Special typing construct to indicate final names to type checkers. 6347db96d56Sopenharmony_ci 6357db96d56Sopenharmony_ci A final name cannot be re-assigned or overridden in a subclass. 6367db96d56Sopenharmony_ci 6377db96d56Sopenharmony_ci For example:: 6387db96d56Sopenharmony_ci 6397db96d56Sopenharmony_ci MAX_SIZE: Final = 9000 6407db96d56Sopenharmony_ci MAX_SIZE += 1 # Error reported by type checker 6417db96d56Sopenharmony_ci 6427db96d56Sopenharmony_ci class Connection: 6437db96d56Sopenharmony_ci TIMEOUT: Final[int] = 10 6447db96d56Sopenharmony_ci 6457db96d56Sopenharmony_ci class FastConnector(Connection): 6467db96d56Sopenharmony_ci TIMEOUT = 1 # Error reported by type checker 6477db96d56Sopenharmony_ci 6487db96d56Sopenharmony_ci There is no runtime checking of these properties. 6497db96d56Sopenharmony_ci """ 6507db96d56Sopenharmony_ci item = _type_check(parameters, f'{self} accepts only single type.') 6517db96d56Sopenharmony_ci return _GenericAlias(self, (item,)) 6527db96d56Sopenharmony_ci 6537db96d56Sopenharmony_ci@_SpecialForm 6547db96d56Sopenharmony_cidef Union(self, parameters): 6557db96d56Sopenharmony_ci """Union type; Union[X, Y] means either X or Y. 6567db96d56Sopenharmony_ci 6577db96d56Sopenharmony_ci On Python 3.10 and higher, the | operator 6587db96d56Sopenharmony_ci can also be used to denote unions; 6597db96d56Sopenharmony_ci X | Y means the same thing to the type checker as Union[X, Y]. 6607db96d56Sopenharmony_ci 6617db96d56Sopenharmony_ci To define a union, use e.g. Union[int, str]. Details: 6627db96d56Sopenharmony_ci - The arguments must be types and there must be at least one. 6637db96d56Sopenharmony_ci - None as an argument is a special case and is replaced by 6647db96d56Sopenharmony_ci type(None). 6657db96d56Sopenharmony_ci - Unions of unions are flattened, e.g.:: 6667db96d56Sopenharmony_ci 6677db96d56Sopenharmony_ci assert Union[Union[int, str], float] == Union[int, str, float] 6687db96d56Sopenharmony_ci 6697db96d56Sopenharmony_ci - Unions of a single argument vanish, e.g.:: 6707db96d56Sopenharmony_ci 6717db96d56Sopenharmony_ci assert Union[int] == int # The constructor actually returns int 6727db96d56Sopenharmony_ci 6737db96d56Sopenharmony_ci - Redundant arguments are skipped, e.g.:: 6747db96d56Sopenharmony_ci 6757db96d56Sopenharmony_ci assert Union[int, str, int] == Union[int, str] 6767db96d56Sopenharmony_ci 6777db96d56Sopenharmony_ci - When comparing unions, the argument order is ignored, e.g.:: 6787db96d56Sopenharmony_ci 6797db96d56Sopenharmony_ci assert Union[int, str] == Union[str, int] 6807db96d56Sopenharmony_ci 6817db96d56Sopenharmony_ci - You cannot subclass or instantiate a union. 6827db96d56Sopenharmony_ci - You can use Optional[X] as a shorthand for Union[X, None]. 6837db96d56Sopenharmony_ci """ 6847db96d56Sopenharmony_ci if parameters == (): 6857db96d56Sopenharmony_ci raise TypeError("Cannot take a Union of no types.") 6867db96d56Sopenharmony_ci if not isinstance(parameters, tuple): 6877db96d56Sopenharmony_ci parameters = (parameters,) 6887db96d56Sopenharmony_ci msg = "Union[arg, ...]: each arg must be a type." 6897db96d56Sopenharmony_ci parameters = tuple(_type_check(p, msg) for p in parameters) 6907db96d56Sopenharmony_ci parameters = _remove_dups_flatten(parameters) 6917db96d56Sopenharmony_ci if len(parameters) == 1: 6927db96d56Sopenharmony_ci return parameters[0] 6937db96d56Sopenharmony_ci if len(parameters) == 2 and type(None) in parameters: 6947db96d56Sopenharmony_ci return _UnionGenericAlias(self, parameters, name="Optional") 6957db96d56Sopenharmony_ci return _UnionGenericAlias(self, parameters) 6967db96d56Sopenharmony_ci 6977db96d56Sopenharmony_ci@_SpecialForm 6987db96d56Sopenharmony_cidef Optional(self, parameters): 6997db96d56Sopenharmony_ci """Optional[X] is equivalent to Union[X, None].""" 7007db96d56Sopenharmony_ci arg = _type_check(parameters, f"{self} requires a single type.") 7017db96d56Sopenharmony_ci return Union[arg, type(None)] 7027db96d56Sopenharmony_ci 7037db96d56Sopenharmony_ci@_LiteralSpecialForm 7047db96d56Sopenharmony_ci@_tp_cache(typed=True) 7057db96d56Sopenharmony_cidef Literal(self, *parameters): 7067db96d56Sopenharmony_ci """Special typing form to define literal types (a.k.a. value types). 7077db96d56Sopenharmony_ci 7087db96d56Sopenharmony_ci This form can be used to indicate to type checkers that the corresponding 7097db96d56Sopenharmony_ci variable or function parameter has a value equivalent to the provided 7107db96d56Sopenharmony_ci literal (or one of several literals):: 7117db96d56Sopenharmony_ci 7127db96d56Sopenharmony_ci def validate_simple(data: Any) -> Literal[True]: # always returns True 7137db96d56Sopenharmony_ci ... 7147db96d56Sopenharmony_ci 7157db96d56Sopenharmony_ci MODE = Literal['r', 'rb', 'w', 'wb'] 7167db96d56Sopenharmony_ci def open_helper(file: str, mode: MODE) -> str: 7177db96d56Sopenharmony_ci ... 7187db96d56Sopenharmony_ci 7197db96d56Sopenharmony_ci open_helper('/some/path', 'r') # Passes type check 7207db96d56Sopenharmony_ci open_helper('/other/path', 'typo') # Error in type checker 7217db96d56Sopenharmony_ci 7227db96d56Sopenharmony_ci Literal[...] cannot be subclassed. At runtime, an arbitrary value 7237db96d56Sopenharmony_ci is allowed as type argument to Literal[...], but type checkers may 7247db96d56Sopenharmony_ci impose restrictions. 7257db96d56Sopenharmony_ci """ 7267db96d56Sopenharmony_ci # There is no '_type_check' call because arguments to Literal[...] are 7277db96d56Sopenharmony_ci # values, not types. 7287db96d56Sopenharmony_ci parameters = _flatten_literal_params(parameters) 7297db96d56Sopenharmony_ci 7307db96d56Sopenharmony_ci try: 7317db96d56Sopenharmony_ci parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters)))) 7327db96d56Sopenharmony_ci except TypeError: # unhashable parameters 7337db96d56Sopenharmony_ci pass 7347db96d56Sopenharmony_ci 7357db96d56Sopenharmony_ci return _LiteralGenericAlias(self, parameters) 7367db96d56Sopenharmony_ci 7377db96d56Sopenharmony_ci 7387db96d56Sopenharmony_ci@_SpecialForm 7397db96d56Sopenharmony_cidef TypeAlias(self, parameters): 7407db96d56Sopenharmony_ci """Special form for marking type aliases. 7417db96d56Sopenharmony_ci 7427db96d56Sopenharmony_ci Use TypeAlias to indicate that an assignment should 7437db96d56Sopenharmony_ci be recognized as a proper type alias definition by type 7447db96d56Sopenharmony_ci checkers. For example:: 7457db96d56Sopenharmony_ci 7467db96d56Sopenharmony_ci Predicate: TypeAlias = Callable[..., bool] 7477db96d56Sopenharmony_ci 7487db96d56Sopenharmony_ci It's invalid when used anywhere except as in the example above. 7497db96d56Sopenharmony_ci """ 7507db96d56Sopenharmony_ci raise TypeError(f"{self} is not subscriptable") 7517db96d56Sopenharmony_ci 7527db96d56Sopenharmony_ci 7537db96d56Sopenharmony_ci@_SpecialForm 7547db96d56Sopenharmony_cidef Concatenate(self, parameters): 7557db96d56Sopenharmony_ci """Special form for annotating higher-order functions. 7567db96d56Sopenharmony_ci 7577db96d56Sopenharmony_ci ``Concatenate`` can be sed in conjunction with ``ParamSpec`` and 7587db96d56Sopenharmony_ci ``Callable`` to represent a higher order function which adds, removes or 7597db96d56Sopenharmony_ci transforms the parameters of a callable. 7607db96d56Sopenharmony_ci 7617db96d56Sopenharmony_ci For example:: 7627db96d56Sopenharmony_ci 7637db96d56Sopenharmony_ci Callable[Concatenate[int, P], int] 7647db96d56Sopenharmony_ci 7657db96d56Sopenharmony_ci See PEP 612 for detailed information. 7667db96d56Sopenharmony_ci """ 7677db96d56Sopenharmony_ci if parameters == (): 7687db96d56Sopenharmony_ci raise TypeError("Cannot take a Concatenate of no types.") 7697db96d56Sopenharmony_ci if not isinstance(parameters, tuple): 7707db96d56Sopenharmony_ci parameters = (parameters,) 7717db96d56Sopenharmony_ci if not (parameters[-1] is ... or isinstance(parameters[-1], ParamSpec)): 7727db96d56Sopenharmony_ci raise TypeError("The last parameter to Concatenate should be a " 7737db96d56Sopenharmony_ci "ParamSpec variable or ellipsis.") 7747db96d56Sopenharmony_ci msg = "Concatenate[arg, ...]: each arg must be a type." 7757db96d56Sopenharmony_ci parameters = (*(_type_check(p, msg) for p in parameters[:-1]), parameters[-1]) 7767db96d56Sopenharmony_ci return _ConcatenateGenericAlias(self, parameters, 7777db96d56Sopenharmony_ci _paramspec_tvars=True) 7787db96d56Sopenharmony_ci 7797db96d56Sopenharmony_ci 7807db96d56Sopenharmony_ci@_SpecialForm 7817db96d56Sopenharmony_cidef TypeGuard(self, parameters): 7827db96d56Sopenharmony_ci """Special typing construct for marking user-defined type guard functions. 7837db96d56Sopenharmony_ci 7847db96d56Sopenharmony_ci ``TypeGuard`` can be used to annotate the return type of a user-defined 7857db96d56Sopenharmony_ci type guard function. ``TypeGuard`` only accepts a single type argument. 7867db96d56Sopenharmony_ci At runtime, functions marked this way should return a boolean. 7877db96d56Sopenharmony_ci 7887db96d56Sopenharmony_ci ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static 7897db96d56Sopenharmony_ci type checkers to determine a more precise type of an expression within a 7907db96d56Sopenharmony_ci program's code flow. Usually type narrowing is done by analyzing 7917db96d56Sopenharmony_ci conditional code flow and applying the narrowing to a block of code. The 7927db96d56Sopenharmony_ci conditional expression here is sometimes referred to as a "type guard". 7937db96d56Sopenharmony_ci 7947db96d56Sopenharmony_ci Sometimes it would be convenient to use a user-defined boolean function 7957db96d56Sopenharmony_ci as a type guard. Such a function should use ``TypeGuard[...]`` as its 7967db96d56Sopenharmony_ci return type to alert static type checkers to this intention. 7977db96d56Sopenharmony_ci 7987db96d56Sopenharmony_ci Using ``-> TypeGuard`` tells the static type checker that for a given 7997db96d56Sopenharmony_ci function: 8007db96d56Sopenharmony_ci 8017db96d56Sopenharmony_ci 1. The return value is a boolean. 8027db96d56Sopenharmony_ci 2. If the return value is ``True``, the type of its argument 8037db96d56Sopenharmony_ci is the type inside ``TypeGuard``. 8047db96d56Sopenharmony_ci 8057db96d56Sopenharmony_ci For example:: 8067db96d56Sopenharmony_ci 8077db96d56Sopenharmony_ci def is_str(val: Union[str, float]): 8087db96d56Sopenharmony_ci # "isinstance" type guard 8097db96d56Sopenharmony_ci if isinstance(val, str): 8107db96d56Sopenharmony_ci # Type of ``val`` is narrowed to ``str`` 8117db96d56Sopenharmony_ci ... 8127db96d56Sopenharmony_ci else: 8137db96d56Sopenharmony_ci # Else, type of ``val`` is narrowed to ``float``. 8147db96d56Sopenharmony_ci ... 8157db96d56Sopenharmony_ci 8167db96d56Sopenharmony_ci Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower 8177db96d56Sopenharmony_ci form of ``TypeA`` (it can even be a wider form) and this may lead to 8187db96d56Sopenharmony_ci type-unsafe results. The main reason is to allow for things like 8197db96d56Sopenharmony_ci narrowing ``List[object]`` to ``List[str]`` even though the latter is not 8207db96d56Sopenharmony_ci a subtype of the former, since ``List`` is invariant. The responsibility of 8217db96d56Sopenharmony_ci writing type-safe type guards is left to the user. 8227db96d56Sopenharmony_ci 8237db96d56Sopenharmony_ci ``TypeGuard`` also works with type variables. For more information, see 8247db96d56Sopenharmony_ci PEP 647 (User-Defined Type Guards). 8257db96d56Sopenharmony_ci """ 8267db96d56Sopenharmony_ci item = _type_check(parameters, f'{self} accepts only single type.') 8277db96d56Sopenharmony_ci return _GenericAlias(self, (item,)) 8287db96d56Sopenharmony_ci 8297db96d56Sopenharmony_ci 8307db96d56Sopenharmony_ciclass ForwardRef(_Final, _root=True): 8317db96d56Sopenharmony_ci """Internal wrapper to hold a forward reference.""" 8327db96d56Sopenharmony_ci 8337db96d56Sopenharmony_ci __slots__ = ('__forward_arg__', '__forward_code__', 8347db96d56Sopenharmony_ci '__forward_evaluated__', '__forward_value__', 8357db96d56Sopenharmony_ci '__forward_is_argument__', '__forward_is_class__', 8367db96d56Sopenharmony_ci '__forward_module__') 8377db96d56Sopenharmony_ci 8387db96d56Sopenharmony_ci def __init__(self, arg, is_argument=True, module=None, *, is_class=False): 8397db96d56Sopenharmony_ci if not isinstance(arg, str): 8407db96d56Sopenharmony_ci raise TypeError(f"Forward reference must be a string -- got {arg!r}") 8417db96d56Sopenharmony_ci 8427db96d56Sopenharmony_ci # If we do `def f(*args: *Ts)`, then we'll have `arg = '*Ts'`. 8437db96d56Sopenharmony_ci # Unfortunately, this isn't a valid expression on its own, so we 8447db96d56Sopenharmony_ci # do the unpacking manually. 8457db96d56Sopenharmony_ci if arg[0] == '*': 8467db96d56Sopenharmony_ci arg_to_compile = f'({arg},)[0]' # E.g. (*Ts,)[0] or (*tuple[int, int],)[0] 8477db96d56Sopenharmony_ci else: 8487db96d56Sopenharmony_ci arg_to_compile = arg 8497db96d56Sopenharmony_ci try: 8507db96d56Sopenharmony_ci code = compile(arg_to_compile, '<string>', 'eval') 8517db96d56Sopenharmony_ci except SyntaxError: 8527db96d56Sopenharmony_ci raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}") 8537db96d56Sopenharmony_ci 8547db96d56Sopenharmony_ci self.__forward_arg__ = arg 8557db96d56Sopenharmony_ci self.__forward_code__ = code 8567db96d56Sopenharmony_ci self.__forward_evaluated__ = False 8577db96d56Sopenharmony_ci self.__forward_value__ = None 8587db96d56Sopenharmony_ci self.__forward_is_argument__ = is_argument 8597db96d56Sopenharmony_ci self.__forward_is_class__ = is_class 8607db96d56Sopenharmony_ci self.__forward_module__ = module 8617db96d56Sopenharmony_ci 8627db96d56Sopenharmony_ci def _evaluate(self, globalns, localns, recursive_guard): 8637db96d56Sopenharmony_ci if self.__forward_arg__ in recursive_guard: 8647db96d56Sopenharmony_ci return self 8657db96d56Sopenharmony_ci if not self.__forward_evaluated__ or localns is not globalns: 8667db96d56Sopenharmony_ci if globalns is None and localns is None: 8677db96d56Sopenharmony_ci globalns = localns = {} 8687db96d56Sopenharmony_ci elif globalns is None: 8697db96d56Sopenharmony_ci globalns = localns 8707db96d56Sopenharmony_ci elif localns is None: 8717db96d56Sopenharmony_ci localns = globalns 8727db96d56Sopenharmony_ci if self.__forward_module__ is not None: 8737db96d56Sopenharmony_ci globalns = getattr( 8747db96d56Sopenharmony_ci sys.modules.get(self.__forward_module__, None), '__dict__', globalns 8757db96d56Sopenharmony_ci ) 8767db96d56Sopenharmony_ci type_ = _type_check( 8777db96d56Sopenharmony_ci eval(self.__forward_code__, globalns, localns), 8787db96d56Sopenharmony_ci "Forward references must evaluate to types.", 8797db96d56Sopenharmony_ci is_argument=self.__forward_is_argument__, 8807db96d56Sopenharmony_ci allow_special_forms=self.__forward_is_class__, 8817db96d56Sopenharmony_ci ) 8827db96d56Sopenharmony_ci self.__forward_value__ = _eval_type( 8837db96d56Sopenharmony_ci type_, globalns, localns, recursive_guard | {self.__forward_arg__} 8847db96d56Sopenharmony_ci ) 8857db96d56Sopenharmony_ci self.__forward_evaluated__ = True 8867db96d56Sopenharmony_ci return self.__forward_value__ 8877db96d56Sopenharmony_ci 8887db96d56Sopenharmony_ci def __eq__(self, other): 8897db96d56Sopenharmony_ci if not isinstance(other, ForwardRef): 8907db96d56Sopenharmony_ci return NotImplemented 8917db96d56Sopenharmony_ci if self.__forward_evaluated__ and other.__forward_evaluated__: 8927db96d56Sopenharmony_ci return (self.__forward_arg__ == other.__forward_arg__ and 8937db96d56Sopenharmony_ci self.__forward_value__ == other.__forward_value__) 8947db96d56Sopenharmony_ci return (self.__forward_arg__ == other.__forward_arg__ and 8957db96d56Sopenharmony_ci self.__forward_module__ == other.__forward_module__) 8967db96d56Sopenharmony_ci 8977db96d56Sopenharmony_ci def __hash__(self): 8987db96d56Sopenharmony_ci return hash((self.__forward_arg__, self.__forward_module__)) 8997db96d56Sopenharmony_ci 9007db96d56Sopenharmony_ci def __or__(self, other): 9017db96d56Sopenharmony_ci return Union[self, other] 9027db96d56Sopenharmony_ci 9037db96d56Sopenharmony_ci def __ror__(self, other): 9047db96d56Sopenharmony_ci return Union[other, self] 9057db96d56Sopenharmony_ci 9067db96d56Sopenharmony_ci def __repr__(self): 9077db96d56Sopenharmony_ci if self.__forward_module__ is None: 9087db96d56Sopenharmony_ci module_repr = '' 9097db96d56Sopenharmony_ci else: 9107db96d56Sopenharmony_ci module_repr = f', module={self.__forward_module__!r}' 9117db96d56Sopenharmony_ci return f'ForwardRef({self.__forward_arg__!r}{module_repr})' 9127db96d56Sopenharmony_ci 9137db96d56Sopenharmony_ci 9147db96d56Sopenharmony_cidef _is_unpacked_typevartuple(x: Any) -> bool: 9157db96d56Sopenharmony_ci return ((not isinstance(x, type)) and 9167db96d56Sopenharmony_ci getattr(x, '__typing_is_unpacked_typevartuple__', False)) 9177db96d56Sopenharmony_ci 9187db96d56Sopenharmony_ci 9197db96d56Sopenharmony_cidef _is_typevar_like(x: Any) -> bool: 9207db96d56Sopenharmony_ci return isinstance(x, (TypeVar, ParamSpec)) or _is_unpacked_typevartuple(x) 9217db96d56Sopenharmony_ci 9227db96d56Sopenharmony_ci 9237db96d56Sopenharmony_ciclass _PickleUsingNameMixin: 9247db96d56Sopenharmony_ci """Mixin enabling pickling based on self.__name__.""" 9257db96d56Sopenharmony_ci 9267db96d56Sopenharmony_ci def __reduce__(self): 9277db96d56Sopenharmony_ci return self.__name__ 9287db96d56Sopenharmony_ci 9297db96d56Sopenharmony_ci 9307db96d56Sopenharmony_ciclass _BoundVarianceMixin: 9317db96d56Sopenharmony_ci """Mixin giving __init__ bound and variance arguments. 9327db96d56Sopenharmony_ci 9337db96d56Sopenharmony_ci This is used by TypeVar and ParamSpec, which both employ the notions of 9347db96d56Sopenharmony_ci a type 'bound' (restricting type arguments to be a subtype of some 9357db96d56Sopenharmony_ci specified type) and type 'variance' (determining subtype relations between 9367db96d56Sopenharmony_ci generic types). 9377db96d56Sopenharmony_ci """ 9387db96d56Sopenharmony_ci def __init__(self, bound, covariant, contravariant): 9397db96d56Sopenharmony_ci """Used to setup TypeVars and ParamSpec's bound, covariant and 9407db96d56Sopenharmony_ci contravariant attributes. 9417db96d56Sopenharmony_ci """ 9427db96d56Sopenharmony_ci if covariant and contravariant: 9437db96d56Sopenharmony_ci raise ValueError("Bivariant types are not supported.") 9447db96d56Sopenharmony_ci self.__covariant__ = bool(covariant) 9457db96d56Sopenharmony_ci self.__contravariant__ = bool(contravariant) 9467db96d56Sopenharmony_ci if bound: 9477db96d56Sopenharmony_ci self.__bound__ = _type_check(bound, "Bound must be a type.") 9487db96d56Sopenharmony_ci else: 9497db96d56Sopenharmony_ci self.__bound__ = None 9507db96d56Sopenharmony_ci 9517db96d56Sopenharmony_ci def __or__(self, right): 9527db96d56Sopenharmony_ci return Union[self, right] 9537db96d56Sopenharmony_ci 9547db96d56Sopenharmony_ci def __ror__(self, left): 9557db96d56Sopenharmony_ci return Union[left, self] 9567db96d56Sopenharmony_ci 9577db96d56Sopenharmony_ci def __repr__(self): 9587db96d56Sopenharmony_ci if self.__covariant__: 9597db96d56Sopenharmony_ci prefix = '+' 9607db96d56Sopenharmony_ci elif self.__contravariant__: 9617db96d56Sopenharmony_ci prefix = '-' 9627db96d56Sopenharmony_ci else: 9637db96d56Sopenharmony_ci prefix = '~' 9647db96d56Sopenharmony_ci return prefix + self.__name__ 9657db96d56Sopenharmony_ci 9667db96d56Sopenharmony_ci 9677db96d56Sopenharmony_ciclass TypeVar(_Final, _Immutable, _BoundVarianceMixin, _PickleUsingNameMixin, 9687db96d56Sopenharmony_ci _root=True): 9697db96d56Sopenharmony_ci """Type variable. 9707db96d56Sopenharmony_ci 9717db96d56Sopenharmony_ci Usage:: 9727db96d56Sopenharmony_ci 9737db96d56Sopenharmony_ci T = TypeVar('T') # Can be anything 9747db96d56Sopenharmony_ci A = TypeVar('A', str, bytes) # Must be str or bytes 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_ci Type variables exist primarily for the benefit of static type 9777db96d56Sopenharmony_ci checkers. They serve as the parameters for generic types as well 9787db96d56Sopenharmony_ci as for generic function definitions. See class Generic for more 9797db96d56Sopenharmony_ci information on generic types. Generic functions work as follows: 9807db96d56Sopenharmony_ci 9817db96d56Sopenharmony_ci def repeat(x: T, n: int) -> List[T]: 9827db96d56Sopenharmony_ci '''Return a list containing n references to x.''' 9837db96d56Sopenharmony_ci return [x]*n 9847db96d56Sopenharmony_ci 9857db96d56Sopenharmony_ci def longest(x: A, y: A) -> A: 9867db96d56Sopenharmony_ci '''Return the longest of two strings.''' 9877db96d56Sopenharmony_ci return x if len(x) >= len(y) else y 9887db96d56Sopenharmony_ci 9897db96d56Sopenharmony_ci The latter example's signature is essentially the overloading 9907db96d56Sopenharmony_ci of (str, str) -> str and (bytes, bytes) -> bytes. Also note 9917db96d56Sopenharmony_ci that if the arguments are instances of some subclass of str, 9927db96d56Sopenharmony_ci the return type is still plain str. 9937db96d56Sopenharmony_ci 9947db96d56Sopenharmony_ci At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError. 9957db96d56Sopenharmony_ci 9967db96d56Sopenharmony_ci Type variables defined with covariant=True or contravariant=True 9977db96d56Sopenharmony_ci can be used to declare covariant or contravariant generic types. 9987db96d56Sopenharmony_ci See PEP 484 for more details. By default generic types are invariant 9997db96d56Sopenharmony_ci in all type variables. 10007db96d56Sopenharmony_ci 10017db96d56Sopenharmony_ci Type variables can be introspected. e.g.: 10027db96d56Sopenharmony_ci 10037db96d56Sopenharmony_ci T.__name__ == 'T' 10047db96d56Sopenharmony_ci T.__constraints__ == () 10057db96d56Sopenharmony_ci T.__covariant__ == False 10067db96d56Sopenharmony_ci T.__contravariant__ = False 10077db96d56Sopenharmony_ci A.__constraints__ == (str, bytes) 10087db96d56Sopenharmony_ci 10097db96d56Sopenharmony_ci Note that only type variables defined in global scope can be pickled. 10107db96d56Sopenharmony_ci """ 10117db96d56Sopenharmony_ci 10127db96d56Sopenharmony_ci def __init__(self, name, *constraints, bound=None, 10137db96d56Sopenharmony_ci covariant=False, contravariant=False): 10147db96d56Sopenharmony_ci self.__name__ = name 10157db96d56Sopenharmony_ci super().__init__(bound, covariant, contravariant) 10167db96d56Sopenharmony_ci if constraints and bound is not None: 10177db96d56Sopenharmony_ci raise TypeError("Constraints cannot be combined with bound=...") 10187db96d56Sopenharmony_ci if constraints and len(constraints) == 1: 10197db96d56Sopenharmony_ci raise TypeError("A single constraint is not allowed") 10207db96d56Sopenharmony_ci msg = "TypeVar(name, constraint, ...): constraints must be types." 10217db96d56Sopenharmony_ci self.__constraints__ = tuple(_type_check(t, msg) for t in constraints) 10227db96d56Sopenharmony_ci def_mod = _caller() 10237db96d56Sopenharmony_ci if def_mod != 'typing': 10247db96d56Sopenharmony_ci self.__module__ = def_mod 10257db96d56Sopenharmony_ci 10267db96d56Sopenharmony_ci def __typing_subst__(self, arg): 10277db96d56Sopenharmony_ci msg = "Parameters to generic types must be types." 10287db96d56Sopenharmony_ci arg = _type_check(arg, msg, is_argument=True) 10297db96d56Sopenharmony_ci if ((isinstance(arg, _GenericAlias) and arg.__origin__ is Unpack) or 10307db96d56Sopenharmony_ci (isinstance(arg, GenericAlias) and getattr(arg, '__unpacked__', False))): 10317db96d56Sopenharmony_ci raise TypeError(f"{arg} is not valid as type argument") 10327db96d56Sopenharmony_ci return arg 10337db96d56Sopenharmony_ci 10347db96d56Sopenharmony_ci 10357db96d56Sopenharmony_ciclass TypeVarTuple(_Final, _Immutable, _PickleUsingNameMixin, _root=True): 10367db96d56Sopenharmony_ci """Type variable tuple. 10377db96d56Sopenharmony_ci 10387db96d56Sopenharmony_ci Usage: 10397db96d56Sopenharmony_ci 10407db96d56Sopenharmony_ci Ts = TypeVarTuple('Ts') # Can be given any name 10417db96d56Sopenharmony_ci 10427db96d56Sopenharmony_ci Just as a TypeVar (type variable) is a placeholder for a single type, 10437db96d56Sopenharmony_ci a TypeVarTuple is a placeholder for an *arbitrary* number of types. For 10447db96d56Sopenharmony_ci example, if we define a generic class using a TypeVarTuple: 10457db96d56Sopenharmony_ci 10467db96d56Sopenharmony_ci class C(Generic[*Ts]): ... 10477db96d56Sopenharmony_ci 10487db96d56Sopenharmony_ci Then we can parameterize that class with an arbitrary number of type 10497db96d56Sopenharmony_ci arguments: 10507db96d56Sopenharmony_ci 10517db96d56Sopenharmony_ci C[int] # Fine 10527db96d56Sopenharmony_ci C[int, str] # Also fine 10537db96d56Sopenharmony_ci C[()] # Even this is fine 10547db96d56Sopenharmony_ci 10557db96d56Sopenharmony_ci For more details, see PEP 646. 10567db96d56Sopenharmony_ci 10577db96d56Sopenharmony_ci Note that only TypeVarTuples defined in global scope can be pickled. 10587db96d56Sopenharmony_ci """ 10597db96d56Sopenharmony_ci 10607db96d56Sopenharmony_ci def __init__(self, name): 10617db96d56Sopenharmony_ci self.__name__ = name 10627db96d56Sopenharmony_ci 10637db96d56Sopenharmony_ci # Used for pickling. 10647db96d56Sopenharmony_ci def_mod = _caller() 10657db96d56Sopenharmony_ci if def_mod != 'typing': 10667db96d56Sopenharmony_ci self.__module__ = def_mod 10677db96d56Sopenharmony_ci 10687db96d56Sopenharmony_ci def __iter__(self): 10697db96d56Sopenharmony_ci yield Unpack[self] 10707db96d56Sopenharmony_ci 10717db96d56Sopenharmony_ci def __repr__(self): 10727db96d56Sopenharmony_ci return self.__name__ 10737db96d56Sopenharmony_ci 10747db96d56Sopenharmony_ci def __typing_subst__(self, arg): 10757db96d56Sopenharmony_ci raise TypeError("Substitution of bare TypeVarTuple is not supported") 10767db96d56Sopenharmony_ci 10777db96d56Sopenharmony_ci def __typing_prepare_subst__(self, alias, args): 10787db96d56Sopenharmony_ci params = alias.__parameters__ 10797db96d56Sopenharmony_ci typevartuple_index = params.index(self) 10807db96d56Sopenharmony_ci for param in params[typevartuple_index + 1:]: 10817db96d56Sopenharmony_ci if isinstance(param, TypeVarTuple): 10827db96d56Sopenharmony_ci raise TypeError(f"More than one TypeVarTuple parameter in {alias}") 10837db96d56Sopenharmony_ci 10847db96d56Sopenharmony_ci alen = len(args) 10857db96d56Sopenharmony_ci plen = len(params) 10867db96d56Sopenharmony_ci left = typevartuple_index 10877db96d56Sopenharmony_ci right = plen - typevartuple_index - 1 10887db96d56Sopenharmony_ci var_tuple_index = None 10897db96d56Sopenharmony_ci fillarg = None 10907db96d56Sopenharmony_ci for k, arg in enumerate(args): 10917db96d56Sopenharmony_ci if not isinstance(arg, type): 10927db96d56Sopenharmony_ci subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) 10937db96d56Sopenharmony_ci if subargs and len(subargs) == 2 and subargs[-1] is ...: 10947db96d56Sopenharmony_ci if var_tuple_index is not None: 10957db96d56Sopenharmony_ci raise TypeError("More than one unpacked arbitrary-length tuple argument") 10967db96d56Sopenharmony_ci var_tuple_index = k 10977db96d56Sopenharmony_ci fillarg = subargs[0] 10987db96d56Sopenharmony_ci if var_tuple_index is not None: 10997db96d56Sopenharmony_ci left = min(left, var_tuple_index) 11007db96d56Sopenharmony_ci right = min(right, alen - var_tuple_index - 1) 11017db96d56Sopenharmony_ci elif left + right > alen: 11027db96d56Sopenharmony_ci raise TypeError(f"Too few arguments for {alias};" 11037db96d56Sopenharmony_ci f" actual {alen}, expected at least {plen-1}") 11047db96d56Sopenharmony_ci 11057db96d56Sopenharmony_ci return ( 11067db96d56Sopenharmony_ci *args[:left], 11077db96d56Sopenharmony_ci *([fillarg]*(typevartuple_index - left)), 11087db96d56Sopenharmony_ci tuple(args[left: alen - right]), 11097db96d56Sopenharmony_ci *([fillarg]*(plen - right - left - typevartuple_index - 1)), 11107db96d56Sopenharmony_ci *args[alen - right:], 11117db96d56Sopenharmony_ci ) 11127db96d56Sopenharmony_ci 11137db96d56Sopenharmony_ci 11147db96d56Sopenharmony_ciclass ParamSpecArgs(_Final, _Immutable, _root=True): 11157db96d56Sopenharmony_ci """The args for a ParamSpec object. 11167db96d56Sopenharmony_ci 11177db96d56Sopenharmony_ci Given a ParamSpec object P, P.args is an instance of ParamSpecArgs. 11187db96d56Sopenharmony_ci 11197db96d56Sopenharmony_ci ParamSpecArgs objects have a reference back to their ParamSpec: 11207db96d56Sopenharmony_ci 11217db96d56Sopenharmony_ci P.args.__origin__ is P 11227db96d56Sopenharmony_ci 11237db96d56Sopenharmony_ci This type is meant for runtime introspection and has no special meaning to 11247db96d56Sopenharmony_ci static type checkers. 11257db96d56Sopenharmony_ci """ 11267db96d56Sopenharmony_ci def __init__(self, origin): 11277db96d56Sopenharmony_ci self.__origin__ = origin 11287db96d56Sopenharmony_ci 11297db96d56Sopenharmony_ci def __repr__(self): 11307db96d56Sopenharmony_ci return f"{self.__origin__.__name__}.args" 11317db96d56Sopenharmony_ci 11327db96d56Sopenharmony_ci def __eq__(self, other): 11337db96d56Sopenharmony_ci if not isinstance(other, ParamSpecArgs): 11347db96d56Sopenharmony_ci return NotImplemented 11357db96d56Sopenharmony_ci return self.__origin__ == other.__origin__ 11367db96d56Sopenharmony_ci 11377db96d56Sopenharmony_ci 11387db96d56Sopenharmony_ciclass ParamSpecKwargs(_Final, _Immutable, _root=True): 11397db96d56Sopenharmony_ci """The kwargs for a ParamSpec object. 11407db96d56Sopenharmony_ci 11417db96d56Sopenharmony_ci Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs. 11427db96d56Sopenharmony_ci 11437db96d56Sopenharmony_ci ParamSpecKwargs objects have a reference back to their ParamSpec: 11447db96d56Sopenharmony_ci 11457db96d56Sopenharmony_ci P.kwargs.__origin__ is P 11467db96d56Sopenharmony_ci 11477db96d56Sopenharmony_ci This type is meant for runtime introspection and has no special meaning to 11487db96d56Sopenharmony_ci static type checkers. 11497db96d56Sopenharmony_ci """ 11507db96d56Sopenharmony_ci def __init__(self, origin): 11517db96d56Sopenharmony_ci self.__origin__ = origin 11527db96d56Sopenharmony_ci 11537db96d56Sopenharmony_ci def __repr__(self): 11547db96d56Sopenharmony_ci return f"{self.__origin__.__name__}.kwargs" 11557db96d56Sopenharmony_ci 11567db96d56Sopenharmony_ci def __eq__(self, other): 11577db96d56Sopenharmony_ci if not isinstance(other, ParamSpecKwargs): 11587db96d56Sopenharmony_ci return NotImplemented 11597db96d56Sopenharmony_ci return self.__origin__ == other.__origin__ 11607db96d56Sopenharmony_ci 11617db96d56Sopenharmony_ci 11627db96d56Sopenharmony_ciclass ParamSpec(_Final, _Immutable, _BoundVarianceMixin, _PickleUsingNameMixin, 11637db96d56Sopenharmony_ci _root=True): 11647db96d56Sopenharmony_ci """Parameter specification variable. 11657db96d56Sopenharmony_ci 11667db96d56Sopenharmony_ci Usage:: 11677db96d56Sopenharmony_ci 11687db96d56Sopenharmony_ci P = ParamSpec('P') 11697db96d56Sopenharmony_ci 11707db96d56Sopenharmony_ci Parameter specification variables exist primarily for the benefit of static 11717db96d56Sopenharmony_ci type checkers. They are used to forward the parameter types of one 11727db96d56Sopenharmony_ci callable to another callable, a pattern commonly found in higher order 11737db96d56Sopenharmony_ci functions and decorators. They are only valid when used in ``Concatenate``, 11747db96d56Sopenharmony_ci or as the first argument to ``Callable``, or as parameters for user-defined 11757db96d56Sopenharmony_ci Generics. See class Generic for more information on generic types. An 11767db96d56Sopenharmony_ci example for annotating a decorator:: 11777db96d56Sopenharmony_ci 11787db96d56Sopenharmony_ci T = TypeVar('T') 11797db96d56Sopenharmony_ci P = ParamSpec('P') 11807db96d56Sopenharmony_ci 11817db96d56Sopenharmony_ci def add_logging(f: Callable[P, T]) -> Callable[P, T]: 11827db96d56Sopenharmony_ci '''A type-safe decorator to add logging to a function.''' 11837db96d56Sopenharmony_ci def inner(*args: P.args, **kwargs: P.kwargs) -> T: 11847db96d56Sopenharmony_ci logging.info(f'{f.__name__} was called') 11857db96d56Sopenharmony_ci return f(*args, **kwargs) 11867db96d56Sopenharmony_ci return inner 11877db96d56Sopenharmony_ci 11887db96d56Sopenharmony_ci @add_logging 11897db96d56Sopenharmony_ci def add_two(x: float, y: float) -> float: 11907db96d56Sopenharmony_ci '''Add two numbers together.''' 11917db96d56Sopenharmony_ci return x + y 11927db96d56Sopenharmony_ci 11937db96d56Sopenharmony_ci Parameter specification variables can be introspected. e.g.: 11947db96d56Sopenharmony_ci 11957db96d56Sopenharmony_ci P.__name__ == 'P' 11967db96d56Sopenharmony_ci 11977db96d56Sopenharmony_ci Note that only parameter specification variables defined in global scope can 11987db96d56Sopenharmony_ci be pickled. 11997db96d56Sopenharmony_ci """ 12007db96d56Sopenharmony_ci 12017db96d56Sopenharmony_ci @property 12027db96d56Sopenharmony_ci def args(self): 12037db96d56Sopenharmony_ci return ParamSpecArgs(self) 12047db96d56Sopenharmony_ci 12057db96d56Sopenharmony_ci @property 12067db96d56Sopenharmony_ci def kwargs(self): 12077db96d56Sopenharmony_ci return ParamSpecKwargs(self) 12087db96d56Sopenharmony_ci 12097db96d56Sopenharmony_ci def __init__(self, name, *, bound=None, covariant=False, contravariant=False): 12107db96d56Sopenharmony_ci self.__name__ = name 12117db96d56Sopenharmony_ci super().__init__(bound, covariant, contravariant) 12127db96d56Sopenharmony_ci def_mod = _caller() 12137db96d56Sopenharmony_ci if def_mod != 'typing': 12147db96d56Sopenharmony_ci self.__module__ = def_mod 12157db96d56Sopenharmony_ci 12167db96d56Sopenharmony_ci def __typing_subst__(self, arg): 12177db96d56Sopenharmony_ci if isinstance(arg, (list, tuple)): 12187db96d56Sopenharmony_ci arg = tuple(_type_check(a, "Expected a type.") for a in arg) 12197db96d56Sopenharmony_ci elif not _is_param_expr(arg): 12207db96d56Sopenharmony_ci raise TypeError(f"Expected a list of types, an ellipsis, " 12217db96d56Sopenharmony_ci f"ParamSpec, or Concatenate. Got {arg}") 12227db96d56Sopenharmony_ci return arg 12237db96d56Sopenharmony_ci 12247db96d56Sopenharmony_ci def __typing_prepare_subst__(self, alias, args): 12257db96d56Sopenharmony_ci params = alias.__parameters__ 12267db96d56Sopenharmony_ci i = params.index(self) 12277db96d56Sopenharmony_ci if i >= len(args): 12287db96d56Sopenharmony_ci raise TypeError(f"Too few arguments for {alias}") 12297db96d56Sopenharmony_ci # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612. 12307db96d56Sopenharmony_ci if len(params) == 1 and not _is_param_expr(args[0]): 12317db96d56Sopenharmony_ci assert i == 0 12327db96d56Sopenharmony_ci args = (args,) 12337db96d56Sopenharmony_ci # Convert lists to tuples to help other libraries cache the results. 12347db96d56Sopenharmony_ci elif isinstance(args[i], list): 12357db96d56Sopenharmony_ci args = (*args[:i], tuple(args[i]), *args[i+1:]) 12367db96d56Sopenharmony_ci return args 12377db96d56Sopenharmony_ci 12387db96d56Sopenharmony_cidef _is_dunder(attr): 12397db96d56Sopenharmony_ci return attr.startswith('__') and attr.endswith('__') 12407db96d56Sopenharmony_ci 12417db96d56Sopenharmony_ciclass _BaseGenericAlias(_Final, _root=True): 12427db96d56Sopenharmony_ci """The central part of the internal API. 12437db96d56Sopenharmony_ci 12447db96d56Sopenharmony_ci This represents a generic version of type 'origin' with type arguments 'params'. 12457db96d56Sopenharmony_ci There are two kind of these aliases: user defined and special. The special ones 12467db96d56Sopenharmony_ci are wrappers around builtin collections and ABCs in collections.abc. These must 12477db96d56Sopenharmony_ci have 'name' always set. If 'inst' is False, then the alias can't be instantiated; 12487db96d56Sopenharmony_ci this is used by e.g. typing.List and typing.Dict. 12497db96d56Sopenharmony_ci """ 12507db96d56Sopenharmony_ci 12517db96d56Sopenharmony_ci def __init__(self, origin, *, inst=True, name=None): 12527db96d56Sopenharmony_ci self._inst = inst 12537db96d56Sopenharmony_ci self._name = name 12547db96d56Sopenharmony_ci self.__origin__ = origin 12557db96d56Sopenharmony_ci self.__slots__ = None # This is not documented. 12567db96d56Sopenharmony_ci 12577db96d56Sopenharmony_ci def __call__(self, *args, **kwargs): 12587db96d56Sopenharmony_ci if not self._inst: 12597db96d56Sopenharmony_ci raise TypeError(f"Type {self._name} cannot be instantiated; " 12607db96d56Sopenharmony_ci f"use {self.__origin__.__name__}() instead") 12617db96d56Sopenharmony_ci result = self.__origin__(*args, **kwargs) 12627db96d56Sopenharmony_ci try: 12637db96d56Sopenharmony_ci result.__orig_class__ = self 12647db96d56Sopenharmony_ci except AttributeError: 12657db96d56Sopenharmony_ci pass 12667db96d56Sopenharmony_ci return result 12677db96d56Sopenharmony_ci 12687db96d56Sopenharmony_ci def __mro_entries__(self, bases): 12697db96d56Sopenharmony_ci res = [] 12707db96d56Sopenharmony_ci if self.__origin__ not in bases: 12717db96d56Sopenharmony_ci res.append(self.__origin__) 12727db96d56Sopenharmony_ci i = bases.index(self) 12737db96d56Sopenharmony_ci for b in bases[i+1:]: 12747db96d56Sopenharmony_ci if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic): 12757db96d56Sopenharmony_ci break 12767db96d56Sopenharmony_ci else: 12777db96d56Sopenharmony_ci res.append(Generic) 12787db96d56Sopenharmony_ci return tuple(res) 12797db96d56Sopenharmony_ci 12807db96d56Sopenharmony_ci def __getattr__(self, attr): 12817db96d56Sopenharmony_ci if attr in {'__name__', '__qualname__'}: 12827db96d56Sopenharmony_ci return self._name or self.__origin__.__name__ 12837db96d56Sopenharmony_ci 12847db96d56Sopenharmony_ci # We are careful for copy and pickle. 12857db96d56Sopenharmony_ci # Also for simplicity we don't relay any dunder names 12867db96d56Sopenharmony_ci if '__origin__' in self.__dict__ and not _is_dunder(attr): 12877db96d56Sopenharmony_ci return getattr(self.__origin__, attr) 12887db96d56Sopenharmony_ci raise AttributeError(attr) 12897db96d56Sopenharmony_ci 12907db96d56Sopenharmony_ci def __setattr__(self, attr, val): 12917db96d56Sopenharmony_ci if _is_dunder(attr) or attr in {'_name', '_inst', '_nparams', 12927db96d56Sopenharmony_ci '_paramspec_tvars'}: 12937db96d56Sopenharmony_ci super().__setattr__(attr, val) 12947db96d56Sopenharmony_ci else: 12957db96d56Sopenharmony_ci setattr(self.__origin__, attr, val) 12967db96d56Sopenharmony_ci 12977db96d56Sopenharmony_ci def __instancecheck__(self, obj): 12987db96d56Sopenharmony_ci return self.__subclasscheck__(type(obj)) 12997db96d56Sopenharmony_ci 13007db96d56Sopenharmony_ci def __subclasscheck__(self, cls): 13017db96d56Sopenharmony_ci raise TypeError("Subscripted generics cannot be used with" 13027db96d56Sopenharmony_ci " class and instance checks") 13037db96d56Sopenharmony_ci 13047db96d56Sopenharmony_ci def __dir__(self): 13057db96d56Sopenharmony_ci return list(set(super().__dir__() 13067db96d56Sopenharmony_ci + [attr for attr in dir(self.__origin__) if not _is_dunder(attr)])) 13077db96d56Sopenharmony_ci 13087db96d56Sopenharmony_ci 13097db96d56Sopenharmony_ci# Special typing constructs Union, Optional, Generic, Callable and Tuple 13107db96d56Sopenharmony_ci# use three special attributes for internal bookkeeping of generic types: 13117db96d56Sopenharmony_ci# * __parameters__ is a tuple of unique free type parameters of a generic 13127db96d56Sopenharmony_ci# type, for example, Dict[T, T].__parameters__ == (T,); 13137db96d56Sopenharmony_ci# * __origin__ keeps a reference to a type that was subscripted, 13147db96d56Sopenharmony_ci# e.g., Union[T, int].__origin__ == Union, or the non-generic version of 13157db96d56Sopenharmony_ci# the type. 13167db96d56Sopenharmony_ci# * __args__ is a tuple of all arguments used in subscripting, 13177db96d56Sopenharmony_ci# e.g., Dict[T, int].__args__ == (T, int). 13187db96d56Sopenharmony_ci 13197db96d56Sopenharmony_ci 13207db96d56Sopenharmony_ciclass _GenericAlias(_BaseGenericAlias, _root=True): 13217db96d56Sopenharmony_ci # The type of parameterized generics. 13227db96d56Sopenharmony_ci # 13237db96d56Sopenharmony_ci # That is, for example, `type(List[int])` is `_GenericAlias`. 13247db96d56Sopenharmony_ci # 13257db96d56Sopenharmony_ci # Objects which are instances of this class include: 13267db96d56Sopenharmony_ci # * Parameterized container types, e.g. `Tuple[int]`, `List[int]`. 13277db96d56Sopenharmony_ci # * Note that native container types, e.g. `tuple`, `list`, use 13287db96d56Sopenharmony_ci # `types.GenericAlias` instead. 13297db96d56Sopenharmony_ci # * Parameterized classes: 13307db96d56Sopenharmony_ci # T = TypeVar('T') 13317db96d56Sopenharmony_ci # class C(Generic[T]): pass 13327db96d56Sopenharmony_ci # # C[int] is a _GenericAlias 13337db96d56Sopenharmony_ci # * `Callable` aliases, generic `Callable` aliases, and 13347db96d56Sopenharmony_ci # parameterized `Callable` aliases: 13357db96d56Sopenharmony_ci # T = TypeVar('T') 13367db96d56Sopenharmony_ci # # _CallableGenericAlias inherits from _GenericAlias. 13377db96d56Sopenharmony_ci # A = Callable[[], None] # _CallableGenericAlias 13387db96d56Sopenharmony_ci # B = Callable[[T], None] # _CallableGenericAlias 13397db96d56Sopenharmony_ci # C = B[int] # _CallableGenericAlias 13407db96d56Sopenharmony_ci # * Parameterized `Final`, `ClassVar` and `TypeGuard`: 13417db96d56Sopenharmony_ci # # All _GenericAlias 13427db96d56Sopenharmony_ci # Final[int] 13437db96d56Sopenharmony_ci # ClassVar[float] 13447db96d56Sopenharmony_ci # TypeVar[bool] 13457db96d56Sopenharmony_ci 13467db96d56Sopenharmony_ci def __init__(self, origin, args, *, inst=True, name=None, 13477db96d56Sopenharmony_ci _paramspec_tvars=False): 13487db96d56Sopenharmony_ci super().__init__(origin, inst=inst, name=name) 13497db96d56Sopenharmony_ci if not isinstance(args, tuple): 13507db96d56Sopenharmony_ci args = (args,) 13517db96d56Sopenharmony_ci self.__args__ = tuple(... if a is _TypingEllipsis else 13527db96d56Sopenharmony_ci a for a in args) 13537db96d56Sopenharmony_ci self.__parameters__ = _collect_parameters(args) 13547db96d56Sopenharmony_ci self._paramspec_tvars = _paramspec_tvars 13557db96d56Sopenharmony_ci if not name: 13567db96d56Sopenharmony_ci self.__module__ = origin.__module__ 13577db96d56Sopenharmony_ci 13587db96d56Sopenharmony_ci def __eq__(self, other): 13597db96d56Sopenharmony_ci if not isinstance(other, _GenericAlias): 13607db96d56Sopenharmony_ci return NotImplemented 13617db96d56Sopenharmony_ci return (self.__origin__ == other.__origin__ 13627db96d56Sopenharmony_ci and self.__args__ == other.__args__) 13637db96d56Sopenharmony_ci 13647db96d56Sopenharmony_ci def __hash__(self): 13657db96d56Sopenharmony_ci return hash((self.__origin__, self.__args__)) 13667db96d56Sopenharmony_ci 13677db96d56Sopenharmony_ci def __or__(self, right): 13687db96d56Sopenharmony_ci return Union[self, right] 13697db96d56Sopenharmony_ci 13707db96d56Sopenharmony_ci def __ror__(self, left): 13717db96d56Sopenharmony_ci return Union[left, self] 13727db96d56Sopenharmony_ci 13737db96d56Sopenharmony_ci @_tp_cache 13747db96d56Sopenharmony_ci def __getitem__(self, args): 13757db96d56Sopenharmony_ci # Parameterizes an already-parameterized object. 13767db96d56Sopenharmony_ci # 13777db96d56Sopenharmony_ci # For example, we arrive here doing something like: 13787db96d56Sopenharmony_ci # T1 = TypeVar('T1') 13797db96d56Sopenharmony_ci # T2 = TypeVar('T2') 13807db96d56Sopenharmony_ci # T3 = TypeVar('T3') 13817db96d56Sopenharmony_ci # class A(Generic[T1]): pass 13827db96d56Sopenharmony_ci # B = A[T2] # B is a _GenericAlias 13837db96d56Sopenharmony_ci # C = B[T3] # Invokes _GenericAlias.__getitem__ 13847db96d56Sopenharmony_ci # 13857db96d56Sopenharmony_ci # We also arrive here when parameterizing a generic `Callable` alias: 13867db96d56Sopenharmony_ci # T = TypeVar('T') 13877db96d56Sopenharmony_ci # C = Callable[[T], None] 13887db96d56Sopenharmony_ci # C[int] # Invokes _GenericAlias.__getitem__ 13897db96d56Sopenharmony_ci 13907db96d56Sopenharmony_ci if self.__origin__ in (Generic, Protocol): 13917db96d56Sopenharmony_ci # Can't subscript Generic[...] or Protocol[...]. 13927db96d56Sopenharmony_ci raise TypeError(f"Cannot subscript already-subscripted {self}") 13937db96d56Sopenharmony_ci if not self.__parameters__: 13947db96d56Sopenharmony_ci raise TypeError(f"{self} is not a generic class") 13957db96d56Sopenharmony_ci 13967db96d56Sopenharmony_ci # Preprocess `args`. 13977db96d56Sopenharmony_ci if not isinstance(args, tuple): 13987db96d56Sopenharmony_ci args = (args,) 13997db96d56Sopenharmony_ci args = tuple(_type_convert(p) for p in args) 14007db96d56Sopenharmony_ci args = _unpack_args(args) 14017db96d56Sopenharmony_ci new_args = self._determine_new_args(args) 14027db96d56Sopenharmony_ci r = self.copy_with(new_args) 14037db96d56Sopenharmony_ci return r 14047db96d56Sopenharmony_ci 14057db96d56Sopenharmony_ci def _determine_new_args(self, args): 14067db96d56Sopenharmony_ci # Determines new __args__ for __getitem__. 14077db96d56Sopenharmony_ci # 14087db96d56Sopenharmony_ci # For example, suppose we had: 14097db96d56Sopenharmony_ci # T1 = TypeVar('T1') 14107db96d56Sopenharmony_ci # T2 = TypeVar('T2') 14117db96d56Sopenharmony_ci # class A(Generic[T1, T2]): pass 14127db96d56Sopenharmony_ci # T3 = TypeVar('T3') 14137db96d56Sopenharmony_ci # B = A[int, T3] 14147db96d56Sopenharmony_ci # C = B[str] 14157db96d56Sopenharmony_ci # `B.__args__` is `(int, T3)`, so `C.__args__` should be `(int, str)`. 14167db96d56Sopenharmony_ci # Unfortunately, this is harder than it looks, because if `T3` is 14177db96d56Sopenharmony_ci # anything more exotic than a plain `TypeVar`, we need to consider 14187db96d56Sopenharmony_ci # edge cases. 14197db96d56Sopenharmony_ci 14207db96d56Sopenharmony_ci params = self.__parameters__ 14217db96d56Sopenharmony_ci # In the example above, this would be {T3: str} 14227db96d56Sopenharmony_ci for param in params: 14237db96d56Sopenharmony_ci prepare = getattr(param, '__typing_prepare_subst__', None) 14247db96d56Sopenharmony_ci if prepare is not None: 14257db96d56Sopenharmony_ci args = prepare(self, args) 14267db96d56Sopenharmony_ci alen = len(args) 14277db96d56Sopenharmony_ci plen = len(params) 14287db96d56Sopenharmony_ci if alen != plen: 14297db96d56Sopenharmony_ci raise TypeError(f"Too {'many' if alen > plen else 'few'} arguments for {self};" 14307db96d56Sopenharmony_ci f" actual {alen}, expected {plen}") 14317db96d56Sopenharmony_ci new_arg_by_param = dict(zip(params, args)) 14327db96d56Sopenharmony_ci return tuple(self._make_substitution(self.__args__, new_arg_by_param)) 14337db96d56Sopenharmony_ci 14347db96d56Sopenharmony_ci def _make_substitution(self, args, new_arg_by_param): 14357db96d56Sopenharmony_ci """Create a list of new type arguments.""" 14367db96d56Sopenharmony_ci new_args = [] 14377db96d56Sopenharmony_ci for old_arg in args: 14387db96d56Sopenharmony_ci if isinstance(old_arg, type): 14397db96d56Sopenharmony_ci new_args.append(old_arg) 14407db96d56Sopenharmony_ci continue 14417db96d56Sopenharmony_ci 14427db96d56Sopenharmony_ci substfunc = getattr(old_arg, '__typing_subst__', None) 14437db96d56Sopenharmony_ci if substfunc: 14447db96d56Sopenharmony_ci new_arg = substfunc(new_arg_by_param[old_arg]) 14457db96d56Sopenharmony_ci else: 14467db96d56Sopenharmony_ci subparams = getattr(old_arg, '__parameters__', ()) 14477db96d56Sopenharmony_ci if not subparams: 14487db96d56Sopenharmony_ci new_arg = old_arg 14497db96d56Sopenharmony_ci else: 14507db96d56Sopenharmony_ci subargs = [] 14517db96d56Sopenharmony_ci for x in subparams: 14527db96d56Sopenharmony_ci if isinstance(x, TypeVarTuple): 14537db96d56Sopenharmony_ci subargs.extend(new_arg_by_param[x]) 14547db96d56Sopenharmony_ci else: 14557db96d56Sopenharmony_ci subargs.append(new_arg_by_param[x]) 14567db96d56Sopenharmony_ci new_arg = old_arg[tuple(subargs)] 14577db96d56Sopenharmony_ci 14587db96d56Sopenharmony_ci if self.__origin__ == collections.abc.Callable and isinstance(new_arg, tuple): 14597db96d56Sopenharmony_ci # Consider the following `Callable`. 14607db96d56Sopenharmony_ci # C = Callable[[int], str] 14617db96d56Sopenharmony_ci # Here, `C.__args__` should be (int, str) - NOT ([int], str). 14627db96d56Sopenharmony_ci # That means that if we had something like... 14637db96d56Sopenharmony_ci # P = ParamSpec('P') 14647db96d56Sopenharmony_ci # T = TypeVar('T') 14657db96d56Sopenharmony_ci # C = Callable[P, T] 14667db96d56Sopenharmony_ci # D = C[[int, str], float] 14677db96d56Sopenharmony_ci # ...we need to be careful; `new_args` should end up as 14687db96d56Sopenharmony_ci # `(int, str, float)` rather than `([int, str], float)`. 14697db96d56Sopenharmony_ci new_args.extend(new_arg) 14707db96d56Sopenharmony_ci elif _is_unpacked_typevartuple(old_arg): 14717db96d56Sopenharmony_ci # Consider the following `_GenericAlias`, `B`: 14727db96d56Sopenharmony_ci # class A(Generic[*Ts]): ... 14737db96d56Sopenharmony_ci # B = A[T, *Ts] 14747db96d56Sopenharmony_ci # If we then do: 14757db96d56Sopenharmony_ci # B[float, int, str] 14767db96d56Sopenharmony_ci # The `new_arg` corresponding to `T` will be `float`, and the 14777db96d56Sopenharmony_ci # `new_arg` corresponding to `*Ts` will be `(int, str)`. We 14787db96d56Sopenharmony_ci # should join all these types together in a flat list 14797db96d56Sopenharmony_ci # `(float, int, str)` - so again, we should `extend`. 14807db96d56Sopenharmony_ci new_args.extend(new_arg) 14817db96d56Sopenharmony_ci elif isinstance(old_arg, tuple): 14827db96d56Sopenharmony_ci # Corner case: 14837db96d56Sopenharmony_ci # P = ParamSpec('P') 14847db96d56Sopenharmony_ci # T = TypeVar('T') 14857db96d56Sopenharmony_ci # class Base(Generic[P]): ... 14867db96d56Sopenharmony_ci # Can be substituted like this: 14877db96d56Sopenharmony_ci # X = Base[[int, T]] 14887db96d56Sopenharmony_ci # In this case, `old_arg` will be a tuple: 14897db96d56Sopenharmony_ci new_args.append( 14907db96d56Sopenharmony_ci tuple(self._make_substitution(old_arg, new_arg_by_param)), 14917db96d56Sopenharmony_ci ) 14927db96d56Sopenharmony_ci else: 14937db96d56Sopenharmony_ci new_args.append(new_arg) 14947db96d56Sopenharmony_ci return new_args 14957db96d56Sopenharmony_ci 14967db96d56Sopenharmony_ci def copy_with(self, args): 14977db96d56Sopenharmony_ci return self.__class__(self.__origin__, args, name=self._name, inst=self._inst, 14987db96d56Sopenharmony_ci _paramspec_tvars=self._paramspec_tvars) 14997db96d56Sopenharmony_ci 15007db96d56Sopenharmony_ci def __repr__(self): 15017db96d56Sopenharmony_ci if self._name: 15027db96d56Sopenharmony_ci name = 'typing.' + self._name 15037db96d56Sopenharmony_ci else: 15047db96d56Sopenharmony_ci name = _type_repr(self.__origin__) 15057db96d56Sopenharmony_ci if self.__args__: 15067db96d56Sopenharmony_ci args = ", ".join([_type_repr(a) for a in self.__args__]) 15077db96d56Sopenharmony_ci else: 15087db96d56Sopenharmony_ci # To ensure the repr is eval-able. 15097db96d56Sopenharmony_ci args = "()" 15107db96d56Sopenharmony_ci return f'{name}[{args}]' 15117db96d56Sopenharmony_ci 15127db96d56Sopenharmony_ci def __reduce__(self): 15137db96d56Sopenharmony_ci if self._name: 15147db96d56Sopenharmony_ci origin = globals()[self._name] 15157db96d56Sopenharmony_ci else: 15167db96d56Sopenharmony_ci origin = self.__origin__ 15177db96d56Sopenharmony_ci args = tuple(self.__args__) 15187db96d56Sopenharmony_ci if len(args) == 1 and not isinstance(args[0], tuple): 15197db96d56Sopenharmony_ci args, = args 15207db96d56Sopenharmony_ci return operator.getitem, (origin, args) 15217db96d56Sopenharmony_ci 15227db96d56Sopenharmony_ci def __mro_entries__(self, bases): 15237db96d56Sopenharmony_ci if isinstance(self.__origin__, _SpecialForm): 15247db96d56Sopenharmony_ci raise TypeError(f"Cannot subclass {self!r}") 15257db96d56Sopenharmony_ci 15267db96d56Sopenharmony_ci if self._name: # generic version of an ABC or built-in class 15277db96d56Sopenharmony_ci return super().__mro_entries__(bases) 15287db96d56Sopenharmony_ci if self.__origin__ is Generic: 15297db96d56Sopenharmony_ci if Protocol in bases: 15307db96d56Sopenharmony_ci return () 15317db96d56Sopenharmony_ci i = bases.index(self) 15327db96d56Sopenharmony_ci for b in bases[i+1:]: 15337db96d56Sopenharmony_ci if isinstance(b, _BaseGenericAlias) and b is not self: 15347db96d56Sopenharmony_ci return () 15357db96d56Sopenharmony_ci return (self.__origin__,) 15367db96d56Sopenharmony_ci 15377db96d56Sopenharmony_ci def __iter__(self): 15387db96d56Sopenharmony_ci yield Unpack[self] 15397db96d56Sopenharmony_ci 15407db96d56Sopenharmony_ci 15417db96d56Sopenharmony_ci# _nparams is the number of accepted parameters, e.g. 0 for Hashable, 15427db96d56Sopenharmony_ci# 1 for List and 2 for Dict. It may be -1 if variable number of 15437db96d56Sopenharmony_ci# parameters are accepted (needs custom __getitem__). 15447db96d56Sopenharmony_ci 15457db96d56Sopenharmony_ciclass _SpecialGenericAlias(_NotIterable, _BaseGenericAlias, _root=True): 15467db96d56Sopenharmony_ci def __init__(self, origin, nparams, *, inst=True, name=None): 15477db96d56Sopenharmony_ci if name is None: 15487db96d56Sopenharmony_ci name = origin.__name__ 15497db96d56Sopenharmony_ci super().__init__(origin, inst=inst, name=name) 15507db96d56Sopenharmony_ci self._nparams = nparams 15517db96d56Sopenharmony_ci if origin.__module__ == 'builtins': 15527db96d56Sopenharmony_ci self.__doc__ = f'A generic version of {origin.__qualname__}.' 15537db96d56Sopenharmony_ci else: 15547db96d56Sopenharmony_ci self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.' 15557db96d56Sopenharmony_ci 15567db96d56Sopenharmony_ci @_tp_cache 15577db96d56Sopenharmony_ci def __getitem__(self, params): 15587db96d56Sopenharmony_ci if not isinstance(params, tuple): 15597db96d56Sopenharmony_ci params = (params,) 15607db96d56Sopenharmony_ci msg = "Parameters to generic types must be types." 15617db96d56Sopenharmony_ci params = tuple(_type_check(p, msg) for p in params) 15627db96d56Sopenharmony_ci _check_generic(self, params, self._nparams) 15637db96d56Sopenharmony_ci return self.copy_with(params) 15647db96d56Sopenharmony_ci 15657db96d56Sopenharmony_ci def copy_with(self, params): 15667db96d56Sopenharmony_ci return _GenericAlias(self.__origin__, params, 15677db96d56Sopenharmony_ci name=self._name, inst=self._inst) 15687db96d56Sopenharmony_ci 15697db96d56Sopenharmony_ci def __repr__(self): 15707db96d56Sopenharmony_ci return 'typing.' + self._name 15717db96d56Sopenharmony_ci 15727db96d56Sopenharmony_ci def __subclasscheck__(self, cls): 15737db96d56Sopenharmony_ci if isinstance(cls, _SpecialGenericAlias): 15747db96d56Sopenharmony_ci return issubclass(cls.__origin__, self.__origin__) 15757db96d56Sopenharmony_ci if not isinstance(cls, _GenericAlias): 15767db96d56Sopenharmony_ci return issubclass(cls, self.__origin__) 15777db96d56Sopenharmony_ci return super().__subclasscheck__(cls) 15787db96d56Sopenharmony_ci 15797db96d56Sopenharmony_ci def __reduce__(self): 15807db96d56Sopenharmony_ci return self._name 15817db96d56Sopenharmony_ci 15827db96d56Sopenharmony_ci def __or__(self, right): 15837db96d56Sopenharmony_ci return Union[self, right] 15847db96d56Sopenharmony_ci 15857db96d56Sopenharmony_ci def __ror__(self, left): 15867db96d56Sopenharmony_ci return Union[left, self] 15877db96d56Sopenharmony_ci 15887db96d56Sopenharmony_ciclass _CallableGenericAlias(_NotIterable, _GenericAlias, _root=True): 15897db96d56Sopenharmony_ci def __repr__(self): 15907db96d56Sopenharmony_ci assert self._name == 'Callable' 15917db96d56Sopenharmony_ci args = self.__args__ 15927db96d56Sopenharmony_ci if len(args) == 2 and _is_param_expr(args[0]): 15937db96d56Sopenharmony_ci return super().__repr__() 15947db96d56Sopenharmony_ci return (f'typing.Callable' 15957db96d56Sopenharmony_ci f'[[{", ".join([_type_repr(a) for a in args[:-1]])}], ' 15967db96d56Sopenharmony_ci f'{_type_repr(args[-1])}]') 15977db96d56Sopenharmony_ci 15987db96d56Sopenharmony_ci def __reduce__(self): 15997db96d56Sopenharmony_ci args = self.__args__ 16007db96d56Sopenharmony_ci if not (len(args) == 2 and _is_param_expr(args[0])): 16017db96d56Sopenharmony_ci args = list(args[:-1]), args[-1] 16027db96d56Sopenharmony_ci return operator.getitem, (Callable, args) 16037db96d56Sopenharmony_ci 16047db96d56Sopenharmony_ci 16057db96d56Sopenharmony_ciclass _CallableType(_SpecialGenericAlias, _root=True): 16067db96d56Sopenharmony_ci def copy_with(self, params): 16077db96d56Sopenharmony_ci return _CallableGenericAlias(self.__origin__, params, 16087db96d56Sopenharmony_ci name=self._name, inst=self._inst, 16097db96d56Sopenharmony_ci _paramspec_tvars=True) 16107db96d56Sopenharmony_ci 16117db96d56Sopenharmony_ci def __getitem__(self, params): 16127db96d56Sopenharmony_ci if not isinstance(params, tuple) or len(params) != 2: 16137db96d56Sopenharmony_ci raise TypeError("Callable must be used as " 16147db96d56Sopenharmony_ci "Callable[[arg, ...], result].") 16157db96d56Sopenharmony_ci args, result = params 16167db96d56Sopenharmony_ci # This relaxes what args can be on purpose to allow things like 16177db96d56Sopenharmony_ci # PEP 612 ParamSpec. Responsibility for whether a user is using 16187db96d56Sopenharmony_ci # Callable[...] properly is deferred to static type checkers. 16197db96d56Sopenharmony_ci if isinstance(args, list): 16207db96d56Sopenharmony_ci params = (tuple(args), result) 16217db96d56Sopenharmony_ci else: 16227db96d56Sopenharmony_ci params = (args, result) 16237db96d56Sopenharmony_ci return self.__getitem_inner__(params) 16247db96d56Sopenharmony_ci 16257db96d56Sopenharmony_ci @_tp_cache 16267db96d56Sopenharmony_ci def __getitem_inner__(self, params): 16277db96d56Sopenharmony_ci args, result = params 16287db96d56Sopenharmony_ci msg = "Callable[args, result]: result must be a type." 16297db96d56Sopenharmony_ci result = _type_check(result, msg) 16307db96d56Sopenharmony_ci if args is Ellipsis: 16317db96d56Sopenharmony_ci return self.copy_with((_TypingEllipsis, result)) 16327db96d56Sopenharmony_ci if not isinstance(args, tuple): 16337db96d56Sopenharmony_ci args = (args,) 16347db96d56Sopenharmony_ci args = tuple(_type_convert(arg) for arg in args) 16357db96d56Sopenharmony_ci params = args + (result,) 16367db96d56Sopenharmony_ci return self.copy_with(params) 16377db96d56Sopenharmony_ci 16387db96d56Sopenharmony_ci 16397db96d56Sopenharmony_ciclass _TupleType(_SpecialGenericAlias, _root=True): 16407db96d56Sopenharmony_ci @_tp_cache 16417db96d56Sopenharmony_ci def __getitem__(self, params): 16427db96d56Sopenharmony_ci if not isinstance(params, tuple): 16437db96d56Sopenharmony_ci params = (params,) 16447db96d56Sopenharmony_ci if len(params) >= 2 and params[-1] is ...: 16457db96d56Sopenharmony_ci msg = "Tuple[t, ...]: t must be a type." 16467db96d56Sopenharmony_ci params = tuple(_type_check(p, msg) for p in params[:-1]) 16477db96d56Sopenharmony_ci return self.copy_with((*params, _TypingEllipsis)) 16487db96d56Sopenharmony_ci msg = "Tuple[t0, t1, ...]: each t must be a type." 16497db96d56Sopenharmony_ci params = tuple(_type_check(p, msg) for p in params) 16507db96d56Sopenharmony_ci return self.copy_with(params) 16517db96d56Sopenharmony_ci 16527db96d56Sopenharmony_ci 16537db96d56Sopenharmony_ciclass _UnionGenericAlias(_NotIterable, _GenericAlias, _root=True): 16547db96d56Sopenharmony_ci def copy_with(self, params): 16557db96d56Sopenharmony_ci return Union[params] 16567db96d56Sopenharmony_ci 16577db96d56Sopenharmony_ci def __eq__(self, other): 16587db96d56Sopenharmony_ci if not isinstance(other, (_UnionGenericAlias, types.UnionType)): 16597db96d56Sopenharmony_ci return NotImplemented 16607db96d56Sopenharmony_ci return set(self.__args__) == set(other.__args__) 16617db96d56Sopenharmony_ci 16627db96d56Sopenharmony_ci def __hash__(self): 16637db96d56Sopenharmony_ci return hash(frozenset(self.__args__)) 16647db96d56Sopenharmony_ci 16657db96d56Sopenharmony_ci def __repr__(self): 16667db96d56Sopenharmony_ci args = self.__args__ 16677db96d56Sopenharmony_ci if len(args) == 2: 16687db96d56Sopenharmony_ci if args[0] is type(None): 16697db96d56Sopenharmony_ci return f'typing.Optional[{_type_repr(args[1])}]' 16707db96d56Sopenharmony_ci elif args[1] is type(None): 16717db96d56Sopenharmony_ci return f'typing.Optional[{_type_repr(args[0])}]' 16727db96d56Sopenharmony_ci return super().__repr__() 16737db96d56Sopenharmony_ci 16747db96d56Sopenharmony_ci def __instancecheck__(self, obj): 16757db96d56Sopenharmony_ci return self.__subclasscheck__(type(obj)) 16767db96d56Sopenharmony_ci 16777db96d56Sopenharmony_ci def __subclasscheck__(self, cls): 16787db96d56Sopenharmony_ci for arg in self.__args__: 16797db96d56Sopenharmony_ci if issubclass(cls, arg): 16807db96d56Sopenharmony_ci return True 16817db96d56Sopenharmony_ci 16827db96d56Sopenharmony_ci def __reduce__(self): 16837db96d56Sopenharmony_ci func, (origin, args) = super().__reduce__() 16847db96d56Sopenharmony_ci return func, (Union, args) 16857db96d56Sopenharmony_ci 16867db96d56Sopenharmony_ci 16877db96d56Sopenharmony_cidef _value_and_type_iter(parameters): 16887db96d56Sopenharmony_ci return ((p, type(p)) for p in parameters) 16897db96d56Sopenharmony_ci 16907db96d56Sopenharmony_ci 16917db96d56Sopenharmony_ciclass _LiteralGenericAlias(_GenericAlias, _root=True): 16927db96d56Sopenharmony_ci def __eq__(self, other): 16937db96d56Sopenharmony_ci if not isinstance(other, _LiteralGenericAlias): 16947db96d56Sopenharmony_ci return NotImplemented 16957db96d56Sopenharmony_ci 16967db96d56Sopenharmony_ci return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__)) 16977db96d56Sopenharmony_ci 16987db96d56Sopenharmony_ci def __hash__(self): 16997db96d56Sopenharmony_ci return hash(frozenset(_value_and_type_iter(self.__args__))) 17007db96d56Sopenharmony_ci 17017db96d56Sopenharmony_ci 17027db96d56Sopenharmony_ciclass _ConcatenateGenericAlias(_GenericAlias, _root=True): 17037db96d56Sopenharmony_ci def copy_with(self, params): 17047db96d56Sopenharmony_ci if isinstance(params[-1], (list, tuple)): 17057db96d56Sopenharmony_ci return (*params[:-1], *params[-1]) 17067db96d56Sopenharmony_ci if isinstance(params[-1], _ConcatenateGenericAlias): 17077db96d56Sopenharmony_ci params = (*params[:-1], *params[-1].__args__) 17087db96d56Sopenharmony_ci return super().copy_with(params) 17097db96d56Sopenharmony_ci 17107db96d56Sopenharmony_ci 17117db96d56Sopenharmony_ci@_SpecialForm 17127db96d56Sopenharmony_cidef Unpack(self, parameters): 17137db96d56Sopenharmony_ci """Type unpack operator. 17147db96d56Sopenharmony_ci 17157db96d56Sopenharmony_ci The type unpack operator takes the child types from some container type, 17167db96d56Sopenharmony_ci such as `tuple[int, str]` or a `TypeVarTuple`, and 'pulls them out'. For 17177db96d56Sopenharmony_ci example:: 17187db96d56Sopenharmony_ci 17197db96d56Sopenharmony_ci # For some generic class `Foo`: 17207db96d56Sopenharmony_ci Foo[Unpack[tuple[int, str]]] # Equivalent to Foo[int, str] 17217db96d56Sopenharmony_ci 17227db96d56Sopenharmony_ci Ts = TypeVarTuple('Ts') 17237db96d56Sopenharmony_ci # Specifies that `Bar` is generic in an arbitrary number of types. 17247db96d56Sopenharmony_ci # (Think of `Ts` as a tuple of an arbitrary number of individual 17257db96d56Sopenharmony_ci # `TypeVar`s, which the `Unpack` is 'pulling out' directly into the 17267db96d56Sopenharmony_ci # `Generic[]`.) 17277db96d56Sopenharmony_ci class Bar(Generic[Unpack[Ts]]): ... 17287db96d56Sopenharmony_ci Bar[int] # Valid 17297db96d56Sopenharmony_ci Bar[int, str] # Also valid 17307db96d56Sopenharmony_ci 17317db96d56Sopenharmony_ci From Python 3.11, this can also be done using the `*` operator:: 17327db96d56Sopenharmony_ci 17337db96d56Sopenharmony_ci Foo[*tuple[int, str]] 17347db96d56Sopenharmony_ci class Bar(Generic[*Ts]): ... 17357db96d56Sopenharmony_ci 17367db96d56Sopenharmony_ci Note that there is only some runtime checking of this operator. Not 17377db96d56Sopenharmony_ci everything the runtime allows may be accepted by static type checkers. 17387db96d56Sopenharmony_ci 17397db96d56Sopenharmony_ci For more information, see PEP 646. 17407db96d56Sopenharmony_ci """ 17417db96d56Sopenharmony_ci item = _type_check(parameters, f'{self} accepts only single type.') 17427db96d56Sopenharmony_ci return _UnpackGenericAlias(origin=self, args=(item,)) 17437db96d56Sopenharmony_ci 17447db96d56Sopenharmony_ci 17457db96d56Sopenharmony_ciclass _UnpackGenericAlias(_GenericAlias, _root=True): 17467db96d56Sopenharmony_ci def __repr__(self): 17477db96d56Sopenharmony_ci # `Unpack` only takes one argument, so __args__ should contain only 17487db96d56Sopenharmony_ci # a single item. 17497db96d56Sopenharmony_ci return '*' + repr(self.__args__[0]) 17507db96d56Sopenharmony_ci 17517db96d56Sopenharmony_ci def __getitem__(self, args): 17527db96d56Sopenharmony_ci if self.__typing_is_unpacked_typevartuple__: 17537db96d56Sopenharmony_ci return args 17547db96d56Sopenharmony_ci return super().__getitem__(args) 17557db96d56Sopenharmony_ci 17567db96d56Sopenharmony_ci @property 17577db96d56Sopenharmony_ci def __typing_unpacked_tuple_args__(self): 17587db96d56Sopenharmony_ci assert self.__origin__ is Unpack 17597db96d56Sopenharmony_ci assert len(self.__args__) == 1 17607db96d56Sopenharmony_ci arg, = self.__args__ 17617db96d56Sopenharmony_ci if isinstance(arg, _GenericAlias): 17627db96d56Sopenharmony_ci assert arg.__origin__ is tuple 17637db96d56Sopenharmony_ci return arg.__args__ 17647db96d56Sopenharmony_ci return None 17657db96d56Sopenharmony_ci 17667db96d56Sopenharmony_ci @property 17677db96d56Sopenharmony_ci def __typing_is_unpacked_typevartuple__(self): 17687db96d56Sopenharmony_ci assert self.__origin__ is Unpack 17697db96d56Sopenharmony_ci assert len(self.__args__) == 1 17707db96d56Sopenharmony_ci return isinstance(self.__args__[0], TypeVarTuple) 17717db96d56Sopenharmony_ci 17727db96d56Sopenharmony_ci 17737db96d56Sopenharmony_ciclass Generic: 17747db96d56Sopenharmony_ci """Abstract base class for generic types. 17757db96d56Sopenharmony_ci 17767db96d56Sopenharmony_ci A generic type is typically declared by inheriting from 17777db96d56Sopenharmony_ci this class parameterized with one or more type variables. 17787db96d56Sopenharmony_ci For example, a generic mapping type might be defined as:: 17797db96d56Sopenharmony_ci 17807db96d56Sopenharmony_ci class Mapping(Generic[KT, VT]): 17817db96d56Sopenharmony_ci def __getitem__(self, key: KT) -> VT: 17827db96d56Sopenharmony_ci ... 17837db96d56Sopenharmony_ci # Etc. 17847db96d56Sopenharmony_ci 17857db96d56Sopenharmony_ci This class can then be used as follows:: 17867db96d56Sopenharmony_ci 17877db96d56Sopenharmony_ci def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: 17887db96d56Sopenharmony_ci try: 17897db96d56Sopenharmony_ci return mapping[key] 17907db96d56Sopenharmony_ci except KeyError: 17917db96d56Sopenharmony_ci return default 17927db96d56Sopenharmony_ci """ 17937db96d56Sopenharmony_ci __slots__ = () 17947db96d56Sopenharmony_ci _is_protocol = False 17957db96d56Sopenharmony_ci 17967db96d56Sopenharmony_ci @_tp_cache 17977db96d56Sopenharmony_ci def __class_getitem__(cls, params): 17987db96d56Sopenharmony_ci """Parameterizes a generic class. 17997db96d56Sopenharmony_ci 18007db96d56Sopenharmony_ci At least, parameterizing a generic class is the *main* thing this method 18017db96d56Sopenharmony_ci does. For example, for some generic class `Foo`, this is called when we 18027db96d56Sopenharmony_ci do `Foo[int]` - there, with `cls=Foo` and `params=int`. 18037db96d56Sopenharmony_ci 18047db96d56Sopenharmony_ci However, note that this method is also called when defining generic 18057db96d56Sopenharmony_ci classes in the first place with `class Foo(Generic[T]): ...`. 18067db96d56Sopenharmony_ci """ 18077db96d56Sopenharmony_ci if not isinstance(params, tuple): 18087db96d56Sopenharmony_ci params = (params,) 18097db96d56Sopenharmony_ci 18107db96d56Sopenharmony_ci params = tuple(_type_convert(p) for p in params) 18117db96d56Sopenharmony_ci if cls in (Generic, Protocol): 18127db96d56Sopenharmony_ci # Generic and Protocol can only be subscripted with unique type variables. 18137db96d56Sopenharmony_ci if not params: 18147db96d56Sopenharmony_ci raise TypeError( 18157db96d56Sopenharmony_ci f"Parameter list to {cls.__qualname__}[...] cannot be empty" 18167db96d56Sopenharmony_ci ) 18177db96d56Sopenharmony_ci if not all(_is_typevar_like(p) for p in params): 18187db96d56Sopenharmony_ci raise TypeError( 18197db96d56Sopenharmony_ci f"Parameters to {cls.__name__}[...] must all be type variables " 18207db96d56Sopenharmony_ci f"or parameter specification variables.") 18217db96d56Sopenharmony_ci if len(set(params)) != len(params): 18227db96d56Sopenharmony_ci raise TypeError( 18237db96d56Sopenharmony_ci f"Parameters to {cls.__name__}[...] must all be unique") 18247db96d56Sopenharmony_ci else: 18257db96d56Sopenharmony_ci # Subscripting a regular Generic subclass. 18267db96d56Sopenharmony_ci for param in cls.__parameters__: 18277db96d56Sopenharmony_ci prepare = getattr(param, '__typing_prepare_subst__', None) 18287db96d56Sopenharmony_ci if prepare is not None: 18297db96d56Sopenharmony_ci params = prepare(cls, params) 18307db96d56Sopenharmony_ci _check_generic(cls, params, len(cls.__parameters__)) 18317db96d56Sopenharmony_ci 18327db96d56Sopenharmony_ci new_args = [] 18337db96d56Sopenharmony_ci for param, new_arg in zip(cls.__parameters__, params): 18347db96d56Sopenharmony_ci if isinstance(param, TypeVarTuple): 18357db96d56Sopenharmony_ci new_args.extend(new_arg) 18367db96d56Sopenharmony_ci else: 18377db96d56Sopenharmony_ci new_args.append(new_arg) 18387db96d56Sopenharmony_ci params = tuple(new_args) 18397db96d56Sopenharmony_ci 18407db96d56Sopenharmony_ci return _GenericAlias(cls, params, 18417db96d56Sopenharmony_ci _paramspec_tvars=True) 18427db96d56Sopenharmony_ci 18437db96d56Sopenharmony_ci def __init_subclass__(cls, *args, **kwargs): 18447db96d56Sopenharmony_ci super().__init_subclass__(*args, **kwargs) 18457db96d56Sopenharmony_ci tvars = [] 18467db96d56Sopenharmony_ci if '__orig_bases__' in cls.__dict__: 18477db96d56Sopenharmony_ci error = Generic in cls.__orig_bases__ 18487db96d56Sopenharmony_ci else: 18497db96d56Sopenharmony_ci error = (Generic in cls.__bases__ and 18507db96d56Sopenharmony_ci cls.__name__ != 'Protocol' and 18517db96d56Sopenharmony_ci type(cls) != _TypedDictMeta) 18527db96d56Sopenharmony_ci if error: 18537db96d56Sopenharmony_ci raise TypeError("Cannot inherit from plain Generic") 18547db96d56Sopenharmony_ci if '__orig_bases__' in cls.__dict__: 18557db96d56Sopenharmony_ci tvars = _collect_parameters(cls.__orig_bases__) 18567db96d56Sopenharmony_ci # Look for Generic[T1, ..., Tn]. 18577db96d56Sopenharmony_ci # If found, tvars must be a subset of it. 18587db96d56Sopenharmony_ci # If not found, tvars is it. 18597db96d56Sopenharmony_ci # Also check for and reject plain Generic, 18607db96d56Sopenharmony_ci # and reject multiple Generic[...]. 18617db96d56Sopenharmony_ci gvars = None 18627db96d56Sopenharmony_ci for base in cls.__orig_bases__: 18637db96d56Sopenharmony_ci if (isinstance(base, _GenericAlias) and 18647db96d56Sopenharmony_ci base.__origin__ is Generic): 18657db96d56Sopenharmony_ci if gvars is not None: 18667db96d56Sopenharmony_ci raise TypeError( 18677db96d56Sopenharmony_ci "Cannot inherit from Generic[...] multiple times.") 18687db96d56Sopenharmony_ci gvars = base.__parameters__ 18697db96d56Sopenharmony_ci if gvars is not None: 18707db96d56Sopenharmony_ci tvarset = set(tvars) 18717db96d56Sopenharmony_ci gvarset = set(gvars) 18727db96d56Sopenharmony_ci if not tvarset <= gvarset: 18737db96d56Sopenharmony_ci s_vars = ', '.join(str(t) for t in tvars if t not in gvarset) 18747db96d56Sopenharmony_ci s_args = ', '.join(str(g) for g in gvars) 18757db96d56Sopenharmony_ci raise TypeError(f"Some type variables ({s_vars}) are" 18767db96d56Sopenharmony_ci f" not listed in Generic[{s_args}]") 18777db96d56Sopenharmony_ci tvars = gvars 18787db96d56Sopenharmony_ci cls.__parameters__ = tuple(tvars) 18797db96d56Sopenharmony_ci 18807db96d56Sopenharmony_ci 18817db96d56Sopenharmony_ciclass _TypingEllipsis: 18827db96d56Sopenharmony_ci """Internal placeholder for ... (ellipsis).""" 18837db96d56Sopenharmony_ci 18847db96d56Sopenharmony_ci 18857db96d56Sopenharmony_ci_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__', 18867db96d56Sopenharmony_ci '_is_protocol', '_is_runtime_protocol'] 18877db96d56Sopenharmony_ci 18887db96d56Sopenharmony_ci_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__', 18897db96d56Sopenharmony_ci '__init__', '__module__', '__new__', '__slots__', 18907db96d56Sopenharmony_ci '__subclasshook__', '__weakref__', '__class_getitem__'] 18917db96d56Sopenharmony_ci 18927db96d56Sopenharmony_ci# These special attributes will be not collected as protocol members. 18937db96d56Sopenharmony_ciEXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker'] 18947db96d56Sopenharmony_ci 18957db96d56Sopenharmony_ci 18967db96d56Sopenharmony_cidef _get_protocol_attrs(cls): 18977db96d56Sopenharmony_ci """Collect protocol members from a protocol class objects. 18987db96d56Sopenharmony_ci 18997db96d56Sopenharmony_ci This includes names actually defined in the class dictionary, as well 19007db96d56Sopenharmony_ci as names that appear in annotations. Special names (above) are skipped. 19017db96d56Sopenharmony_ci """ 19027db96d56Sopenharmony_ci attrs = set() 19037db96d56Sopenharmony_ci for base in cls.__mro__[:-1]: # without object 19047db96d56Sopenharmony_ci if base.__name__ in ('Protocol', 'Generic'): 19057db96d56Sopenharmony_ci continue 19067db96d56Sopenharmony_ci annotations = getattr(base, '__annotations__', {}) 19077db96d56Sopenharmony_ci for attr in list(base.__dict__.keys()) + list(annotations.keys()): 19087db96d56Sopenharmony_ci if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES: 19097db96d56Sopenharmony_ci attrs.add(attr) 19107db96d56Sopenharmony_ci return attrs 19117db96d56Sopenharmony_ci 19127db96d56Sopenharmony_ci 19137db96d56Sopenharmony_cidef _is_callable_members_only(cls): 19147db96d56Sopenharmony_ci # PEP 544 prohibits using issubclass() with protocols that have non-method members. 19157db96d56Sopenharmony_ci return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls)) 19167db96d56Sopenharmony_ci 19177db96d56Sopenharmony_ci 19187db96d56Sopenharmony_cidef _no_init_or_replace_init(self, *args, **kwargs): 19197db96d56Sopenharmony_ci cls = type(self) 19207db96d56Sopenharmony_ci 19217db96d56Sopenharmony_ci if cls._is_protocol: 19227db96d56Sopenharmony_ci raise TypeError('Protocols cannot be instantiated') 19237db96d56Sopenharmony_ci 19247db96d56Sopenharmony_ci # Already using a custom `__init__`. No need to calculate correct 19257db96d56Sopenharmony_ci # `__init__` to call. This can lead to RecursionError. See bpo-45121. 19267db96d56Sopenharmony_ci if cls.__init__ is not _no_init_or_replace_init: 19277db96d56Sopenharmony_ci return 19287db96d56Sopenharmony_ci 19297db96d56Sopenharmony_ci # Initially, `__init__` of a protocol subclass is set to `_no_init_or_replace_init`. 19307db96d56Sopenharmony_ci # The first instantiation of the subclass will call `_no_init_or_replace_init` which 19317db96d56Sopenharmony_ci # searches for a proper new `__init__` in the MRO. The new `__init__` 19327db96d56Sopenharmony_ci # replaces the subclass' old `__init__` (ie `_no_init_or_replace_init`). Subsequent 19337db96d56Sopenharmony_ci # instantiation of the protocol subclass will thus use the new 19347db96d56Sopenharmony_ci # `__init__` and no longer call `_no_init_or_replace_init`. 19357db96d56Sopenharmony_ci for base in cls.__mro__: 19367db96d56Sopenharmony_ci init = base.__dict__.get('__init__', _no_init_or_replace_init) 19377db96d56Sopenharmony_ci if init is not _no_init_or_replace_init: 19387db96d56Sopenharmony_ci cls.__init__ = init 19397db96d56Sopenharmony_ci break 19407db96d56Sopenharmony_ci else: 19417db96d56Sopenharmony_ci # should not happen 19427db96d56Sopenharmony_ci cls.__init__ = object.__init__ 19437db96d56Sopenharmony_ci 19447db96d56Sopenharmony_ci cls.__init__(self, *args, **kwargs) 19457db96d56Sopenharmony_ci 19467db96d56Sopenharmony_ci 19477db96d56Sopenharmony_cidef _caller(depth=1, default='__main__'): 19487db96d56Sopenharmony_ci try: 19497db96d56Sopenharmony_ci return sys._getframe(depth + 1).f_globals.get('__name__', default) 19507db96d56Sopenharmony_ci except (AttributeError, ValueError): # For platforms without _getframe() 19517db96d56Sopenharmony_ci return None 19527db96d56Sopenharmony_ci 19537db96d56Sopenharmony_ci 19547db96d56Sopenharmony_cidef _allow_reckless_class_checks(depth=3): 19557db96d56Sopenharmony_ci """Allow instance and class checks for special stdlib modules. 19567db96d56Sopenharmony_ci 19577db96d56Sopenharmony_ci The abc and functools modules indiscriminately call isinstance() and 19587db96d56Sopenharmony_ci issubclass() on the whole MRO of a user class, which may contain protocols. 19597db96d56Sopenharmony_ci """ 19607db96d56Sopenharmony_ci return _caller(depth) in {'abc', 'functools', None} 19617db96d56Sopenharmony_ci 19627db96d56Sopenharmony_ci 19637db96d56Sopenharmony_ci_PROTO_ALLOWLIST = { 19647db96d56Sopenharmony_ci 'collections.abc': [ 19657db96d56Sopenharmony_ci 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable', 19667db96d56Sopenharmony_ci 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', 19677db96d56Sopenharmony_ci ], 19687db96d56Sopenharmony_ci 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'], 19697db96d56Sopenharmony_ci} 19707db96d56Sopenharmony_ci 19717db96d56Sopenharmony_ci 19727db96d56Sopenharmony_ciclass _ProtocolMeta(ABCMeta): 19737db96d56Sopenharmony_ci # This metaclass is really unfortunate and exists only because of 19747db96d56Sopenharmony_ci # the lack of __instancehook__. 19757db96d56Sopenharmony_ci def __instancecheck__(cls, instance): 19767db96d56Sopenharmony_ci # We need this method for situations where attributes are 19777db96d56Sopenharmony_ci # assigned in __init__. 19787db96d56Sopenharmony_ci if ( 19797db96d56Sopenharmony_ci getattr(cls, '_is_protocol', False) and 19807db96d56Sopenharmony_ci not getattr(cls, '_is_runtime_protocol', False) and 19817db96d56Sopenharmony_ci not _allow_reckless_class_checks(depth=2) 19827db96d56Sopenharmony_ci ): 19837db96d56Sopenharmony_ci raise TypeError("Instance and class checks can only be used with" 19847db96d56Sopenharmony_ci " @runtime_checkable protocols") 19857db96d56Sopenharmony_ci 19867db96d56Sopenharmony_ci if ((not getattr(cls, '_is_protocol', False) or 19877db96d56Sopenharmony_ci _is_callable_members_only(cls)) and 19887db96d56Sopenharmony_ci issubclass(instance.__class__, cls)): 19897db96d56Sopenharmony_ci return True 19907db96d56Sopenharmony_ci if cls._is_protocol: 19917db96d56Sopenharmony_ci if all(hasattr(instance, attr) and 19927db96d56Sopenharmony_ci # All *methods* can be blocked by setting them to None. 19937db96d56Sopenharmony_ci (not callable(getattr(cls, attr, None)) or 19947db96d56Sopenharmony_ci getattr(instance, attr) is not None) 19957db96d56Sopenharmony_ci for attr in _get_protocol_attrs(cls)): 19967db96d56Sopenharmony_ci return True 19977db96d56Sopenharmony_ci return super().__instancecheck__(instance) 19987db96d56Sopenharmony_ci 19997db96d56Sopenharmony_ci 20007db96d56Sopenharmony_ciclass Protocol(Generic, metaclass=_ProtocolMeta): 20017db96d56Sopenharmony_ci """Base class for protocol classes. 20027db96d56Sopenharmony_ci 20037db96d56Sopenharmony_ci Protocol classes are defined as:: 20047db96d56Sopenharmony_ci 20057db96d56Sopenharmony_ci class Proto(Protocol): 20067db96d56Sopenharmony_ci def meth(self) -> int: 20077db96d56Sopenharmony_ci ... 20087db96d56Sopenharmony_ci 20097db96d56Sopenharmony_ci Such classes are primarily used with static type checkers that recognize 20107db96d56Sopenharmony_ci structural subtyping (static duck-typing), for example:: 20117db96d56Sopenharmony_ci 20127db96d56Sopenharmony_ci class C: 20137db96d56Sopenharmony_ci def meth(self) -> int: 20147db96d56Sopenharmony_ci return 0 20157db96d56Sopenharmony_ci 20167db96d56Sopenharmony_ci def func(x: Proto) -> int: 20177db96d56Sopenharmony_ci return x.meth() 20187db96d56Sopenharmony_ci 20197db96d56Sopenharmony_ci func(C()) # Passes static type check 20207db96d56Sopenharmony_ci 20217db96d56Sopenharmony_ci See PEP 544 for details. Protocol classes decorated with 20227db96d56Sopenharmony_ci @typing.runtime_checkable act as simple-minded runtime protocols that check 20237db96d56Sopenharmony_ci only the presence of given attributes, ignoring their type signatures. 20247db96d56Sopenharmony_ci Protocol classes can be generic, they are defined as:: 20257db96d56Sopenharmony_ci 20267db96d56Sopenharmony_ci class GenProto(Protocol[T]): 20277db96d56Sopenharmony_ci def meth(self) -> T: 20287db96d56Sopenharmony_ci ... 20297db96d56Sopenharmony_ci """ 20307db96d56Sopenharmony_ci 20317db96d56Sopenharmony_ci __slots__ = () 20327db96d56Sopenharmony_ci _is_protocol = True 20337db96d56Sopenharmony_ci _is_runtime_protocol = False 20347db96d56Sopenharmony_ci 20357db96d56Sopenharmony_ci def __init_subclass__(cls, *args, **kwargs): 20367db96d56Sopenharmony_ci super().__init_subclass__(*args, **kwargs) 20377db96d56Sopenharmony_ci 20387db96d56Sopenharmony_ci # Determine if this is a protocol or a concrete subclass. 20397db96d56Sopenharmony_ci if not cls.__dict__.get('_is_protocol', False): 20407db96d56Sopenharmony_ci cls._is_protocol = any(b is Protocol for b in cls.__bases__) 20417db96d56Sopenharmony_ci 20427db96d56Sopenharmony_ci # Set (or override) the protocol subclass hook. 20437db96d56Sopenharmony_ci def _proto_hook(other): 20447db96d56Sopenharmony_ci if not cls.__dict__.get('_is_protocol', False): 20457db96d56Sopenharmony_ci return NotImplemented 20467db96d56Sopenharmony_ci 20477db96d56Sopenharmony_ci # First, perform various sanity checks. 20487db96d56Sopenharmony_ci if not getattr(cls, '_is_runtime_protocol', False): 20497db96d56Sopenharmony_ci if _allow_reckless_class_checks(): 20507db96d56Sopenharmony_ci return NotImplemented 20517db96d56Sopenharmony_ci raise TypeError("Instance and class checks can only be used with" 20527db96d56Sopenharmony_ci " @runtime_checkable protocols") 20537db96d56Sopenharmony_ci if not _is_callable_members_only(cls): 20547db96d56Sopenharmony_ci if _allow_reckless_class_checks(): 20557db96d56Sopenharmony_ci return NotImplemented 20567db96d56Sopenharmony_ci raise TypeError("Protocols with non-method members" 20577db96d56Sopenharmony_ci " don't support issubclass()") 20587db96d56Sopenharmony_ci if not isinstance(other, type): 20597db96d56Sopenharmony_ci # Same error message as for issubclass(1, int). 20607db96d56Sopenharmony_ci raise TypeError('issubclass() arg 1 must be a class') 20617db96d56Sopenharmony_ci 20627db96d56Sopenharmony_ci # Second, perform the actual structural compatibility check. 20637db96d56Sopenharmony_ci for attr in _get_protocol_attrs(cls): 20647db96d56Sopenharmony_ci for base in other.__mro__: 20657db96d56Sopenharmony_ci # Check if the members appears in the class dictionary... 20667db96d56Sopenharmony_ci if attr in base.__dict__: 20677db96d56Sopenharmony_ci if base.__dict__[attr] is None: 20687db96d56Sopenharmony_ci return NotImplemented 20697db96d56Sopenharmony_ci break 20707db96d56Sopenharmony_ci 20717db96d56Sopenharmony_ci # ...or in annotations, if it is a sub-protocol. 20727db96d56Sopenharmony_ci annotations = getattr(base, '__annotations__', {}) 20737db96d56Sopenharmony_ci if (isinstance(annotations, collections.abc.Mapping) and 20747db96d56Sopenharmony_ci attr in annotations and 20757db96d56Sopenharmony_ci issubclass(other, Generic) and other._is_protocol): 20767db96d56Sopenharmony_ci break 20777db96d56Sopenharmony_ci else: 20787db96d56Sopenharmony_ci return NotImplemented 20797db96d56Sopenharmony_ci return True 20807db96d56Sopenharmony_ci 20817db96d56Sopenharmony_ci if '__subclasshook__' not in cls.__dict__: 20827db96d56Sopenharmony_ci cls.__subclasshook__ = _proto_hook 20837db96d56Sopenharmony_ci 20847db96d56Sopenharmony_ci # We have nothing more to do for non-protocols... 20857db96d56Sopenharmony_ci if not cls._is_protocol: 20867db96d56Sopenharmony_ci return 20877db96d56Sopenharmony_ci 20887db96d56Sopenharmony_ci # ... otherwise check consistency of bases, and prohibit instantiation. 20897db96d56Sopenharmony_ci for base in cls.__bases__: 20907db96d56Sopenharmony_ci if not (base in (object, Generic) or 20917db96d56Sopenharmony_ci base.__module__ in _PROTO_ALLOWLIST and 20927db96d56Sopenharmony_ci base.__name__ in _PROTO_ALLOWLIST[base.__module__] or 20937db96d56Sopenharmony_ci issubclass(base, Generic) and base._is_protocol): 20947db96d56Sopenharmony_ci raise TypeError('Protocols can only inherit from other' 20957db96d56Sopenharmony_ci ' protocols, got %r' % base) 20967db96d56Sopenharmony_ci if cls.__init__ is Protocol.__init__: 20977db96d56Sopenharmony_ci cls.__init__ = _no_init_or_replace_init 20987db96d56Sopenharmony_ci 20997db96d56Sopenharmony_ci 21007db96d56Sopenharmony_ciclass _AnnotatedAlias(_NotIterable, _GenericAlias, _root=True): 21017db96d56Sopenharmony_ci """Runtime representation of an annotated type. 21027db96d56Sopenharmony_ci 21037db96d56Sopenharmony_ci At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't' 21047db96d56Sopenharmony_ci with extra annotations. The alias behaves like a normal typing alias. 21057db96d56Sopenharmony_ci Instantiating is the same as instantiating the underlying type; binding 21067db96d56Sopenharmony_ci it to types is also the same. 21077db96d56Sopenharmony_ci 21087db96d56Sopenharmony_ci The metadata itself is stored in a '__metadata__' attribute as a tuple. 21097db96d56Sopenharmony_ci """ 21107db96d56Sopenharmony_ci 21117db96d56Sopenharmony_ci def __init__(self, origin, metadata): 21127db96d56Sopenharmony_ci if isinstance(origin, _AnnotatedAlias): 21137db96d56Sopenharmony_ci metadata = origin.__metadata__ + metadata 21147db96d56Sopenharmony_ci origin = origin.__origin__ 21157db96d56Sopenharmony_ci super().__init__(origin, origin) 21167db96d56Sopenharmony_ci self.__metadata__ = metadata 21177db96d56Sopenharmony_ci 21187db96d56Sopenharmony_ci def copy_with(self, params): 21197db96d56Sopenharmony_ci assert len(params) == 1 21207db96d56Sopenharmony_ci new_type = params[0] 21217db96d56Sopenharmony_ci return _AnnotatedAlias(new_type, self.__metadata__) 21227db96d56Sopenharmony_ci 21237db96d56Sopenharmony_ci def __repr__(self): 21247db96d56Sopenharmony_ci return "typing.Annotated[{}, {}]".format( 21257db96d56Sopenharmony_ci _type_repr(self.__origin__), 21267db96d56Sopenharmony_ci ", ".join(repr(a) for a in self.__metadata__) 21277db96d56Sopenharmony_ci ) 21287db96d56Sopenharmony_ci 21297db96d56Sopenharmony_ci def __reduce__(self): 21307db96d56Sopenharmony_ci return operator.getitem, ( 21317db96d56Sopenharmony_ci Annotated, (self.__origin__,) + self.__metadata__ 21327db96d56Sopenharmony_ci ) 21337db96d56Sopenharmony_ci 21347db96d56Sopenharmony_ci def __eq__(self, other): 21357db96d56Sopenharmony_ci if not isinstance(other, _AnnotatedAlias): 21367db96d56Sopenharmony_ci return NotImplemented 21377db96d56Sopenharmony_ci return (self.__origin__ == other.__origin__ 21387db96d56Sopenharmony_ci and self.__metadata__ == other.__metadata__) 21397db96d56Sopenharmony_ci 21407db96d56Sopenharmony_ci def __hash__(self): 21417db96d56Sopenharmony_ci return hash((self.__origin__, self.__metadata__)) 21427db96d56Sopenharmony_ci 21437db96d56Sopenharmony_ci def __getattr__(self, attr): 21447db96d56Sopenharmony_ci if attr in {'__name__', '__qualname__'}: 21457db96d56Sopenharmony_ci return 'Annotated' 21467db96d56Sopenharmony_ci return super().__getattr__(attr) 21477db96d56Sopenharmony_ci 21487db96d56Sopenharmony_ci 21497db96d56Sopenharmony_ciclass Annotated: 21507db96d56Sopenharmony_ci """Add context-specific metadata to a type. 21517db96d56Sopenharmony_ci 21527db96d56Sopenharmony_ci Example: Annotated[int, runtime_check.Unsigned] indicates to the 21537db96d56Sopenharmony_ci hypothetical runtime_check module that this type is an unsigned int. 21547db96d56Sopenharmony_ci Every other consumer of this type can ignore this metadata and treat 21557db96d56Sopenharmony_ci this type as int. 21567db96d56Sopenharmony_ci 21577db96d56Sopenharmony_ci The first argument to Annotated must be a valid type. 21587db96d56Sopenharmony_ci 21597db96d56Sopenharmony_ci Details: 21607db96d56Sopenharmony_ci 21617db96d56Sopenharmony_ci - It's an error to call `Annotated` with less than two arguments. 21627db96d56Sopenharmony_ci - Access the metadata via the ``__metadata__`` attribute:: 21637db96d56Sopenharmony_ci 21647db96d56Sopenharmony_ci assert Annotated[int, '$'].__metadata__ == ('$',) 21657db96d56Sopenharmony_ci 21667db96d56Sopenharmony_ci - Nested Annotated are flattened:: 21677db96d56Sopenharmony_ci 21687db96d56Sopenharmony_ci assert Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3] 21697db96d56Sopenharmony_ci 21707db96d56Sopenharmony_ci - Instantiating an annotated type is equivalent to instantiating the 21717db96d56Sopenharmony_ci underlying type:: 21727db96d56Sopenharmony_ci 21737db96d56Sopenharmony_ci assert Annotated[C, Ann1](5) == C(5) 21747db96d56Sopenharmony_ci 21757db96d56Sopenharmony_ci - Annotated can be used as a generic type alias:: 21767db96d56Sopenharmony_ci 21777db96d56Sopenharmony_ci Optimized = Annotated[T, runtime.Optimize()] 21787db96d56Sopenharmony_ci assert Optimized[int] == Annotated[int, runtime.Optimize()] 21797db96d56Sopenharmony_ci 21807db96d56Sopenharmony_ci OptimizedList = Annotated[List[T], runtime.Optimize()] 21817db96d56Sopenharmony_ci assert OptimizedList[int] == Annotated[List[int], runtime.Optimize()] 21827db96d56Sopenharmony_ci 21837db96d56Sopenharmony_ci - Annotated cannot be used with an unpacked TypeVarTuple:: 21847db96d56Sopenharmony_ci 21857db96d56Sopenharmony_ci Annotated[*Ts, Ann1] # NOT valid 21867db96d56Sopenharmony_ci 21877db96d56Sopenharmony_ci This would be equivalent to 21887db96d56Sopenharmony_ci 21897db96d56Sopenharmony_ci Annotated[T1, T2, T3, ..., Ann1] 21907db96d56Sopenharmony_ci 21917db96d56Sopenharmony_ci where T1, T2 etc. are TypeVars, which would be invalid, because 21927db96d56Sopenharmony_ci only one type should be passed to Annotated. 21937db96d56Sopenharmony_ci """ 21947db96d56Sopenharmony_ci 21957db96d56Sopenharmony_ci __slots__ = () 21967db96d56Sopenharmony_ci 21977db96d56Sopenharmony_ci def __new__(cls, *args, **kwargs): 21987db96d56Sopenharmony_ci raise TypeError("Type Annotated cannot be instantiated.") 21997db96d56Sopenharmony_ci 22007db96d56Sopenharmony_ci @_tp_cache 22017db96d56Sopenharmony_ci def __class_getitem__(cls, params): 22027db96d56Sopenharmony_ci if not isinstance(params, tuple) or len(params) < 2: 22037db96d56Sopenharmony_ci raise TypeError("Annotated[...] should be used " 22047db96d56Sopenharmony_ci "with at least two arguments (a type and an " 22057db96d56Sopenharmony_ci "annotation).") 22067db96d56Sopenharmony_ci if _is_unpacked_typevartuple(params[0]): 22077db96d56Sopenharmony_ci raise TypeError("Annotated[...] should not be used with an " 22087db96d56Sopenharmony_ci "unpacked TypeVarTuple") 22097db96d56Sopenharmony_ci msg = "Annotated[t, ...]: t must be a type." 22107db96d56Sopenharmony_ci origin = _type_check(params[0], msg, allow_special_forms=True) 22117db96d56Sopenharmony_ci metadata = tuple(params[1:]) 22127db96d56Sopenharmony_ci return _AnnotatedAlias(origin, metadata) 22137db96d56Sopenharmony_ci 22147db96d56Sopenharmony_ci def __init_subclass__(cls, *args, **kwargs): 22157db96d56Sopenharmony_ci raise TypeError( 22167db96d56Sopenharmony_ci "Cannot subclass {}.Annotated".format(cls.__module__) 22177db96d56Sopenharmony_ci ) 22187db96d56Sopenharmony_ci 22197db96d56Sopenharmony_ci 22207db96d56Sopenharmony_cidef runtime_checkable(cls): 22217db96d56Sopenharmony_ci """Mark a protocol class as a runtime protocol. 22227db96d56Sopenharmony_ci 22237db96d56Sopenharmony_ci Such protocol can be used with isinstance() and issubclass(). 22247db96d56Sopenharmony_ci Raise TypeError if applied to a non-protocol class. 22257db96d56Sopenharmony_ci This allows a simple-minded structural check very similar to 22267db96d56Sopenharmony_ci one trick ponies in collections.abc such as Iterable. 22277db96d56Sopenharmony_ci 22287db96d56Sopenharmony_ci For example:: 22297db96d56Sopenharmony_ci 22307db96d56Sopenharmony_ci @runtime_checkable 22317db96d56Sopenharmony_ci class Closable(Protocol): 22327db96d56Sopenharmony_ci def close(self): ... 22337db96d56Sopenharmony_ci 22347db96d56Sopenharmony_ci assert isinstance(open('/some/file'), Closable) 22357db96d56Sopenharmony_ci 22367db96d56Sopenharmony_ci Warning: this will check only the presence of the required methods, 22377db96d56Sopenharmony_ci not their type signatures! 22387db96d56Sopenharmony_ci """ 22397db96d56Sopenharmony_ci if not issubclass(cls, Generic) or not cls._is_protocol: 22407db96d56Sopenharmony_ci raise TypeError('@runtime_checkable can be only applied to protocol classes,' 22417db96d56Sopenharmony_ci ' got %r' % cls) 22427db96d56Sopenharmony_ci cls._is_runtime_protocol = True 22437db96d56Sopenharmony_ci return cls 22447db96d56Sopenharmony_ci 22457db96d56Sopenharmony_ci 22467db96d56Sopenharmony_cidef cast(typ, val): 22477db96d56Sopenharmony_ci """Cast a value to a type. 22487db96d56Sopenharmony_ci 22497db96d56Sopenharmony_ci This returns the value unchanged. To the type checker this 22507db96d56Sopenharmony_ci signals that the return value has the designated type, but at 22517db96d56Sopenharmony_ci runtime we intentionally don't check anything (we want this 22527db96d56Sopenharmony_ci to be as fast as possible). 22537db96d56Sopenharmony_ci """ 22547db96d56Sopenharmony_ci return val 22557db96d56Sopenharmony_ci 22567db96d56Sopenharmony_ci 22577db96d56Sopenharmony_cidef assert_type(val, typ, /): 22587db96d56Sopenharmony_ci """Ask a static type checker to confirm that the value is of the given type. 22597db96d56Sopenharmony_ci 22607db96d56Sopenharmony_ci At runtime this does nothing: it returns the first argument unchanged with no 22617db96d56Sopenharmony_ci checks or side effects, no matter the actual type of the argument. 22627db96d56Sopenharmony_ci 22637db96d56Sopenharmony_ci When a static type checker encounters a call to assert_type(), it 22647db96d56Sopenharmony_ci emits an error if the value is not of the specified type:: 22657db96d56Sopenharmony_ci 22667db96d56Sopenharmony_ci def greet(name: str) -> None: 22677db96d56Sopenharmony_ci assert_type(name, str) # ok 22687db96d56Sopenharmony_ci assert_type(name, int) # type checker error 22697db96d56Sopenharmony_ci """ 22707db96d56Sopenharmony_ci return val 22717db96d56Sopenharmony_ci 22727db96d56Sopenharmony_ci 22737db96d56Sopenharmony_ci_allowed_types = (types.FunctionType, types.BuiltinFunctionType, 22747db96d56Sopenharmony_ci types.MethodType, types.ModuleType, 22757db96d56Sopenharmony_ci WrapperDescriptorType, MethodWrapperType, MethodDescriptorType) 22767db96d56Sopenharmony_ci 22777db96d56Sopenharmony_ci 22787db96d56Sopenharmony_cidef get_type_hints(obj, globalns=None, localns=None, include_extras=False): 22797db96d56Sopenharmony_ci """Return type hints for an object. 22807db96d56Sopenharmony_ci 22817db96d56Sopenharmony_ci This is often the same as obj.__annotations__, but it handles 22827db96d56Sopenharmony_ci forward references encoded as string literals and recursively replaces all 22837db96d56Sopenharmony_ci 'Annotated[T, ...]' with 'T' (unless 'include_extras=True'). 22847db96d56Sopenharmony_ci 22857db96d56Sopenharmony_ci The argument may be a module, class, method, or function. The annotations 22867db96d56Sopenharmony_ci are returned as a dictionary. For classes, annotations include also 22877db96d56Sopenharmony_ci inherited members. 22887db96d56Sopenharmony_ci 22897db96d56Sopenharmony_ci TypeError is raised if the argument is not of a type that can contain 22907db96d56Sopenharmony_ci annotations, and an empty dictionary is returned if no annotations are 22917db96d56Sopenharmony_ci present. 22927db96d56Sopenharmony_ci 22937db96d56Sopenharmony_ci BEWARE -- the behavior of globalns and localns is counterintuitive 22947db96d56Sopenharmony_ci (unless you are familiar with how eval() and exec() work). The 22957db96d56Sopenharmony_ci search order is locals first, then globals. 22967db96d56Sopenharmony_ci 22977db96d56Sopenharmony_ci - If no dict arguments are passed, an attempt is made to use the 22987db96d56Sopenharmony_ci globals from obj (or the respective module's globals for classes), 22997db96d56Sopenharmony_ci and these are also used as the locals. If the object does not appear 23007db96d56Sopenharmony_ci to have globals, an empty dictionary is used. For classes, the search 23017db96d56Sopenharmony_ci order is globals first then locals. 23027db96d56Sopenharmony_ci 23037db96d56Sopenharmony_ci - If one dict argument is passed, it is used for both globals and 23047db96d56Sopenharmony_ci locals. 23057db96d56Sopenharmony_ci 23067db96d56Sopenharmony_ci - If two dict arguments are passed, they specify globals and 23077db96d56Sopenharmony_ci locals, respectively. 23087db96d56Sopenharmony_ci """ 23097db96d56Sopenharmony_ci if getattr(obj, '__no_type_check__', None): 23107db96d56Sopenharmony_ci return {} 23117db96d56Sopenharmony_ci # Classes require a special treatment. 23127db96d56Sopenharmony_ci if isinstance(obj, type): 23137db96d56Sopenharmony_ci hints = {} 23147db96d56Sopenharmony_ci for base in reversed(obj.__mro__): 23157db96d56Sopenharmony_ci if globalns is None: 23167db96d56Sopenharmony_ci base_globals = getattr(sys.modules.get(base.__module__, None), '__dict__', {}) 23177db96d56Sopenharmony_ci else: 23187db96d56Sopenharmony_ci base_globals = globalns 23197db96d56Sopenharmony_ci ann = base.__dict__.get('__annotations__', {}) 23207db96d56Sopenharmony_ci if isinstance(ann, types.GetSetDescriptorType): 23217db96d56Sopenharmony_ci ann = {} 23227db96d56Sopenharmony_ci base_locals = dict(vars(base)) if localns is None else localns 23237db96d56Sopenharmony_ci if localns is None and globalns is None: 23247db96d56Sopenharmony_ci # This is surprising, but required. Before Python 3.10, 23257db96d56Sopenharmony_ci # get_type_hints only evaluated the globalns of 23267db96d56Sopenharmony_ci # a class. To maintain backwards compatibility, we reverse 23277db96d56Sopenharmony_ci # the globalns and localns order so that eval() looks into 23287db96d56Sopenharmony_ci # *base_globals* first rather than *base_locals*. 23297db96d56Sopenharmony_ci # This only affects ForwardRefs. 23307db96d56Sopenharmony_ci base_globals, base_locals = base_locals, base_globals 23317db96d56Sopenharmony_ci for name, value in ann.items(): 23327db96d56Sopenharmony_ci if value is None: 23337db96d56Sopenharmony_ci value = type(None) 23347db96d56Sopenharmony_ci if isinstance(value, str): 23357db96d56Sopenharmony_ci value = ForwardRef(value, is_argument=False, is_class=True) 23367db96d56Sopenharmony_ci value = _eval_type(value, base_globals, base_locals) 23377db96d56Sopenharmony_ci hints[name] = value 23387db96d56Sopenharmony_ci return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()} 23397db96d56Sopenharmony_ci 23407db96d56Sopenharmony_ci if globalns is None: 23417db96d56Sopenharmony_ci if isinstance(obj, types.ModuleType): 23427db96d56Sopenharmony_ci globalns = obj.__dict__ 23437db96d56Sopenharmony_ci else: 23447db96d56Sopenharmony_ci nsobj = obj 23457db96d56Sopenharmony_ci # Find globalns for the unwrapped object. 23467db96d56Sopenharmony_ci while hasattr(nsobj, '__wrapped__'): 23477db96d56Sopenharmony_ci nsobj = nsobj.__wrapped__ 23487db96d56Sopenharmony_ci globalns = getattr(nsobj, '__globals__', {}) 23497db96d56Sopenharmony_ci if localns is None: 23507db96d56Sopenharmony_ci localns = globalns 23517db96d56Sopenharmony_ci elif localns is None: 23527db96d56Sopenharmony_ci localns = globalns 23537db96d56Sopenharmony_ci hints = getattr(obj, '__annotations__', None) 23547db96d56Sopenharmony_ci if hints is None: 23557db96d56Sopenharmony_ci # Return empty annotations for something that _could_ have them. 23567db96d56Sopenharmony_ci if isinstance(obj, _allowed_types): 23577db96d56Sopenharmony_ci return {} 23587db96d56Sopenharmony_ci else: 23597db96d56Sopenharmony_ci raise TypeError('{!r} is not a module, class, method, ' 23607db96d56Sopenharmony_ci 'or function.'.format(obj)) 23617db96d56Sopenharmony_ci hints = dict(hints) 23627db96d56Sopenharmony_ci for name, value in hints.items(): 23637db96d56Sopenharmony_ci if value is None: 23647db96d56Sopenharmony_ci value = type(None) 23657db96d56Sopenharmony_ci if isinstance(value, str): 23667db96d56Sopenharmony_ci # class-level forward refs were handled above, this must be either 23677db96d56Sopenharmony_ci # a module-level annotation or a function argument annotation 23687db96d56Sopenharmony_ci value = ForwardRef( 23697db96d56Sopenharmony_ci value, 23707db96d56Sopenharmony_ci is_argument=not isinstance(obj, types.ModuleType), 23717db96d56Sopenharmony_ci is_class=False, 23727db96d56Sopenharmony_ci ) 23737db96d56Sopenharmony_ci hints[name] = _eval_type(value, globalns, localns) 23747db96d56Sopenharmony_ci return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()} 23757db96d56Sopenharmony_ci 23767db96d56Sopenharmony_ci 23777db96d56Sopenharmony_cidef _strip_annotations(t): 23787db96d56Sopenharmony_ci """Strip the annotations from a given type.""" 23797db96d56Sopenharmony_ci if isinstance(t, _AnnotatedAlias): 23807db96d56Sopenharmony_ci return _strip_annotations(t.__origin__) 23817db96d56Sopenharmony_ci if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired): 23827db96d56Sopenharmony_ci return _strip_annotations(t.__args__[0]) 23837db96d56Sopenharmony_ci if isinstance(t, _GenericAlias): 23847db96d56Sopenharmony_ci stripped_args = tuple(_strip_annotations(a) for a in t.__args__) 23857db96d56Sopenharmony_ci if stripped_args == t.__args__: 23867db96d56Sopenharmony_ci return t 23877db96d56Sopenharmony_ci return t.copy_with(stripped_args) 23887db96d56Sopenharmony_ci if isinstance(t, GenericAlias): 23897db96d56Sopenharmony_ci stripped_args = tuple(_strip_annotations(a) for a in t.__args__) 23907db96d56Sopenharmony_ci if stripped_args == t.__args__: 23917db96d56Sopenharmony_ci return t 23927db96d56Sopenharmony_ci return GenericAlias(t.__origin__, stripped_args) 23937db96d56Sopenharmony_ci if isinstance(t, types.UnionType): 23947db96d56Sopenharmony_ci stripped_args = tuple(_strip_annotations(a) for a in t.__args__) 23957db96d56Sopenharmony_ci if stripped_args == t.__args__: 23967db96d56Sopenharmony_ci return t 23977db96d56Sopenharmony_ci return functools.reduce(operator.or_, stripped_args) 23987db96d56Sopenharmony_ci 23997db96d56Sopenharmony_ci return t 24007db96d56Sopenharmony_ci 24017db96d56Sopenharmony_ci 24027db96d56Sopenharmony_cidef get_origin(tp): 24037db96d56Sopenharmony_ci """Get the unsubscripted version of a type. 24047db96d56Sopenharmony_ci 24057db96d56Sopenharmony_ci This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar 24067db96d56Sopenharmony_ci Annotated, and others. Return None for unsupported types. Examples:: 24077db96d56Sopenharmony_ci 24087db96d56Sopenharmony_ci assert get_origin(Literal[42]) is Literal 24097db96d56Sopenharmony_ci assert get_origin(int) is None 24107db96d56Sopenharmony_ci assert get_origin(ClassVar[int]) is ClassVar 24117db96d56Sopenharmony_ci assert get_origin(Generic) is Generic 24127db96d56Sopenharmony_ci assert get_origin(Generic[T]) is Generic 24137db96d56Sopenharmony_ci assert get_origin(Union[T, int]) is Union 24147db96d56Sopenharmony_ci assert get_origin(List[Tuple[T, T]][int]) is list 24157db96d56Sopenharmony_ci assert get_origin(P.args) is P 24167db96d56Sopenharmony_ci """ 24177db96d56Sopenharmony_ci if isinstance(tp, _AnnotatedAlias): 24187db96d56Sopenharmony_ci return Annotated 24197db96d56Sopenharmony_ci if isinstance(tp, (_BaseGenericAlias, GenericAlias, 24207db96d56Sopenharmony_ci ParamSpecArgs, ParamSpecKwargs)): 24217db96d56Sopenharmony_ci return tp.__origin__ 24227db96d56Sopenharmony_ci if tp is Generic: 24237db96d56Sopenharmony_ci return Generic 24247db96d56Sopenharmony_ci if isinstance(tp, types.UnionType): 24257db96d56Sopenharmony_ci return types.UnionType 24267db96d56Sopenharmony_ci return None 24277db96d56Sopenharmony_ci 24287db96d56Sopenharmony_ci 24297db96d56Sopenharmony_cidef get_args(tp): 24307db96d56Sopenharmony_ci """Get type arguments with all substitutions performed. 24317db96d56Sopenharmony_ci 24327db96d56Sopenharmony_ci For unions, basic simplifications used by Union constructor are performed. 24337db96d56Sopenharmony_ci 24347db96d56Sopenharmony_ci Examples:: 24357db96d56Sopenharmony_ci 24367db96d56Sopenharmony_ci assert get_args(Dict[str, int]) == (str, int) 24377db96d56Sopenharmony_ci assert get_args(int) == () 24387db96d56Sopenharmony_ci assert get_args(Union[int, Union[T, int], str][int]) == (int, str) 24397db96d56Sopenharmony_ci assert get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) 24407db96d56Sopenharmony_ci assert get_args(Callable[[], T][int]) == ([], int) 24417db96d56Sopenharmony_ci """ 24427db96d56Sopenharmony_ci if isinstance(tp, _AnnotatedAlias): 24437db96d56Sopenharmony_ci return (tp.__origin__,) + tp.__metadata__ 24447db96d56Sopenharmony_ci if isinstance(tp, (_GenericAlias, GenericAlias)): 24457db96d56Sopenharmony_ci res = tp.__args__ 24467db96d56Sopenharmony_ci if _should_unflatten_callable_args(tp, res): 24477db96d56Sopenharmony_ci res = (list(res[:-1]), res[-1]) 24487db96d56Sopenharmony_ci return res 24497db96d56Sopenharmony_ci if isinstance(tp, types.UnionType): 24507db96d56Sopenharmony_ci return tp.__args__ 24517db96d56Sopenharmony_ci return () 24527db96d56Sopenharmony_ci 24537db96d56Sopenharmony_ci 24547db96d56Sopenharmony_cidef is_typeddict(tp): 24557db96d56Sopenharmony_ci """Check if an annotation is a TypedDict class. 24567db96d56Sopenharmony_ci 24577db96d56Sopenharmony_ci For example:: 24587db96d56Sopenharmony_ci 24597db96d56Sopenharmony_ci class Film(TypedDict): 24607db96d56Sopenharmony_ci title: str 24617db96d56Sopenharmony_ci year: int 24627db96d56Sopenharmony_ci 24637db96d56Sopenharmony_ci is_typeddict(Film) # => True 24647db96d56Sopenharmony_ci is_typeddict(Union[list, str]) # => False 24657db96d56Sopenharmony_ci """ 24667db96d56Sopenharmony_ci return isinstance(tp, _TypedDictMeta) 24677db96d56Sopenharmony_ci 24687db96d56Sopenharmony_ci 24697db96d56Sopenharmony_ci_ASSERT_NEVER_REPR_MAX_LENGTH = 100 24707db96d56Sopenharmony_ci 24717db96d56Sopenharmony_ci 24727db96d56Sopenharmony_cidef assert_never(arg: Never, /) -> Never: 24737db96d56Sopenharmony_ci """Statically assert that a line of code is unreachable. 24747db96d56Sopenharmony_ci 24757db96d56Sopenharmony_ci Example:: 24767db96d56Sopenharmony_ci 24777db96d56Sopenharmony_ci def int_or_str(arg: int | str) -> None: 24787db96d56Sopenharmony_ci match arg: 24797db96d56Sopenharmony_ci case int(): 24807db96d56Sopenharmony_ci print("It's an int") 24817db96d56Sopenharmony_ci case str(): 24827db96d56Sopenharmony_ci print("It's a str") 24837db96d56Sopenharmony_ci case _: 24847db96d56Sopenharmony_ci assert_never(arg) 24857db96d56Sopenharmony_ci 24867db96d56Sopenharmony_ci If a type checker finds that a call to assert_never() is 24877db96d56Sopenharmony_ci reachable, it will emit an error. 24887db96d56Sopenharmony_ci 24897db96d56Sopenharmony_ci At runtime, this throws an exception when called. 24907db96d56Sopenharmony_ci """ 24917db96d56Sopenharmony_ci value = repr(arg) 24927db96d56Sopenharmony_ci if len(value) > _ASSERT_NEVER_REPR_MAX_LENGTH: 24937db96d56Sopenharmony_ci value = value[:_ASSERT_NEVER_REPR_MAX_LENGTH] + '...' 24947db96d56Sopenharmony_ci raise AssertionError(f"Expected code to be unreachable, but got: {value}") 24957db96d56Sopenharmony_ci 24967db96d56Sopenharmony_ci 24977db96d56Sopenharmony_cidef no_type_check(arg): 24987db96d56Sopenharmony_ci """Decorator to indicate that annotations are not type hints. 24997db96d56Sopenharmony_ci 25007db96d56Sopenharmony_ci The argument must be a class or function; if it is a class, it 25017db96d56Sopenharmony_ci applies recursively to all methods and classes defined in that class 25027db96d56Sopenharmony_ci (but not to methods defined in its superclasses or subclasses). 25037db96d56Sopenharmony_ci 25047db96d56Sopenharmony_ci This mutates the function(s) or class(es) in place. 25057db96d56Sopenharmony_ci """ 25067db96d56Sopenharmony_ci if isinstance(arg, type): 25077db96d56Sopenharmony_ci for key in dir(arg): 25087db96d56Sopenharmony_ci obj = getattr(arg, key) 25097db96d56Sopenharmony_ci if ( 25107db96d56Sopenharmony_ci not hasattr(obj, '__qualname__') 25117db96d56Sopenharmony_ci or obj.__qualname__ != f'{arg.__qualname__}.{obj.__name__}' 25127db96d56Sopenharmony_ci or getattr(obj, '__module__', None) != arg.__module__ 25137db96d56Sopenharmony_ci ): 25147db96d56Sopenharmony_ci # We only modify objects that are defined in this type directly. 25157db96d56Sopenharmony_ci # If classes / methods are nested in multiple layers, 25167db96d56Sopenharmony_ci # we will modify them when processing their direct holders. 25177db96d56Sopenharmony_ci continue 25187db96d56Sopenharmony_ci # Instance, class, and static methods: 25197db96d56Sopenharmony_ci if isinstance(obj, types.FunctionType): 25207db96d56Sopenharmony_ci obj.__no_type_check__ = True 25217db96d56Sopenharmony_ci if isinstance(obj, types.MethodType): 25227db96d56Sopenharmony_ci obj.__func__.__no_type_check__ = True 25237db96d56Sopenharmony_ci # Nested types: 25247db96d56Sopenharmony_ci if isinstance(obj, type): 25257db96d56Sopenharmony_ci no_type_check(obj) 25267db96d56Sopenharmony_ci try: 25277db96d56Sopenharmony_ci arg.__no_type_check__ = True 25287db96d56Sopenharmony_ci except TypeError: # built-in classes 25297db96d56Sopenharmony_ci pass 25307db96d56Sopenharmony_ci return arg 25317db96d56Sopenharmony_ci 25327db96d56Sopenharmony_ci 25337db96d56Sopenharmony_cidef no_type_check_decorator(decorator): 25347db96d56Sopenharmony_ci """Decorator to give another decorator the @no_type_check effect. 25357db96d56Sopenharmony_ci 25367db96d56Sopenharmony_ci This wraps the decorator with something that wraps the decorated 25377db96d56Sopenharmony_ci function in @no_type_check. 25387db96d56Sopenharmony_ci """ 25397db96d56Sopenharmony_ci @functools.wraps(decorator) 25407db96d56Sopenharmony_ci def wrapped_decorator(*args, **kwds): 25417db96d56Sopenharmony_ci func = decorator(*args, **kwds) 25427db96d56Sopenharmony_ci func = no_type_check(func) 25437db96d56Sopenharmony_ci return func 25447db96d56Sopenharmony_ci 25457db96d56Sopenharmony_ci return wrapped_decorator 25467db96d56Sopenharmony_ci 25477db96d56Sopenharmony_ci 25487db96d56Sopenharmony_cidef _overload_dummy(*args, **kwds): 25497db96d56Sopenharmony_ci """Helper for @overload to raise when called.""" 25507db96d56Sopenharmony_ci raise NotImplementedError( 25517db96d56Sopenharmony_ci "You should not call an overloaded function. " 25527db96d56Sopenharmony_ci "A series of @overload-decorated functions " 25537db96d56Sopenharmony_ci "outside a stub module should always be followed " 25547db96d56Sopenharmony_ci "by an implementation that is not @overload-ed.") 25557db96d56Sopenharmony_ci 25567db96d56Sopenharmony_ci 25577db96d56Sopenharmony_ci# {module: {qualname: {firstlineno: func}}} 25587db96d56Sopenharmony_ci_overload_registry = defaultdict(functools.partial(defaultdict, dict)) 25597db96d56Sopenharmony_ci 25607db96d56Sopenharmony_ci 25617db96d56Sopenharmony_cidef overload(func): 25627db96d56Sopenharmony_ci """Decorator for overloaded functions/methods. 25637db96d56Sopenharmony_ci 25647db96d56Sopenharmony_ci In a stub file, place two or more stub definitions for the same 25657db96d56Sopenharmony_ci function in a row, each decorated with @overload. For example:: 25667db96d56Sopenharmony_ci 25677db96d56Sopenharmony_ci @overload 25687db96d56Sopenharmony_ci def utf8(value: None) -> None: ... 25697db96d56Sopenharmony_ci @overload 25707db96d56Sopenharmony_ci def utf8(value: bytes) -> bytes: ... 25717db96d56Sopenharmony_ci @overload 25727db96d56Sopenharmony_ci def utf8(value: str) -> bytes: ... 25737db96d56Sopenharmony_ci 25747db96d56Sopenharmony_ci In a non-stub file (i.e. a regular .py file), do the same but 25757db96d56Sopenharmony_ci follow it with an implementation. The implementation should *not* 25767db96d56Sopenharmony_ci be decorated with @overload. For example:: 25777db96d56Sopenharmony_ci 25787db96d56Sopenharmony_ci @overload 25797db96d56Sopenharmony_ci def utf8(value: None) -> None: ... 25807db96d56Sopenharmony_ci @overload 25817db96d56Sopenharmony_ci def utf8(value: bytes) -> bytes: ... 25827db96d56Sopenharmony_ci @overload 25837db96d56Sopenharmony_ci def utf8(value: str) -> bytes: ... 25847db96d56Sopenharmony_ci def utf8(value): 25857db96d56Sopenharmony_ci ... # implementation goes here 25867db96d56Sopenharmony_ci 25877db96d56Sopenharmony_ci The overloads for a function can be retrieved at runtime using the 25887db96d56Sopenharmony_ci get_overloads() function. 25897db96d56Sopenharmony_ci """ 25907db96d56Sopenharmony_ci # classmethod and staticmethod 25917db96d56Sopenharmony_ci f = getattr(func, "__func__", func) 25927db96d56Sopenharmony_ci try: 25937db96d56Sopenharmony_ci _overload_registry[f.__module__][f.__qualname__][f.__code__.co_firstlineno] = func 25947db96d56Sopenharmony_ci except AttributeError: 25957db96d56Sopenharmony_ci # Not a normal function; ignore. 25967db96d56Sopenharmony_ci pass 25977db96d56Sopenharmony_ci return _overload_dummy 25987db96d56Sopenharmony_ci 25997db96d56Sopenharmony_ci 26007db96d56Sopenharmony_cidef get_overloads(func): 26017db96d56Sopenharmony_ci """Return all defined overloads for *func* as a sequence.""" 26027db96d56Sopenharmony_ci # classmethod and staticmethod 26037db96d56Sopenharmony_ci f = getattr(func, "__func__", func) 26047db96d56Sopenharmony_ci if f.__module__ not in _overload_registry: 26057db96d56Sopenharmony_ci return [] 26067db96d56Sopenharmony_ci mod_dict = _overload_registry[f.__module__] 26077db96d56Sopenharmony_ci if f.__qualname__ not in mod_dict: 26087db96d56Sopenharmony_ci return [] 26097db96d56Sopenharmony_ci return list(mod_dict[f.__qualname__].values()) 26107db96d56Sopenharmony_ci 26117db96d56Sopenharmony_ci 26127db96d56Sopenharmony_cidef clear_overloads(): 26137db96d56Sopenharmony_ci """Clear all overloads in the registry.""" 26147db96d56Sopenharmony_ci _overload_registry.clear() 26157db96d56Sopenharmony_ci 26167db96d56Sopenharmony_ci 26177db96d56Sopenharmony_cidef final(f): 26187db96d56Sopenharmony_ci """Decorator to indicate final methods and final classes. 26197db96d56Sopenharmony_ci 26207db96d56Sopenharmony_ci Use this decorator to indicate to type checkers that the decorated 26217db96d56Sopenharmony_ci method cannot be overridden, and decorated class cannot be subclassed. 26227db96d56Sopenharmony_ci 26237db96d56Sopenharmony_ci For example:: 26247db96d56Sopenharmony_ci 26257db96d56Sopenharmony_ci class Base: 26267db96d56Sopenharmony_ci @final 26277db96d56Sopenharmony_ci def done(self) -> None: 26287db96d56Sopenharmony_ci ... 26297db96d56Sopenharmony_ci class Sub(Base): 26307db96d56Sopenharmony_ci def done(self) -> None: # Error reported by type checker 26317db96d56Sopenharmony_ci ... 26327db96d56Sopenharmony_ci 26337db96d56Sopenharmony_ci @final 26347db96d56Sopenharmony_ci class Leaf: 26357db96d56Sopenharmony_ci ... 26367db96d56Sopenharmony_ci class Other(Leaf): # Error reported by type checker 26377db96d56Sopenharmony_ci ... 26387db96d56Sopenharmony_ci 26397db96d56Sopenharmony_ci There is no runtime checking of these properties. The decorator 26407db96d56Sopenharmony_ci attempts to set the ``__final__`` attribute to ``True`` on the decorated 26417db96d56Sopenharmony_ci object to allow runtime introspection. 26427db96d56Sopenharmony_ci """ 26437db96d56Sopenharmony_ci try: 26447db96d56Sopenharmony_ci f.__final__ = True 26457db96d56Sopenharmony_ci except (AttributeError, TypeError): 26467db96d56Sopenharmony_ci # Skip the attribute silently if it is not writable. 26477db96d56Sopenharmony_ci # AttributeError happens if the object has __slots__ or a 26487db96d56Sopenharmony_ci # read-only property, TypeError if it's a builtin class. 26497db96d56Sopenharmony_ci pass 26507db96d56Sopenharmony_ci return f 26517db96d56Sopenharmony_ci 26527db96d56Sopenharmony_ci 26537db96d56Sopenharmony_ci# Some unconstrained type variables. These are used by the container types. 26547db96d56Sopenharmony_ci# (These are not for export.) 26557db96d56Sopenharmony_ciT = TypeVar('T') # Any type. 26567db96d56Sopenharmony_ciKT = TypeVar('KT') # Key type. 26577db96d56Sopenharmony_ciVT = TypeVar('VT') # Value type. 26587db96d56Sopenharmony_ciT_co = TypeVar('T_co', covariant=True) # Any type covariant containers. 26597db96d56Sopenharmony_ciV_co = TypeVar('V_co', covariant=True) # Any type covariant containers. 26607db96d56Sopenharmony_ciVT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers. 26617db96d56Sopenharmony_ciT_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant. 26627db96d56Sopenharmony_ci# Internal type variable used for Type[]. 26637db96d56Sopenharmony_ciCT_co = TypeVar('CT_co', covariant=True, bound=type) 26647db96d56Sopenharmony_ci 26657db96d56Sopenharmony_ci# A useful type variable with constraints. This represents string types. 26667db96d56Sopenharmony_ci# (This one *is* for export!) 26677db96d56Sopenharmony_ciAnyStr = TypeVar('AnyStr', bytes, str) 26687db96d56Sopenharmony_ci 26697db96d56Sopenharmony_ci 26707db96d56Sopenharmony_ci# Various ABCs mimicking those in collections.abc. 26717db96d56Sopenharmony_ci_alias = _SpecialGenericAlias 26727db96d56Sopenharmony_ci 26737db96d56Sopenharmony_ciHashable = _alias(collections.abc.Hashable, 0) # Not generic. 26747db96d56Sopenharmony_ciAwaitable = _alias(collections.abc.Awaitable, 1) 26757db96d56Sopenharmony_ciCoroutine = _alias(collections.abc.Coroutine, 3) 26767db96d56Sopenharmony_ciAsyncIterable = _alias(collections.abc.AsyncIterable, 1) 26777db96d56Sopenharmony_ciAsyncIterator = _alias(collections.abc.AsyncIterator, 1) 26787db96d56Sopenharmony_ciIterable = _alias(collections.abc.Iterable, 1) 26797db96d56Sopenharmony_ciIterator = _alias(collections.abc.Iterator, 1) 26807db96d56Sopenharmony_ciReversible = _alias(collections.abc.Reversible, 1) 26817db96d56Sopenharmony_ciSized = _alias(collections.abc.Sized, 0) # Not generic. 26827db96d56Sopenharmony_ciContainer = _alias(collections.abc.Container, 1) 26837db96d56Sopenharmony_ciCollection = _alias(collections.abc.Collection, 1) 26847db96d56Sopenharmony_ciCallable = _CallableType(collections.abc.Callable, 2) 26857db96d56Sopenharmony_ciCallable.__doc__ = \ 26867db96d56Sopenharmony_ci """Deprecated alias to collections.abc.Callable. 26877db96d56Sopenharmony_ci 26887db96d56Sopenharmony_ci Callable[[int], str] signifies a function of (int) -> str. 26897db96d56Sopenharmony_ci The subscription syntax must always be used with exactly two 26907db96d56Sopenharmony_ci values: the argument list and the return type. 26917db96d56Sopenharmony_ci The argument list must be a list of types, a ParamSpec or ellipsis. 26927db96d56Sopenharmony_ci The return type must be a single type. 26937db96d56Sopenharmony_ci 26947db96d56Sopenharmony_ci There is no syntax to indicate optional or keyword arguments; 26957db96d56Sopenharmony_ci such function types are rarely used as callback types. 26967db96d56Sopenharmony_ci """ 26977db96d56Sopenharmony_ciAbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet') 26987db96d56Sopenharmony_ciMutableSet = _alias(collections.abc.MutableSet, 1) 26997db96d56Sopenharmony_ci# NOTE: Mapping is only covariant in the value type. 27007db96d56Sopenharmony_ciMapping = _alias(collections.abc.Mapping, 2) 27017db96d56Sopenharmony_ciMutableMapping = _alias(collections.abc.MutableMapping, 2) 27027db96d56Sopenharmony_ciSequence = _alias(collections.abc.Sequence, 1) 27037db96d56Sopenharmony_ciMutableSequence = _alias(collections.abc.MutableSequence, 1) 27047db96d56Sopenharmony_ciByteString = _alias(collections.abc.ByteString, 0) # Not generic 27057db96d56Sopenharmony_ci# Tuple accepts variable number of parameters. 27067db96d56Sopenharmony_ciTuple = _TupleType(tuple, -1, inst=False, name='Tuple') 27077db96d56Sopenharmony_ciTuple.__doc__ = \ 27087db96d56Sopenharmony_ci """Deprecated alias to builtins.tuple. 27097db96d56Sopenharmony_ci 27107db96d56Sopenharmony_ci Tuple[X, Y] is the cross-product type of X and Y. 27117db96d56Sopenharmony_ci 27127db96d56Sopenharmony_ci Example: Tuple[T1, T2] is a tuple of two elements corresponding 27137db96d56Sopenharmony_ci to type variables T1 and T2. Tuple[int, float, str] is a tuple 27147db96d56Sopenharmony_ci of an int, a float and a string. 27157db96d56Sopenharmony_ci 27167db96d56Sopenharmony_ci To specify a variable-length tuple of homogeneous type, use Tuple[T, ...]. 27177db96d56Sopenharmony_ci """ 27187db96d56Sopenharmony_ciList = _alias(list, 1, inst=False, name='List') 27197db96d56Sopenharmony_ciDeque = _alias(collections.deque, 1, name='Deque') 27207db96d56Sopenharmony_ciSet = _alias(set, 1, inst=False, name='Set') 27217db96d56Sopenharmony_ciFrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet') 27227db96d56Sopenharmony_ciMappingView = _alias(collections.abc.MappingView, 1) 27237db96d56Sopenharmony_ciKeysView = _alias(collections.abc.KeysView, 1) 27247db96d56Sopenharmony_ciItemsView = _alias(collections.abc.ItemsView, 2) 27257db96d56Sopenharmony_ciValuesView = _alias(collections.abc.ValuesView, 1) 27267db96d56Sopenharmony_ciContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager') 27277db96d56Sopenharmony_ciAsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager') 27287db96d56Sopenharmony_ciDict = _alias(dict, 2, inst=False, name='Dict') 27297db96d56Sopenharmony_ciDefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict') 27307db96d56Sopenharmony_ciOrderedDict = _alias(collections.OrderedDict, 2) 27317db96d56Sopenharmony_ciCounter = _alias(collections.Counter, 1) 27327db96d56Sopenharmony_ciChainMap = _alias(collections.ChainMap, 2) 27337db96d56Sopenharmony_ciGenerator = _alias(collections.abc.Generator, 3) 27347db96d56Sopenharmony_ciAsyncGenerator = _alias(collections.abc.AsyncGenerator, 2) 27357db96d56Sopenharmony_ciType = _alias(type, 1, inst=False, name='Type') 27367db96d56Sopenharmony_ciType.__doc__ = \ 27377db96d56Sopenharmony_ci """Deprecated alias to builtins.type. 27387db96d56Sopenharmony_ci 27397db96d56Sopenharmony_ci builtins.type or typing.Type can be used to annotate class objects. 27407db96d56Sopenharmony_ci For example, suppose we have the following classes:: 27417db96d56Sopenharmony_ci 27427db96d56Sopenharmony_ci class User: ... # Abstract base for User classes 27437db96d56Sopenharmony_ci class BasicUser(User): ... 27447db96d56Sopenharmony_ci class ProUser(User): ... 27457db96d56Sopenharmony_ci class TeamUser(User): ... 27467db96d56Sopenharmony_ci 27477db96d56Sopenharmony_ci And a function that takes a class argument that's a subclass of 27487db96d56Sopenharmony_ci User and returns an instance of the corresponding class:: 27497db96d56Sopenharmony_ci 27507db96d56Sopenharmony_ci U = TypeVar('U', bound=User) 27517db96d56Sopenharmony_ci def new_user(user_class: Type[U]) -> U: 27527db96d56Sopenharmony_ci user = user_class() 27537db96d56Sopenharmony_ci # (Here we could write the user object to a database) 27547db96d56Sopenharmony_ci return user 27557db96d56Sopenharmony_ci 27567db96d56Sopenharmony_ci joe = new_user(BasicUser) 27577db96d56Sopenharmony_ci 27587db96d56Sopenharmony_ci At this point the type checker knows that joe has type BasicUser. 27597db96d56Sopenharmony_ci """ 27607db96d56Sopenharmony_ci 27617db96d56Sopenharmony_ci 27627db96d56Sopenharmony_ci@runtime_checkable 27637db96d56Sopenharmony_ciclass SupportsInt(Protocol): 27647db96d56Sopenharmony_ci """An ABC with one abstract method __int__.""" 27657db96d56Sopenharmony_ci 27667db96d56Sopenharmony_ci __slots__ = () 27677db96d56Sopenharmony_ci 27687db96d56Sopenharmony_ci @abstractmethod 27697db96d56Sopenharmony_ci def __int__(self) -> int: 27707db96d56Sopenharmony_ci pass 27717db96d56Sopenharmony_ci 27727db96d56Sopenharmony_ci 27737db96d56Sopenharmony_ci@runtime_checkable 27747db96d56Sopenharmony_ciclass SupportsFloat(Protocol): 27757db96d56Sopenharmony_ci """An ABC with one abstract method __float__.""" 27767db96d56Sopenharmony_ci 27777db96d56Sopenharmony_ci __slots__ = () 27787db96d56Sopenharmony_ci 27797db96d56Sopenharmony_ci @abstractmethod 27807db96d56Sopenharmony_ci def __float__(self) -> float: 27817db96d56Sopenharmony_ci pass 27827db96d56Sopenharmony_ci 27837db96d56Sopenharmony_ci 27847db96d56Sopenharmony_ci@runtime_checkable 27857db96d56Sopenharmony_ciclass SupportsComplex(Protocol): 27867db96d56Sopenharmony_ci """An ABC with one abstract method __complex__.""" 27877db96d56Sopenharmony_ci 27887db96d56Sopenharmony_ci __slots__ = () 27897db96d56Sopenharmony_ci 27907db96d56Sopenharmony_ci @abstractmethod 27917db96d56Sopenharmony_ci def __complex__(self) -> complex: 27927db96d56Sopenharmony_ci pass 27937db96d56Sopenharmony_ci 27947db96d56Sopenharmony_ci 27957db96d56Sopenharmony_ci@runtime_checkable 27967db96d56Sopenharmony_ciclass SupportsBytes(Protocol): 27977db96d56Sopenharmony_ci """An ABC with one abstract method __bytes__.""" 27987db96d56Sopenharmony_ci 27997db96d56Sopenharmony_ci __slots__ = () 28007db96d56Sopenharmony_ci 28017db96d56Sopenharmony_ci @abstractmethod 28027db96d56Sopenharmony_ci def __bytes__(self) -> bytes: 28037db96d56Sopenharmony_ci pass 28047db96d56Sopenharmony_ci 28057db96d56Sopenharmony_ci 28067db96d56Sopenharmony_ci@runtime_checkable 28077db96d56Sopenharmony_ciclass SupportsIndex(Protocol): 28087db96d56Sopenharmony_ci """An ABC with one abstract method __index__.""" 28097db96d56Sopenharmony_ci 28107db96d56Sopenharmony_ci __slots__ = () 28117db96d56Sopenharmony_ci 28127db96d56Sopenharmony_ci @abstractmethod 28137db96d56Sopenharmony_ci def __index__(self) -> int: 28147db96d56Sopenharmony_ci pass 28157db96d56Sopenharmony_ci 28167db96d56Sopenharmony_ci 28177db96d56Sopenharmony_ci@runtime_checkable 28187db96d56Sopenharmony_ciclass SupportsAbs(Protocol[T_co]): 28197db96d56Sopenharmony_ci """An ABC with one abstract method __abs__ that is covariant in its return type.""" 28207db96d56Sopenharmony_ci 28217db96d56Sopenharmony_ci __slots__ = () 28227db96d56Sopenharmony_ci 28237db96d56Sopenharmony_ci @abstractmethod 28247db96d56Sopenharmony_ci def __abs__(self) -> T_co: 28257db96d56Sopenharmony_ci pass 28267db96d56Sopenharmony_ci 28277db96d56Sopenharmony_ci 28287db96d56Sopenharmony_ci@runtime_checkable 28297db96d56Sopenharmony_ciclass SupportsRound(Protocol[T_co]): 28307db96d56Sopenharmony_ci """An ABC with one abstract method __round__ that is covariant in its return type.""" 28317db96d56Sopenharmony_ci 28327db96d56Sopenharmony_ci __slots__ = () 28337db96d56Sopenharmony_ci 28347db96d56Sopenharmony_ci @abstractmethod 28357db96d56Sopenharmony_ci def __round__(self, ndigits: int = 0) -> T_co: 28367db96d56Sopenharmony_ci pass 28377db96d56Sopenharmony_ci 28387db96d56Sopenharmony_ci 28397db96d56Sopenharmony_cidef _make_nmtuple(name, types, module, defaults = ()): 28407db96d56Sopenharmony_ci fields = [n for n, t in types] 28417db96d56Sopenharmony_ci types = {n: _type_check(t, f"field {n} annotation must be a type") 28427db96d56Sopenharmony_ci for n, t in types} 28437db96d56Sopenharmony_ci nm_tpl = collections.namedtuple(name, fields, 28447db96d56Sopenharmony_ci defaults=defaults, module=module) 28457db96d56Sopenharmony_ci nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types 28467db96d56Sopenharmony_ci return nm_tpl 28477db96d56Sopenharmony_ci 28487db96d56Sopenharmony_ci 28497db96d56Sopenharmony_ci# attributes prohibited to set in NamedTuple class syntax 28507db96d56Sopenharmony_ci_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__', 28517db96d56Sopenharmony_ci '_fields', '_field_defaults', 28527db96d56Sopenharmony_ci '_make', '_replace', '_asdict', '_source'}) 28537db96d56Sopenharmony_ci 28547db96d56Sopenharmony_ci_special = frozenset({'__module__', '__name__', '__annotations__'}) 28557db96d56Sopenharmony_ci 28567db96d56Sopenharmony_ci 28577db96d56Sopenharmony_ciclass NamedTupleMeta(type): 28587db96d56Sopenharmony_ci def __new__(cls, typename, bases, ns): 28597db96d56Sopenharmony_ci assert _NamedTuple in bases 28607db96d56Sopenharmony_ci for base in bases: 28617db96d56Sopenharmony_ci if base is not _NamedTuple and base is not Generic: 28627db96d56Sopenharmony_ci raise TypeError( 28637db96d56Sopenharmony_ci 'can only inherit from a NamedTuple type and Generic') 28647db96d56Sopenharmony_ci bases = tuple(tuple if base is _NamedTuple else base for base in bases) 28657db96d56Sopenharmony_ci types = ns.get('__annotations__', {}) 28667db96d56Sopenharmony_ci default_names = [] 28677db96d56Sopenharmony_ci for field_name in types: 28687db96d56Sopenharmony_ci if field_name in ns: 28697db96d56Sopenharmony_ci default_names.append(field_name) 28707db96d56Sopenharmony_ci elif default_names: 28717db96d56Sopenharmony_ci raise TypeError(f"Non-default namedtuple field {field_name} " 28727db96d56Sopenharmony_ci f"cannot follow default field" 28737db96d56Sopenharmony_ci f"{'s' if len(default_names) > 1 else ''} " 28747db96d56Sopenharmony_ci f"{', '.join(default_names)}") 28757db96d56Sopenharmony_ci nm_tpl = _make_nmtuple(typename, types.items(), 28767db96d56Sopenharmony_ci defaults=[ns[n] for n in default_names], 28777db96d56Sopenharmony_ci module=ns['__module__']) 28787db96d56Sopenharmony_ci nm_tpl.__bases__ = bases 28797db96d56Sopenharmony_ci if Generic in bases: 28807db96d56Sopenharmony_ci class_getitem = Generic.__class_getitem__.__func__ 28817db96d56Sopenharmony_ci nm_tpl.__class_getitem__ = classmethod(class_getitem) 28827db96d56Sopenharmony_ci # update from user namespace without overriding special namedtuple attributes 28837db96d56Sopenharmony_ci for key in ns: 28847db96d56Sopenharmony_ci if key in _prohibited: 28857db96d56Sopenharmony_ci raise AttributeError("Cannot overwrite NamedTuple attribute " + key) 28867db96d56Sopenharmony_ci elif key not in _special and key not in nm_tpl._fields: 28877db96d56Sopenharmony_ci setattr(nm_tpl, key, ns[key]) 28887db96d56Sopenharmony_ci if Generic in bases: 28897db96d56Sopenharmony_ci nm_tpl.__init_subclass__() 28907db96d56Sopenharmony_ci return nm_tpl 28917db96d56Sopenharmony_ci 28927db96d56Sopenharmony_ci 28937db96d56Sopenharmony_cidef NamedTuple(typename, fields=None, /, **kwargs): 28947db96d56Sopenharmony_ci """Typed version of namedtuple. 28957db96d56Sopenharmony_ci 28967db96d56Sopenharmony_ci Usage:: 28977db96d56Sopenharmony_ci 28987db96d56Sopenharmony_ci class Employee(NamedTuple): 28997db96d56Sopenharmony_ci name: str 29007db96d56Sopenharmony_ci id: int 29017db96d56Sopenharmony_ci 29027db96d56Sopenharmony_ci This is equivalent to:: 29037db96d56Sopenharmony_ci 29047db96d56Sopenharmony_ci Employee = collections.namedtuple('Employee', ['name', 'id']) 29057db96d56Sopenharmony_ci 29067db96d56Sopenharmony_ci The resulting class has an extra __annotations__ attribute, giving a 29077db96d56Sopenharmony_ci dict that maps field names to types. (The field names are also in 29087db96d56Sopenharmony_ci the _fields attribute, which is part of the namedtuple API.) 29097db96d56Sopenharmony_ci An alternative equivalent functional syntax is also accepted:: 29107db96d56Sopenharmony_ci 29117db96d56Sopenharmony_ci Employee = NamedTuple('Employee', [('name', str), ('id', int)]) 29127db96d56Sopenharmony_ci """ 29137db96d56Sopenharmony_ci if fields is None: 29147db96d56Sopenharmony_ci fields = kwargs.items() 29157db96d56Sopenharmony_ci elif kwargs: 29167db96d56Sopenharmony_ci raise TypeError("Either list of fields or keywords" 29177db96d56Sopenharmony_ci " can be provided to NamedTuple, not both") 29187db96d56Sopenharmony_ci return _make_nmtuple(typename, fields, module=_caller()) 29197db96d56Sopenharmony_ci 29207db96d56Sopenharmony_ci_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {}) 29217db96d56Sopenharmony_ci 29227db96d56Sopenharmony_cidef _namedtuple_mro_entries(bases): 29237db96d56Sopenharmony_ci assert NamedTuple in bases 29247db96d56Sopenharmony_ci return (_NamedTuple,) 29257db96d56Sopenharmony_ci 29267db96d56Sopenharmony_ciNamedTuple.__mro_entries__ = _namedtuple_mro_entries 29277db96d56Sopenharmony_ci 29287db96d56Sopenharmony_ci 29297db96d56Sopenharmony_ciclass _TypedDictMeta(type): 29307db96d56Sopenharmony_ci def __new__(cls, name, bases, ns, total=True): 29317db96d56Sopenharmony_ci """Create a new typed dict class object. 29327db96d56Sopenharmony_ci 29337db96d56Sopenharmony_ci This method is called when TypedDict is subclassed, 29347db96d56Sopenharmony_ci or when TypedDict is instantiated. This way 29357db96d56Sopenharmony_ci TypedDict supports all three syntax forms described in its docstring. 29367db96d56Sopenharmony_ci Subclasses and instances of TypedDict return actual dictionaries. 29377db96d56Sopenharmony_ci """ 29387db96d56Sopenharmony_ci for base in bases: 29397db96d56Sopenharmony_ci if type(base) is not _TypedDictMeta and base is not Generic: 29407db96d56Sopenharmony_ci raise TypeError('cannot inherit from both a TypedDict type ' 29417db96d56Sopenharmony_ci 'and a non-TypedDict base class') 29427db96d56Sopenharmony_ci 29437db96d56Sopenharmony_ci if any(issubclass(b, Generic) for b in bases): 29447db96d56Sopenharmony_ci generic_base = (Generic,) 29457db96d56Sopenharmony_ci else: 29467db96d56Sopenharmony_ci generic_base = () 29477db96d56Sopenharmony_ci 29487db96d56Sopenharmony_ci tp_dict = type.__new__(_TypedDictMeta, name, (*generic_base, dict), ns) 29497db96d56Sopenharmony_ci 29507db96d56Sopenharmony_ci annotations = {} 29517db96d56Sopenharmony_ci own_annotations = ns.get('__annotations__', {}) 29527db96d56Sopenharmony_ci msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" 29537db96d56Sopenharmony_ci own_annotations = { 29547db96d56Sopenharmony_ci n: _type_check(tp, msg, module=tp_dict.__module__) 29557db96d56Sopenharmony_ci for n, tp in own_annotations.items() 29567db96d56Sopenharmony_ci } 29577db96d56Sopenharmony_ci required_keys = set() 29587db96d56Sopenharmony_ci optional_keys = set() 29597db96d56Sopenharmony_ci 29607db96d56Sopenharmony_ci for base in bases: 29617db96d56Sopenharmony_ci annotations.update(base.__dict__.get('__annotations__', {})) 29627db96d56Sopenharmony_ci required_keys.update(base.__dict__.get('__required_keys__', ())) 29637db96d56Sopenharmony_ci optional_keys.update(base.__dict__.get('__optional_keys__', ())) 29647db96d56Sopenharmony_ci 29657db96d56Sopenharmony_ci annotations.update(own_annotations) 29667db96d56Sopenharmony_ci for annotation_key, annotation_type in own_annotations.items(): 29677db96d56Sopenharmony_ci annotation_origin = get_origin(annotation_type) 29687db96d56Sopenharmony_ci if annotation_origin is Annotated: 29697db96d56Sopenharmony_ci annotation_args = get_args(annotation_type) 29707db96d56Sopenharmony_ci if annotation_args: 29717db96d56Sopenharmony_ci annotation_type = annotation_args[0] 29727db96d56Sopenharmony_ci annotation_origin = get_origin(annotation_type) 29737db96d56Sopenharmony_ci 29747db96d56Sopenharmony_ci if annotation_origin is Required: 29757db96d56Sopenharmony_ci required_keys.add(annotation_key) 29767db96d56Sopenharmony_ci elif annotation_origin is NotRequired: 29777db96d56Sopenharmony_ci optional_keys.add(annotation_key) 29787db96d56Sopenharmony_ci elif total: 29797db96d56Sopenharmony_ci required_keys.add(annotation_key) 29807db96d56Sopenharmony_ci else: 29817db96d56Sopenharmony_ci optional_keys.add(annotation_key) 29827db96d56Sopenharmony_ci 29837db96d56Sopenharmony_ci tp_dict.__annotations__ = annotations 29847db96d56Sopenharmony_ci tp_dict.__required_keys__ = frozenset(required_keys) 29857db96d56Sopenharmony_ci tp_dict.__optional_keys__ = frozenset(optional_keys) 29867db96d56Sopenharmony_ci if not hasattr(tp_dict, '__total__'): 29877db96d56Sopenharmony_ci tp_dict.__total__ = total 29887db96d56Sopenharmony_ci return tp_dict 29897db96d56Sopenharmony_ci 29907db96d56Sopenharmony_ci __call__ = dict # static method 29917db96d56Sopenharmony_ci 29927db96d56Sopenharmony_ci def __subclasscheck__(cls, other): 29937db96d56Sopenharmony_ci # Typed dicts are only for static structural subtyping. 29947db96d56Sopenharmony_ci raise TypeError('TypedDict does not support instance and class checks') 29957db96d56Sopenharmony_ci 29967db96d56Sopenharmony_ci __instancecheck__ = __subclasscheck__ 29977db96d56Sopenharmony_ci 29987db96d56Sopenharmony_ci 29997db96d56Sopenharmony_cidef TypedDict(typename, fields=None, /, *, total=True, **kwargs): 30007db96d56Sopenharmony_ci """A simple typed namespace. At runtime it is equivalent to a plain dict. 30017db96d56Sopenharmony_ci 30027db96d56Sopenharmony_ci TypedDict creates a dictionary type such that a type checker will expect all 30037db96d56Sopenharmony_ci instances to have a certain set of keys, where each key is 30047db96d56Sopenharmony_ci associated with a value of a consistent type. This expectation 30057db96d56Sopenharmony_ci is not checked at runtime. 30067db96d56Sopenharmony_ci 30077db96d56Sopenharmony_ci Usage:: 30087db96d56Sopenharmony_ci 30097db96d56Sopenharmony_ci class Point2D(TypedDict): 30107db96d56Sopenharmony_ci x: int 30117db96d56Sopenharmony_ci y: int 30127db96d56Sopenharmony_ci label: str 30137db96d56Sopenharmony_ci 30147db96d56Sopenharmony_ci a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK 30157db96d56Sopenharmony_ci b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check 30167db96d56Sopenharmony_ci 30177db96d56Sopenharmony_ci assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') 30187db96d56Sopenharmony_ci 30197db96d56Sopenharmony_ci The type info can be accessed via the Point2D.__annotations__ dict, and 30207db96d56Sopenharmony_ci the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets. 30217db96d56Sopenharmony_ci TypedDict supports an additional equivalent form:: 30227db96d56Sopenharmony_ci 30237db96d56Sopenharmony_ci Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) 30247db96d56Sopenharmony_ci 30257db96d56Sopenharmony_ci By default, all keys must be present in a TypedDict. It is possible 30267db96d56Sopenharmony_ci to override this by specifying totality:: 30277db96d56Sopenharmony_ci 30287db96d56Sopenharmony_ci class Point2D(TypedDict, total=False): 30297db96d56Sopenharmony_ci x: int 30307db96d56Sopenharmony_ci y: int 30317db96d56Sopenharmony_ci 30327db96d56Sopenharmony_ci This means that a Point2D TypedDict can have any of the keys omitted. A type 30337db96d56Sopenharmony_ci checker is only expected to support a literal False or True as the value of 30347db96d56Sopenharmony_ci the total argument. True is the default, and makes all items defined in the 30357db96d56Sopenharmony_ci class body be required. 30367db96d56Sopenharmony_ci 30377db96d56Sopenharmony_ci The Required and NotRequired special forms can also be used to mark 30387db96d56Sopenharmony_ci individual keys as being required or not required:: 30397db96d56Sopenharmony_ci 30407db96d56Sopenharmony_ci class Point2D(TypedDict): 30417db96d56Sopenharmony_ci x: int # the "x" key must always be present (Required is the default) 30427db96d56Sopenharmony_ci y: NotRequired[int] # the "y" key can be omitted 30437db96d56Sopenharmony_ci 30447db96d56Sopenharmony_ci See PEP 655 for more details on Required and NotRequired. 30457db96d56Sopenharmony_ci """ 30467db96d56Sopenharmony_ci if fields is None: 30477db96d56Sopenharmony_ci fields = kwargs 30487db96d56Sopenharmony_ci elif kwargs: 30497db96d56Sopenharmony_ci raise TypeError("TypedDict takes either a dict or keyword arguments," 30507db96d56Sopenharmony_ci " but not both") 30517db96d56Sopenharmony_ci if kwargs: 30527db96d56Sopenharmony_ci warnings.warn( 30537db96d56Sopenharmony_ci "The kwargs-based syntax for TypedDict definitions is deprecated " 30547db96d56Sopenharmony_ci "in Python 3.11, will be removed in Python 3.13, and may not be " 30557db96d56Sopenharmony_ci "understood by third-party type checkers.", 30567db96d56Sopenharmony_ci DeprecationWarning, 30577db96d56Sopenharmony_ci stacklevel=2, 30587db96d56Sopenharmony_ci ) 30597db96d56Sopenharmony_ci 30607db96d56Sopenharmony_ci ns = {'__annotations__': dict(fields)} 30617db96d56Sopenharmony_ci module = _caller() 30627db96d56Sopenharmony_ci if module is not None: 30637db96d56Sopenharmony_ci # Setting correct module is necessary to make typed dict classes pickleable. 30647db96d56Sopenharmony_ci ns['__module__'] = module 30657db96d56Sopenharmony_ci 30667db96d56Sopenharmony_ci return _TypedDictMeta(typename, (), ns, total=total) 30677db96d56Sopenharmony_ci 30687db96d56Sopenharmony_ci_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) 30697db96d56Sopenharmony_ciTypedDict.__mro_entries__ = lambda bases: (_TypedDict,) 30707db96d56Sopenharmony_ci 30717db96d56Sopenharmony_ci 30727db96d56Sopenharmony_ci@_SpecialForm 30737db96d56Sopenharmony_cidef Required(self, parameters): 30747db96d56Sopenharmony_ci """Special typing construct to mark a TypedDict key as required. 30757db96d56Sopenharmony_ci 30767db96d56Sopenharmony_ci This is mainly useful for total=False TypedDicts. For example:: 30777db96d56Sopenharmony_ci 30787db96d56Sopenharmony_ci class Movie(TypedDict, total=False): 30797db96d56Sopenharmony_ci title: Required[str] 30807db96d56Sopenharmony_ci year: int 30817db96d56Sopenharmony_ci 30827db96d56Sopenharmony_ci m = Movie( 30837db96d56Sopenharmony_ci title='The Matrix', # typechecker error if key is omitted 30847db96d56Sopenharmony_ci year=1999, 30857db96d56Sopenharmony_ci ) 30867db96d56Sopenharmony_ci 30877db96d56Sopenharmony_ci There is no runtime checking that a required key is actually provided 30887db96d56Sopenharmony_ci when instantiating a related TypedDict. 30897db96d56Sopenharmony_ci """ 30907db96d56Sopenharmony_ci item = _type_check(parameters, f'{self._name} accepts only a single type.') 30917db96d56Sopenharmony_ci return _GenericAlias(self, (item,)) 30927db96d56Sopenharmony_ci 30937db96d56Sopenharmony_ci 30947db96d56Sopenharmony_ci@_SpecialForm 30957db96d56Sopenharmony_cidef NotRequired(self, parameters): 30967db96d56Sopenharmony_ci """Special typing construct to mark a TypedDict key as potentially missing. 30977db96d56Sopenharmony_ci 30987db96d56Sopenharmony_ci For example:: 30997db96d56Sopenharmony_ci 31007db96d56Sopenharmony_ci class Movie(TypedDict): 31017db96d56Sopenharmony_ci title: str 31027db96d56Sopenharmony_ci year: NotRequired[int] 31037db96d56Sopenharmony_ci 31047db96d56Sopenharmony_ci m = Movie( 31057db96d56Sopenharmony_ci title='The Matrix', # typechecker error if key is omitted 31067db96d56Sopenharmony_ci year=1999, 31077db96d56Sopenharmony_ci ) 31087db96d56Sopenharmony_ci """ 31097db96d56Sopenharmony_ci item = _type_check(parameters, f'{self._name} accepts only a single type.') 31107db96d56Sopenharmony_ci return _GenericAlias(self, (item,)) 31117db96d56Sopenharmony_ci 31127db96d56Sopenharmony_ci 31137db96d56Sopenharmony_ciclass NewType: 31147db96d56Sopenharmony_ci """NewType creates simple unique types with almost zero runtime overhead. 31157db96d56Sopenharmony_ci 31167db96d56Sopenharmony_ci NewType(name, tp) is considered a subtype of tp 31177db96d56Sopenharmony_ci by static type checkers. At runtime, NewType(name, tp) returns 31187db96d56Sopenharmony_ci a dummy callable that simply returns its argument. Usage:: 31197db96d56Sopenharmony_ci 31207db96d56Sopenharmony_ci UserId = NewType('UserId', int) 31217db96d56Sopenharmony_ci 31227db96d56Sopenharmony_ci def name_by_id(user_id: UserId) -> str: 31237db96d56Sopenharmony_ci ... 31247db96d56Sopenharmony_ci 31257db96d56Sopenharmony_ci UserId('user') # Fails type check 31267db96d56Sopenharmony_ci 31277db96d56Sopenharmony_ci name_by_id(42) # Fails type check 31287db96d56Sopenharmony_ci name_by_id(UserId(42)) # OK 31297db96d56Sopenharmony_ci 31307db96d56Sopenharmony_ci num = UserId(5) + 1 # type: int 31317db96d56Sopenharmony_ci """ 31327db96d56Sopenharmony_ci 31337db96d56Sopenharmony_ci __call__ = _idfunc 31347db96d56Sopenharmony_ci 31357db96d56Sopenharmony_ci def __init__(self, name, tp): 31367db96d56Sopenharmony_ci self.__qualname__ = name 31377db96d56Sopenharmony_ci if '.' in name: 31387db96d56Sopenharmony_ci name = name.rpartition('.')[-1] 31397db96d56Sopenharmony_ci self.__name__ = name 31407db96d56Sopenharmony_ci self.__supertype__ = tp 31417db96d56Sopenharmony_ci def_mod = _caller() 31427db96d56Sopenharmony_ci if def_mod != 'typing': 31437db96d56Sopenharmony_ci self.__module__ = def_mod 31447db96d56Sopenharmony_ci 31457db96d56Sopenharmony_ci def __mro_entries__(self, bases): 31467db96d56Sopenharmony_ci # We defined __mro_entries__ to get a better error message 31477db96d56Sopenharmony_ci # if a user attempts to subclass a NewType instance. bpo-46170 31487db96d56Sopenharmony_ci superclass_name = self.__name__ 31497db96d56Sopenharmony_ci 31507db96d56Sopenharmony_ci class Dummy: 31517db96d56Sopenharmony_ci def __init_subclass__(cls): 31527db96d56Sopenharmony_ci subclass_name = cls.__name__ 31537db96d56Sopenharmony_ci raise TypeError( 31547db96d56Sopenharmony_ci f"Cannot subclass an instance of NewType. Perhaps you were looking for: " 31557db96d56Sopenharmony_ci f"`{subclass_name} = NewType({subclass_name!r}, {superclass_name})`" 31567db96d56Sopenharmony_ci ) 31577db96d56Sopenharmony_ci 31587db96d56Sopenharmony_ci return (Dummy,) 31597db96d56Sopenharmony_ci 31607db96d56Sopenharmony_ci def __repr__(self): 31617db96d56Sopenharmony_ci return f'{self.__module__}.{self.__qualname__}' 31627db96d56Sopenharmony_ci 31637db96d56Sopenharmony_ci def __reduce__(self): 31647db96d56Sopenharmony_ci return self.__qualname__ 31657db96d56Sopenharmony_ci 31667db96d56Sopenharmony_ci def __or__(self, other): 31677db96d56Sopenharmony_ci return Union[self, other] 31687db96d56Sopenharmony_ci 31697db96d56Sopenharmony_ci def __ror__(self, other): 31707db96d56Sopenharmony_ci return Union[other, self] 31717db96d56Sopenharmony_ci 31727db96d56Sopenharmony_ci 31737db96d56Sopenharmony_ci# Python-version-specific alias (Python 2: unicode; Python 3: str) 31747db96d56Sopenharmony_ciText = str 31757db96d56Sopenharmony_ci 31767db96d56Sopenharmony_ci 31777db96d56Sopenharmony_ci# Constant that's True when type checking, but False here. 31787db96d56Sopenharmony_ciTYPE_CHECKING = False 31797db96d56Sopenharmony_ci 31807db96d56Sopenharmony_ci 31817db96d56Sopenharmony_ciclass IO(Generic[AnyStr]): 31827db96d56Sopenharmony_ci """Generic base class for TextIO and BinaryIO. 31837db96d56Sopenharmony_ci 31847db96d56Sopenharmony_ci This is an abstract, generic version of the return of open(). 31857db96d56Sopenharmony_ci 31867db96d56Sopenharmony_ci NOTE: This does not distinguish between the different possible 31877db96d56Sopenharmony_ci classes (text vs. binary, read vs. write vs. read/write, 31887db96d56Sopenharmony_ci append-only, unbuffered). The TextIO and BinaryIO subclasses 31897db96d56Sopenharmony_ci below capture the distinctions between text vs. binary, which is 31907db96d56Sopenharmony_ci pervasive in the interface; however we currently do not offer a 31917db96d56Sopenharmony_ci way to track the other distinctions in the type system. 31927db96d56Sopenharmony_ci """ 31937db96d56Sopenharmony_ci 31947db96d56Sopenharmony_ci __slots__ = () 31957db96d56Sopenharmony_ci 31967db96d56Sopenharmony_ci @property 31977db96d56Sopenharmony_ci @abstractmethod 31987db96d56Sopenharmony_ci def mode(self) -> str: 31997db96d56Sopenharmony_ci pass 32007db96d56Sopenharmony_ci 32017db96d56Sopenharmony_ci @property 32027db96d56Sopenharmony_ci @abstractmethod 32037db96d56Sopenharmony_ci def name(self) -> str: 32047db96d56Sopenharmony_ci pass 32057db96d56Sopenharmony_ci 32067db96d56Sopenharmony_ci @abstractmethod 32077db96d56Sopenharmony_ci def close(self) -> None: 32087db96d56Sopenharmony_ci pass 32097db96d56Sopenharmony_ci 32107db96d56Sopenharmony_ci @property 32117db96d56Sopenharmony_ci @abstractmethod 32127db96d56Sopenharmony_ci def closed(self) -> bool: 32137db96d56Sopenharmony_ci pass 32147db96d56Sopenharmony_ci 32157db96d56Sopenharmony_ci @abstractmethod 32167db96d56Sopenharmony_ci def fileno(self) -> int: 32177db96d56Sopenharmony_ci pass 32187db96d56Sopenharmony_ci 32197db96d56Sopenharmony_ci @abstractmethod 32207db96d56Sopenharmony_ci def flush(self) -> None: 32217db96d56Sopenharmony_ci pass 32227db96d56Sopenharmony_ci 32237db96d56Sopenharmony_ci @abstractmethod 32247db96d56Sopenharmony_ci def isatty(self) -> bool: 32257db96d56Sopenharmony_ci pass 32267db96d56Sopenharmony_ci 32277db96d56Sopenharmony_ci @abstractmethod 32287db96d56Sopenharmony_ci def read(self, n: int = -1) -> AnyStr: 32297db96d56Sopenharmony_ci pass 32307db96d56Sopenharmony_ci 32317db96d56Sopenharmony_ci @abstractmethod 32327db96d56Sopenharmony_ci def readable(self) -> bool: 32337db96d56Sopenharmony_ci pass 32347db96d56Sopenharmony_ci 32357db96d56Sopenharmony_ci @abstractmethod 32367db96d56Sopenharmony_ci def readline(self, limit: int = -1) -> AnyStr: 32377db96d56Sopenharmony_ci pass 32387db96d56Sopenharmony_ci 32397db96d56Sopenharmony_ci @abstractmethod 32407db96d56Sopenharmony_ci def readlines(self, hint: int = -1) -> List[AnyStr]: 32417db96d56Sopenharmony_ci pass 32427db96d56Sopenharmony_ci 32437db96d56Sopenharmony_ci @abstractmethod 32447db96d56Sopenharmony_ci def seek(self, offset: int, whence: int = 0) -> int: 32457db96d56Sopenharmony_ci pass 32467db96d56Sopenharmony_ci 32477db96d56Sopenharmony_ci @abstractmethod 32487db96d56Sopenharmony_ci def seekable(self) -> bool: 32497db96d56Sopenharmony_ci pass 32507db96d56Sopenharmony_ci 32517db96d56Sopenharmony_ci @abstractmethod 32527db96d56Sopenharmony_ci def tell(self) -> int: 32537db96d56Sopenharmony_ci pass 32547db96d56Sopenharmony_ci 32557db96d56Sopenharmony_ci @abstractmethod 32567db96d56Sopenharmony_ci def truncate(self, size: int = None) -> int: 32577db96d56Sopenharmony_ci pass 32587db96d56Sopenharmony_ci 32597db96d56Sopenharmony_ci @abstractmethod 32607db96d56Sopenharmony_ci def writable(self) -> bool: 32617db96d56Sopenharmony_ci pass 32627db96d56Sopenharmony_ci 32637db96d56Sopenharmony_ci @abstractmethod 32647db96d56Sopenharmony_ci def write(self, s: AnyStr) -> int: 32657db96d56Sopenharmony_ci pass 32667db96d56Sopenharmony_ci 32677db96d56Sopenharmony_ci @abstractmethod 32687db96d56Sopenharmony_ci def writelines(self, lines: List[AnyStr]) -> None: 32697db96d56Sopenharmony_ci pass 32707db96d56Sopenharmony_ci 32717db96d56Sopenharmony_ci @abstractmethod 32727db96d56Sopenharmony_ci def __enter__(self) -> 'IO[AnyStr]': 32737db96d56Sopenharmony_ci pass 32747db96d56Sopenharmony_ci 32757db96d56Sopenharmony_ci @abstractmethod 32767db96d56Sopenharmony_ci def __exit__(self, type, value, traceback) -> None: 32777db96d56Sopenharmony_ci pass 32787db96d56Sopenharmony_ci 32797db96d56Sopenharmony_ci 32807db96d56Sopenharmony_ciclass BinaryIO(IO[bytes]): 32817db96d56Sopenharmony_ci """Typed version of the return of open() in binary mode.""" 32827db96d56Sopenharmony_ci 32837db96d56Sopenharmony_ci __slots__ = () 32847db96d56Sopenharmony_ci 32857db96d56Sopenharmony_ci @abstractmethod 32867db96d56Sopenharmony_ci def write(self, s: Union[bytes, bytearray]) -> int: 32877db96d56Sopenharmony_ci pass 32887db96d56Sopenharmony_ci 32897db96d56Sopenharmony_ci @abstractmethod 32907db96d56Sopenharmony_ci def __enter__(self) -> 'BinaryIO': 32917db96d56Sopenharmony_ci pass 32927db96d56Sopenharmony_ci 32937db96d56Sopenharmony_ci 32947db96d56Sopenharmony_ciclass TextIO(IO[str]): 32957db96d56Sopenharmony_ci """Typed version of the return of open() in text mode.""" 32967db96d56Sopenharmony_ci 32977db96d56Sopenharmony_ci __slots__ = () 32987db96d56Sopenharmony_ci 32997db96d56Sopenharmony_ci @property 33007db96d56Sopenharmony_ci @abstractmethod 33017db96d56Sopenharmony_ci def buffer(self) -> BinaryIO: 33027db96d56Sopenharmony_ci pass 33037db96d56Sopenharmony_ci 33047db96d56Sopenharmony_ci @property 33057db96d56Sopenharmony_ci @abstractmethod 33067db96d56Sopenharmony_ci def encoding(self) -> str: 33077db96d56Sopenharmony_ci pass 33087db96d56Sopenharmony_ci 33097db96d56Sopenharmony_ci @property 33107db96d56Sopenharmony_ci @abstractmethod 33117db96d56Sopenharmony_ci def errors(self) -> Optional[str]: 33127db96d56Sopenharmony_ci pass 33137db96d56Sopenharmony_ci 33147db96d56Sopenharmony_ci @property 33157db96d56Sopenharmony_ci @abstractmethod 33167db96d56Sopenharmony_ci def line_buffering(self) -> bool: 33177db96d56Sopenharmony_ci pass 33187db96d56Sopenharmony_ci 33197db96d56Sopenharmony_ci @property 33207db96d56Sopenharmony_ci @abstractmethod 33217db96d56Sopenharmony_ci def newlines(self) -> Any: 33227db96d56Sopenharmony_ci pass 33237db96d56Sopenharmony_ci 33247db96d56Sopenharmony_ci @abstractmethod 33257db96d56Sopenharmony_ci def __enter__(self) -> 'TextIO': 33267db96d56Sopenharmony_ci pass 33277db96d56Sopenharmony_ci 33287db96d56Sopenharmony_ci 33297db96d56Sopenharmony_ciclass _DeprecatedType(type): 33307db96d56Sopenharmony_ci def __getattribute__(cls, name): 33317db96d56Sopenharmony_ci if name not in ("__dict__", "__module__") and name in cls.__dict__: 33327db96d56Sopenharmony_ci warnings.warn( 33337db96d56Sopenharmony_ci f"{cls.__name__} is deprecated, import directly " 33347db96d56Sopenharmony_ci f"from typing instead. {cls.__name__} will be removed " 33357db96d56Sopenharmony_ci "in Python 3.12.", 33367db96d56Sopenharmony_ci DeprecationWarning, 33377db96d56Sopenharmony_ci stacklevel=2, 33387db96d56Sopenharmony_ci ) 33397db96d56Sopenharmony_ci return super().__getattribute__(name) 33407db96d56Sopenharmony_ci 33417db96d56Sopenharmony_ci 33427db96d56Sopenharmony_ciclass io(metaclass=_DeprecatedType): 33437db96d56Sopenharmony_ci """Wrapper namespace for IO generic classes.""" 33447db96d56Sopenharmony_ci 33457db96d56Sopenharmony_ci __all__ = ['IO', 'TextIO', 'BinaryIO'] 33467db96d56Sopenharmony_ci IO = IO 33477db96d56Sopenharmony_ci TextIO = TextIO 33487db96d56Sopenharmony_ci BinaryIO = BinaryIO 33497db96d56Sopenharmony_ci 33507db96d56Sopenharmony_ci 33517db96d56Sopenharmony_ciio.__name__ = __name__ + '.io' 33527db96d56Sopenharmony_cisys.modules[io.__name__] = io 33537db96d56Sopenharmony_ci 33547db96d56Sopenharmony_ciPattern = _alias(stdlib_re.Pattern, 1) 33557db96d56Sopenharmony_ciMatch = _alias(stdlib_re.Match, 1) 33567db96d56Sopenharmony_ci 33577db96d56Sopenharmony_ciclass re(metaclass=_DeprecatedType): 33587db96d56Sopenharmony_ci """Wrapper namespace for re type aliases.""" 33597db96d56Sopenharmony_ci 33607db96d56Sopenharmony_ci __all__ = ['Pattern', 'Match'] 33617db96d56Sopenharmony_ci Pattern = Pattern 33627db96d56Sopenharmony_ci Match = Match 33637db96d56Sopenharmony_ci 33647db96d56Sopenharmony_ci 33657db96d56Sopenharmony_cire.__name__ = __name__ + '.re' 33667db96d56Sopenharmony_cisys.modules[re.__name__] = re 33677db96d56Sopenharmony_ci 33687db96d56Sopenharmony_ci 33697db96d56Sopenharmony_cidef reveal_type(obj: T, /) -> T: 33707db96d56Sopenharmony_ci """Reveal the inferred type of a variable. 33717db96d56Sopenharmony_ci 33727db96d56Sopenharmony_ci When a static type checker encounters a call to ``reveal_type()``, 33737db96d56Sopenharmony_ci it will emit the inferred type of the argument:: 33747db96d56Sopenharmony_ci 33757db96d56Sopenharmony_ci x: int = 1 33767db96d56Sopenharmony_ci reveal_type(x) 33777db96d56Sopenharmony_ci 33787db96d56Sopenharmony_ci Running a static type checker (e.g., mypy) on this example 33797db96d56Sopenharmony_ci will produce output similar to 'Revealed type is "builtins.int"'. 33807db96d56Sopenharmony_ci 33817db96d56Sopenharmony_ci At runtime, the function prints the runtime type of the 33827db96d56Sopenharmony_ci argument and returns it unchanged. 33837db96d56Sopenharmony_ci """ 33847db96d56Sopenharmony_ci print(f"Runtime type is {type(obj).__name__!r}", file=sys.stderr) 33857db96d56Sopenharmony_ci return obj 33867db96d56Sopenharmony_ci 33877db96d56Sopenharmony_ci 33887db96d56Sopenharmony_cidef dataclass_transform( 33897db96d56Sopenharmony_ci *, 33907db96d56Sopenharmony_ci eq_default: bool = True, 33917db96d56Sopenharmony_ci order_default: bool = False, 33927db96d56Sopenharmony_ci kw_only_default: bool = False, 33937db96d56Sopenharmony_ci field_specifiers: tuple[type[Any] | Callable[..., Any], ...] = (), 33947db96d56Sopenharmony_ci **kwargs: Any, 33957db96d56Sopenharmony_ci) -> Callable[[T], T]: 33967db96d56Sopenharmony_ci """Decorator to mark an object as providing dataclass-like behaviour. 33977db96d56Sopenharmony_ci 33987db96d56Sopenharmony_ci The decorator can be applied to a function, class, or metaclass. 33997db96d56Sopenharmony_ci 34007db96d56Sopenharmony_ci Example usage with a decorator function:: 34017db96d56Sopenharmony_ci 34027db96d56Sopenharmony_ci T = TypeVar("T") 34037db96d56Sopenharmony_ci 34047db96d56Sopenharmony_ci @dataclass_transform() 34057db96d56Sopenharmony_ci def create_model(cls: type[T]) -> type[T]: 34067db96d56Sopenharmony_ci ... 34077db96d56Sopenharmony_ci return cls 34087db96d56Sopenharmony_ci 34097db96d56Sopenharmony_ci @create_model 34107db96d56Sopenharmony_ci class CustomerModel: 34117db96d56Sopenharmony_ci id: int 34127db96d56Sopenharmony_ci name: str 34137db96d56Sopenharmony_ci 34147db96d56Sopenharmony_ci On a base class:: 34157db96d56Sopenharmony_ci 34167db96d56Sopenharmony_ci @dataclass_transform() 34177db96d56Sopenharmony_ci class ModelBase: ... 34187db96d56Sopenharmony_ci 34197db96d56Sopenharmony_ci class CustomerModel(ModelBase): 34207db96d56Sopenharmony_ci id: int 34217db96d56Sopenharmony_ci name: str 34227db96d56Sopenharmony_ci 34237db96d56Sopenharmony_ci On a metaclass:: 34247db96d56Sopenharmony_ci 34257db96d56Sopenharmony_ci @dataclass_transform() 34267db96d56Sopenharmony_ci class ModelMeta(type): ... 34277db96d56Sopenharmony_ci 34287db96d56Sopenharmony_ci class ModelBase(metaclass=ModelMeta): ... 34297db96d56Sopenharmony_ci 34307db96d56Sopenharmony_ci class CustomerModel(ModelBase): 34317db96d56Sopenharmony_ci id: int 34327db96d56Sopenharmony_ci name: str 34337db96d56Sopenharmony_ci 34347db96d56Sopenharmony_ci The ``CustomerModel`` classes defined above will 34357db96d56Sopenharmony_ci be treated by type checkers similarly to classes created with 34367db96d56Sopenharmony_ci ``@dataclasses.dataclass``. 34377db96d56Sopenharmony_ci For example, type checkers will assume these classes have 34387db96d56Sopenharmony_ci ``__init__`` methods that accept ``id`` and ``name``. 34397db96d56Sopenharmony_ci 34407db96d56Sopenharmony_ci The arguments to this decorator can be used to customize this behavior: 34417db96d56Sopenharmony_ci - ``eq_default`` indicates whether the ``eq`` parameter is assumed to be 34427db96d56Sopenharmony_ci ``True`` or ``False`` if it is omitted by the caller. 34437db96d56Sopenharmony_ci - ``order_default`` indicates whether the ``order`` parameter is 34447db96d56Sopenharmony_ci assumed to be True or False if it is omitted by the caller. 34457db96d56Sopenharmony_ci - ``kw_only_default`` indicates whether the ``kw_only`` parameter is 34467db96d56Sopenharmony_ci assumed to be True or False if it is omitted by the caller. 34477db96d56Sopenharmony_ci - ``field_specifiers`` specifies a static list of supported classes 34487db96d56Sopenharmony_ci or functions that describe fields, similar to ``dataclasses.field()``. 34497db96d56Sopenharmony_ci - Arbitrary other keyword arguments are accepted in order to allow for 34507db96d56Sopenharmony_ci possible future extensions. 34517db96d56Sopenharmony_ci 34527db96d56Sopenharmony_ci At runtime, this decorator records its arguments in the 34537db96d56Sopenharmony_ci ``__dataclass_transform__`` attribute on the decorated object. 34547db96d56Sopenharmony_ci It has no other runtime effect. 34557db96d56Sopenharmony_ci 34567db96d56Sopenharmony_ci See PEP 681 for more details. 34577db96d56Sopenharmony_ci """ 34587db96d56Sopenharmony_ci def decorator(cls_or_fn): 34597db96d56Sopenharmony_ci cls_or_fn.__dataclass_transform__ = { 34607db96d56Sopenharmony_ci "eq_default": eq_default, 34617db96d56Sopenharmony_ci "order_default": order_default, 34627db96d56Sopenharmony_ci "kw_only_default": kw_only_default, 34637db96d56Sopenharmony_ci "field_specifiers": field_specifiers, 34647db96d56Sopenharmony_ci "kwargs": kwargs, 34657db96d56Sopenharmony_ci } 34667db96d56Sopenharmony_ci return cls_or_fn 34677db96d56Sopenharmony_ci return decorator 3468