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