1import abc
2import collections
3import collections.abc
4import contextlib
5import functools
6import inspect
7import operator
8import sys
9import types as _types
10import typing
11import warnings
12
13__all__ = [
14    # Super-special typing primitives.
15    'Any',
16    'ClassVar',
17    'Concatenate',
18    'Final',
19    'LiteralString',
20    'ParamSpec',
21    'ParamSpecArgs',
22    'ParamSpecKwargs',
23    'Self',
24    'Type',
25    'TypeVar',
26    'TypeVarTuple',
27    'Unpack',
28
29    # ABCs (from collections.abc).
30    'Awaitable',
31    'AsyncIterator',
32    'AsyncIterable',
33    'Coroutine',
34    'AsyncGenerator',
35    'AsyncContextManager',
36    'Buffer',
37    'ChainMap',
38
39    # Concrete collection types.
40    'ContextManager',
41    'Counter',
42    'Deque',
43    'DefaultDict',
44    'NamedTuple',
45    'OrderedDict',
46    'TypedDict',
47
48    # Structural checks, a.k.a. protocols.
49    'SupportsAbs',
50    'SupportsBytes',
51    'SupportsComplex',
52    'SupportsFloat',
53    'SupportsIndex',
54    'SupportsInt',
55    'SupportsRound',
56
57    # One-off things.
58    'Annotated',
59    'assert_never',
60    'assert_type',
61    'clear_overloads',
62    'dataclass_transform',
63    'deprecated',
64    'Doc',
65    'get_overloads',
66    'final',
67    'get_args',
68    'get_origin',
69    'get_original_bases',
70    'get_protocol_members',
71    'get_type_hints',
72    'IntVar',
73    'is_protocol',
74    'is_typeddict',
75    'Literal',
76    'NewType',
77    'overload',
78    'override',
79    'Protocol',
80    'reveal_type',
81    'runtime',
82    'runtime_checkable',
83    'Text',
84    'TypeAlias',
85    'TypeAliasType',
86    'TypeGuard',
87    'TypeIs',
88    'TYPE_CHECKING',
89    'Never',
90    'NoReturn',
91    'ReadOnly',
92    'Required',
93    'NotRequired',
94
95    # Pure aliases, have always been in typing
96    'AbstractSet',
97    'AnyStr',
98    'BinaryIO',
99    'Callable',
100    'Collection',
101    'Container',
102    'Dict',
103    'ForwardRef',
104    'FrozenSet',
105    'Generator',
106    'Generic',
107    'Hashable',
108    'IO',
109    'ItemsView',
110    'Iterable',
111    'Iterator',
112    'KeysView',
113    'List',
114    'Mapping',
115    'MappingView',
116    'Match',
117    'MutableMapping',
118    'MutableSequence',
119    'MutableSet',
120    'NoDefault',
121    'Optional',
122    'Pattern',
123    'Reversible',
124    'Sequence',
125    'Set',
126    'Sized',
127    'TextIO',
128    'Tuple',
129    'Union',
130    'ValuesView',
131    'cast',
132    'no_type_check',
133    'no_type_check_decorator',
134]
135
136# for backward compatibility
137PEP_560 = True
138GenericMeta = type
139_PEP_696_IMPLEMENTED = sys.version_info >= (3, 13, 0, "beta")
140
141# The functions below are modified copies of typing internal helpers.
142# They are needed by _ProtocolMeta and they provide support for PEP 646.
143
144
145class _Sentinel:
146    def __repr__(self):
147        return "<sentinel>"
148
149
150_marker = _Sentinel()
151
152
153if sys.version_info >= (3, 10):
154    def _should_collect_from_parameters(t):
155        return isinstance(
156            t, (typing._GenericAlias, _types.GenericAlias, _types.UnionType)
157        )
158elif sys.version_info >= (3, 9):
159    def _should_collect_from_parameters(t):
160        return isinstance(t, (typing._GenericAlias, _types.GenericAlias))
161else:
162    def _should_collect_from_parameters(t):
163        return isinstance(t, typing._GenericAlias) and not t._special
164
165
166NoReturn = typing.NoReturn
167
168# Some unconstrained type variables.  These are used by the container types.
169# (These are not for export.)
170T = typing.TypeVar('T')  # Any type.
171KT = typing.TypeVar('KT')  # Key type.
172VT = typing.TypeVar('VT')  # Value type.
173T_co = typing.TypeVar('T_co', covariant=True)  # Any type covariant containers.
174T_contra = typing.TypeVar('T_contra', contravariant=True)  # Ditto contravariant.
175
176
177if sys.version_info >= (3, 11):
178    from typing import Any
179else:
180
181    class _AnyMeta(type):
182        def __instancecheck__(self, obj):
183            if self is Any:
184                raise TypeError("typing_extensions.Any cannot be used with isinstance()")
185            return super().__instancecheck__(obj)
186
187        def __repr__(self):
188            if self is Any:
189                return "typing_extensions.Any"
190            return super().__repr__()
191
192    class Any(metaclass=_AnyMeta):
193        """Special type indicating an unconstrained type.
194        - Any is compatible with every type.
195        - Any assumed to have all methods.
196        - All values assumed to be instances of Any.
197        Note that all the above statements are true from the point of view of
198        static type checkers. At runtime, Any should not be used with instance
199        checks.
200        """
201        def __new__(cls, *args, **kwargs):
202            if cls is Any:
203                raise TypeError("Any cannot be instantiated")
204            return super().__new__(cls, *args, **kwargs)
205
206
207ClassVar = typing.ClassVar
208
209
210class _ExtensionsSpecialForm(typing._SpecialForm, _root=True):
211    def __repr__(self):
212        return 'typing_extensions.' + self._name
213
214
215Final = typing.Final
216
217if sys.version_info >= (3, 11):
218    final = typing.final
219else:
220    # @final exists in 3.8+, but we backport it for all versions
221    # before 3.11 to keep support for the __final__ attribute.
222    # See https://bugs.python.org/issue46342
223    def final(f):
224        """This decorator can be used to indicate to type checkers that
225        the decorated method cannot be overridden, and decorated class
226        cannot be subclassed. For example:
227
228            class Base:
229                @final
230                def done(self) -> None:
231                    ...
232            class Sub(Base):
233                def done(self) -> None:  # Error reported by type checker
234                    ...
235            @final
236            class Leaf:
237                ...
238            class Other(Leaf):  # Error reported by type checker
239                ...
240
241        There is no runtime checking of these properties. The decorator
242        sets the ``__final__`` attribute to ``True`` on the decorated object
243        to allow runtime introspection.
244        """
245        try:
246            f.__final__ = True
247        except (AttributeError, TypeError):
248            # Skip the attribute silently if it is not writable.
249            # AttributeError happens if the object has __slots__ or a
250            # read-only property, TypeError if it's a builtin class.
251            pass
252        return f
253
254
255def IntVar(name):
256    return typing.TypeVar(name)
257
258
259# A Literal bug was fixed in 3.11.0, 3.10.1 and 3.9.8
260if sys.version_info >= (3, 10, 1):
261    Literal = typing.Literal
262else:
263    def _flatten_literal_params(parameters):
264        """An internal helper for Literal creation: flatten Literals among parameters"""
265        params = []
266        for p in parameters:
267            if isinstance(p, _LiteralGenericAlias):
268                params.extend(p.__args__)
269            else:
270                params.append(p)
271        return tuple(params)
272
273    def _value_and_type_iter(params):
274        for p in params:
275            yield p, type(p)
276
277    class _LiteralGenericAlias(typing._GenericAlias, _root=True):
278        def __eq__(self, other):
279            if not isinstance(other, _LiteralGenericAlias):
280                return NotImplemented
281            these_args_deduped = set(_value_and_type_iter(self.__args__))
282            other_args_deduped = set(_value_and_type_iter(other.__args__))
283            return these_args_deduped == other_args_deduped
284
285        def __hash__(self):
286            return hash(frozenset(_value_and_type_iter(self.__args__)))
287
288    class _LiteralForm(_ExtensionsSpecialForm, _root=True):
289        def __init__(self, doc: str):
290            self._name = 'Literal'
291            self._doc = self.__doc__ = doc
292
293        def __getitem__(self, parameters):
294            if not isinstance(parameters, tuple):
295                parameters = (parameters,)
296
297            parameters = _flatten_literal_params(parameters)
298
299            val_type_pairs = list(_value_and_type_iter(parameters))
300            try:
301                deduped_pairs = set(val_type_pairs)
302            except TypeError:
303                # unhashable parameters
304                pass
305            else:
306                # similar logic to typing._deduplicate on Python 3.9+
307                if len(deduped_pairs) < len(val_type_pairs):
308                    new_parameters = []
309                    for pair in val_type_pairs:
310                        if pair in deduped_pairs:
311                            new_parameters.append(pair[0])
312                            deduped_pairs.remove(pair)
313                    assert not deduped_pairs, deduped_pairs
314                    parameters = tuple(new_parameters)
315
316            return _LiteralGenericAlias(self, parameters)
317
318    Literal = _LiteralForm(doc="""\
319                           A type that can be used to indicate to type checkers
320                           that the corresponding value has a value literally equivalent
321                           to the provided parameter. For example:
322
323                               var: Literal[4] = 4
324
325                           The type checker understands that 'var' is literally equal to
326                           the value 4 and no other value.
327
328                           Literal[...] cannot be subclassed. There is no runtime
329                           checking verifying that the parameter is actually a value
330                           instead of a type.""")
331
332
333_overload_dummy = typing._overload_dummy
334
335
336if hasattr(typing, "get_overloads"):  # 3.11+
337    overload = typing.overload
338    get_overloads = typing.get_overloads
339    clear_overloads = typing.clear_overloads
340else:
341    # {module: {qualname: {firstlineno: func}}}
342    _overload_registry = collections.defaultdict(
343        functools.partial(collections.defaultdict, dict)
344    )
345
346    def overload(func):
347        """Decorator for overloaded functions/methods.
348
349        In a stub file, place two or more stub definitions for the same
350        function in a row, each decorated with @overload.  For example:
351
352        @overload
353        def utf8(value: None) -> None: ...
354        @overload
355        def utf8(value: bytes) -> bytes: ...
356        @overload
357        def utf8(value: str) -> bytes: ...
358
359        In a non-stub file (i.e. a regular .py file), do the same but
360        follow it with an implementation.  The implementation should *not*
361        be decorated with @overload.  For example:
362
363        @overload
364        def utf8(value: None) -> None: ...
365        @overload
366        def utf8(value: bytes) -> bytes: ...
367        @overload
368        def utf8(value: str) -> bytes: ...
369        def utf8(value):
370            # implementation goes here
371
372        The overloads for a function can be retrieved at runtime using the
373        get_overloads() function.
374        """
375        # classmethod and staticmethod
376        f = getattr(func, "__func__", func)
377        try:
378            _overload_registry[f.__module__][f.__qualname__][
379                f.__code__.co_firstlineno
380            ] = func
381        except AttributeError:
382            # Not a normal function; ignore.
383            pass
384        return _overload_dummy
385
386    def get_overloads(func):
387        """Return all defined overloads for *func* as a sequence."""
388        # classmethod and staticmethod
389        f = getattr(func, "__func__", func)
390        if f.__module__ not in _overload_registry:
391            return []
392        mod_dict = _overload_registry[f.__module__]
393        if f.__qualname__ not in mod_dict:
394            return []
395        return list(mod_dict[f.__qualname__].values())
396
397    def clear_overloads():
398        """Clear all overloads in the registry."""
399        _overload_registry.clear()
400
401
402# This is not a real generic class.  Don't use outside annotations.
403Type = typing.Type
404
405# Various ABCs mimicking those in collections.abc.
406# A few are simply re-exported for completeness.
407Awaitable = typing.Awaitable
408Coroutine = typing.Coroutine
409AsyncIterable = typing.AsyncIterable
410AsyncIterator = typing.AsyncIterator
411Deque = typing.Deque
412DefaultDict = typing.DefaultDict
413OrderedDict = typing.OrderedDict
414Counter = typing.Counter
415ChainMap = typing.ChainMap
416Text = typing.Text
417TYPE_CHECKING = typing.TYPE_CHECKING
418
419
420if sys.version_info >= (3, 13, 0, "beta"):
421    from typing import AsyncContextManager, AsyncGenerator, ContextManager, Generator
422else:
423    def _is_dunder(attr):
424        return attr.startswith('__') and attr.endswith('__')
425
426    # Python <3.9 doesn't have typing._SpecialGenericAlias
427    _special_generic_alias_base = getattr(
428        typing, "_SpecialGenericAlias", typing._GenericAlias
429    )
430
431    class _SpecialGenericAlias(_special_generic_alias_base, _root=True):
432        def __init__(self, origin, nparams, *, inst=True, name=None, defaults=()):
433            if _special_generic_alias_base is typing._GenericAlias:
434                # Python <3.9
435                self.__origin__ = origin
436                self._nparams = nparams
437                super().__init__(origin, nparams, special=True, inst=inst, name=name)
438            else:
439                # Python >= 3.9
440                super().__init__(origin, nparams, inst=inst, name=name)
441            self._defaults = defaults
442
443        def __setattr__(self, attr, val):
444            allowed_attrs = {'_name', '_inst', '_nparams', '_defaults'}
445            if _special_generic_alias_base is typing._GenericAlias:
446                # Python <3.9
447                allowed_attrs.add("__origin__")
448            if _is_dunder(attr) or attr in allowed_attrs:
449                object.__setattr__(self, attr, val)
450            else:
451                setattr(self.__origin__, attr, val)
452
453        @typing._tp_cache
454        def __getitem__(self, params):
455            if not isinstance(params, tuple):
456                params = (params,)
457            msg = "Parameters to generic types must be types."
458            params = tuple(typing._type_check(p, msg) for p in params)
459            if (
460                self._defaults
461                and len(params) < self._nparams
462                and len(params) + len(self._defaults) >= self._nparams
463            ):
464                params = (*params, *self._defaults[len(params) - self._nparams:])
465            actual_len = len(params)
466
467            if actual_len != self._nparams:
468                if self._defaults:
469                    expected = f"at least {self._nparams - len(self._defaults)}"
470                else:
471                    expected = str(self._nparams)
472                if not self._nparams:
473                    raise TypeError(f"{self} is not a generic class")
474                raise TypeError(
475                    f"Too {'many' if actual_len > self._nparams else 'few'}"
476                    f" arguments for {self};"
477                    f" actual {actual_len}, expected {expected}"
478                )
479            return self.copy_with(params)
480
481    _NoneType = type(None)
482    Generator = _SpecialGenericAlias(
483        collections.abc.Generator, 3, defaults=(_NoneType, _NoneType)
484    )
485    AsyncGenerator = _SpecialGenericAlias(
486        collections.abc.AsyncGenerator, 2, defaults=(_NoneType,)
487    )
488    ContextManager = _SpecialGenericAlias(
489        contextlib.AbstractContextManager,
490        2,
491        name="ContextManager",
492        defaults=(typing.Optional[bool],)
493    )
494    AsyncContextManager = _SpecialGenericAlias(
495        contextlib.AbstractAsyncContextManager,
496        2,
497        name="AsyncContextManager",
498        defaults=(typing.Optional[bool],)
499    )
500
501
502_PROTO_ALLOWLIST = {
503    'collections.abc': [
504        'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
505        'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', 'Buffer',
506    ],
507    'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
508    'typing_extensions': ['Buffer'],
509}
510
511
512_EXCLUDED_ATTRS = frozenset(typing.EXCLUDED_ATTRIBUTES) | {
513    "__match_args__", "__protocol_attrs__", "__non_callable_proto_members__",
514    "__final__",
515}
516
517
518def _get_protocol_attrs(cls):
519    attrs = set()
520    for base in cls.__mro__[:-1]:  # without object
521        if base.__name__ in {'Protocol', 'Generic'}:
522            continue
523        annotations = getattr(base, '__annotations__', {})
524        for attr in (*base.__dict__, *annotations):
525            if (not attr.startswith('_abc_') and attr not in _EXCLUDED_ATTRS):
526                attrs.add(attr)
527    return attrs
528
529
530def _caller(depth=2):
531    try:
532        return sys._getframe(depth).f_globals.get('__name__', '__main__')
533    except (AttributeError, ValueError):  # For platforms without _getframe()
534        return None
535
536
537# `__match_args__` attribute was removed from protocol members in 3.13,
538# we want to backport this change to older Python versions.
539if sys.version_info >= (3, 13):
540    Protocol = typing.Protocol
541else:
542    def _allow_reckless_class_checks(depth=3):
543        """Allow instance and class checks for special stdlib modules.
544        The abc and functools modules indiscriminately call isinstance() and
545        issubclass() on the whole MRO of a user class, which may contain protocols.
546        """
547        return _caller(depth) in {'abc', 'functools', None}
548
549    def _no_init(self, *args, **kwargs):
550        if type(self)._is_protocol:
551            raise TypeError('Protocols cannot be instantiated')
552
553    def _type_check_issubclass_arg_1(arg):
554        """Raise TypeError if `arg` is not an instance of `type`
555        in `issubclass(arg, <protocol>)`.
556
557        In most cases, this is verified by type.__subclasscheck__.
558        Checking it again unnecessarily would slow down issubclass() checks,
559        so, we don't perform this check unless we absolutely have to.
560
561        For various error paths, however,
562        we want to ensure that *this* error message is shown to the user
563        where relevant, rather than a typing.py-specific error message.
564        """
565        if not isinstance(arg, type):
566            # Same error message as for issubclass(1, int).
567            raise TypeError('issubclass() arg 1 must be a class')
568
569    # Inheriting from typing._ProtocolMeta isn't actually desirable,
570    # but is necessary to allow typing.Protocol and typing_extensions.Protocol
571    # to mix without getting TypeErrors about "metaclass conflict"
572    class _ProtocolMeta(type(typing.Protocol)):
573        # This metaclass is somewhat unfortunate,
574        # but is necessary for several reasons...
575        #
576        # NOTE: DO NOT call super() in any methods in this class
577        # That would call the methods on typing._ProtocolMeta on Python 3.8-3.11
578        # and those are slow
579        def __new__(mcls, name, bases, namespace, **kwargs):
580            if name == "Protocol" and len(bases) < 2:
581                pass
582            elif {Protocol, typing.Protocol} & set(bases):
583                for base in bases:
584                    if not (
585                        base in {object, typing.Generic, Protocol, typing.Protocol}
586                        or base.__name__ in _PROTO_ALLOWLIST.get(base.__module__, [])
587                        or is_protocol(base)
588                    ):
589                        raise TypeError(
590                            f"Protocols can only inherit from other protocols, "
591                            f"got {base!r}"
592                        )
593            return abc.ABCMeta.__new__(mcls, name, bases, namespace, **kwargs)
594
595        def __init__(cls, *args, **kwargs):
596            abc.ABCMeta.__init__(cls, *args, **kwargs)
597            if getattr(cls, "_is_protocol", False):
598                cls.__protocol_attrs__ = _get_protocol_attrs(cls)
599
600        def __subclasscheck__(cls, other):
601            if cls is Protocol:
602                return type.__subclasscheck__(cls, other)
603            if (
604                getattr(cls, '_is_protocol', False)
605                and not _allow_reckless_class_checks()
606            ):
607                if not getattr(cls, '_is_runtime_protocol', False):
608                    _type_check_issubclass_arg_1(other)
609                    raise TypeError(
610                        "Instance and class checks can only be used with "
611                        "@runtime_checkable protocols"
612                    )
613                if (
614                    # this attribute is set by @runtime_checkable:
615                    cls.__non_callable_proto_members__
616                    and cls.__dict__.get("__subclasshook__") is _proto_hook
617                ):
618                    _type_check_issubclass_arg_1(other)
619                    non_method_attrs = sorted(cls.__non_callable_proto_members__)
620                    raise TypeError(
621                        "Protocols with non-method members don't support issubclass()."
622                        f" Non-method members: {str(non_method_attrs)[1:-1]}."
623                    )
624            return abc.ABCMeta.__subclasscheck__(cls, other)
625
626        def __instancecheck__(cls, instance):
627            # We need this method for situations where attributes are
628            # assigned in __init__.
629            if cls is Protocol:
630                return type.__instancecheck__(cls, instance)
631            if not getattr(cls, "_is_protocol", False):
632                # i.e., it's a concrete subclass of a protocol
633                return abc.ABCMeta.__instancecheck__(cls, instance)
634
635            if (
636                not getattr(cls, '_is_runtime_protocol', False) and
637                not _allow_reckless_class_checks()
638            ):
639                raise TypeError("Instance and class checks can only be used with"
640                                " @runtime_checkable protocols")
641
642            if abc.ABCMeta.__instancecheck__(cls, instance):
643                return True
644
645            for attr in cls.__protocol_attrs__:
646                try:
647                    val = inspect.getattr_static(instance, attr)
648                except AttributeError:
649                    break
650                # this attribute is set by @runtime_checkable:
651                if val is None and attr not in cls.__non_callable_proto_members__:
652                    break
653            else:
654                return True
655
656            return False
657
658        def __eq__(cls, other):
659            # Hack so that typing.Generic.__class_getitem__
660            # treats typing_extensions.Protocol
661            # as equivalent to typing.Protocol
662            if abc.ABCMeta.__eq__(cls, other) is True:
663                return True
664            return cls is Protocol and other is typing.Protocol
665
666        # This has to be defined, or the abc-module cache
667        # complains about classes with this metaclass being unhashable,
668        # if we define only __eq__!
669        def __hash__(cls) -> int:
670            return type.__hash__(cls)
671
672    @classmethod
673    def _proto_hook(cls, other):
674        if not cls.__dict__.get('_is_protocol', False):
675            return NotImplemented
676
677        for attr in cls.__protocol_attrs__:
678            for base in other.__mro__:
679                # Check if the members appears in the class dictionary...
680                if attr in base.__dict__:
681                    if base.__dict__[attr] is None:
682                        return NotImplemented
683                    break
684
685                # ...or in annotations, if it is a sub-protocol.
686                annotations = getattr(base, '__annotations__', {})
687                if (
688                    isinstance(annotations, collections.abc.Mapping)
689                    and attr in annotations
690                    and is_protocol(other)
691                ):
692                    break
693            else:
694                return NotImplemented
695        return True
696
697    class Protocol(typing.Generic, metaclass=_ProtocolMeta):
698        __doc__ = typing.Protocol.__doc__
699        __slots__ = ()
700        _is_protocol = True
701        _is_runtime_protocol = False
702
703        def __init_subclass__(cls, *args, **kwargs):
704            super().__init_subclass__(*args, **kwargs)
705
706            # Determine if this is a protocol or a concrete subclass.
707            if not cls.__dict__.get('_is_protocol', False):
708                cls._is_protocol = any(b is Protocol for b in cls.__bases__)
709
710            # Set (or override) the protocol subclass hook.
711            if '__subclasshook__' not in cls.__dict__:
712                cls.__subclasshook__ = _proto_hook
713
714            # Prohibit instantiation for protocol classes
715            if cls._is_protocol and cls.__init__ is Protocol.__init__:
716                cls.__init__ = _no_init
717
718
719if sys.version_info >= (3, 13):
720    runtime_checkable = typing.runtime_checkable
721else:
722    def runtime_checkable(cls):
723        """Mark a protocol class as a runtime protocol.
724
725        Such protocol can be used with isinstance() and issubclass().
726        Raise TypeError if applied to a non-protocol class.
727        This allows a simple-minded structural check very similar to
728        one trick ponies in collections.abc such as Iterable.
729
730        For example::
731
732            @runtime_checkable
733            class Closable(Protocol):
734                def close(self): ...
735
736            assert isinstance(open('/some/file'), Closable)
737
738        Warning: this will check only the presence of the required methods,
739        not their type signatures!
740        """
741        if not issubclass(cls, typing.Generic) or not getattr(cls, '_is_protocol', False):
742            raise TypeError(f'@runtime_checkable can be only applied to protocol classes,'
743                            f' got {cls!r}')
744        cls._is_runtime_protocol = True
745
746        # typing.Protocol classes on <=3.11 break if we execute this block,
747        # because typing.Protocol classes on <=3.11 don't have a
748        # `__protocol_attrs__` attribute, and this block relies on the
749        # `__protocol_attrs__` attribute. Meanwhile, typing.Protocol classes on 3.12.2+
750        # break if we *don't* execute this block, because *they* assume that all
751        # protocol classes have a `__non_callable_proto_members__` attribute
752        # (which this block sets)
753        if isinstance(cls, _ProtocolMeta) or sys.version_info >= (3, 12, 2):
754            # PEP 544 prohibits using issubclass()
755            # with protocols that have non-method members.
756            # See gh-113320 for why we compute this attribute here,
757            # rather than in `_ProtocolMeta.__init__`
758            cls.__non_callable_proto_members__ = set()
759            for attr in cls.__protocol_attrs__:
760                try:
761                    is_callable = callable(getattr(cls, attr, None))
762                except Exception as e:
763                    raise TypeError(
764                        f"Failed to determine whether protocol member {attr!r} "
765                        "is a method member"
766                    ) from e
767                else:
768                    if not is_callable:
769                        cls.__non_callable_proto_members__.add(attr)
770
771        return cls
772
773
774# The "runtime" alias exists for backwards compatibility.
775runtime = runtime_checkable
776
777
778# Our version of runtime-checkable protocols is faster on Python 3.8-3.11
779if sys.version_info >= (3, 12):
780    SupportsInt = typing.SupportsInt
781    SupportsFloat = typing.SupportsFloat
782    SupportsComplex = typing.SupportsComplex
783    SupportsBytes = typing.SupportsBytes
784    SupportsIndex = typing.SupportsIndex
785    SupportsAbs = typing.SupportsAbs
786    SupportsRound = typing.SupportsRound
787else:
788    @runtime_checkable
789    class SupportsInt(Protocol):
790        """An ABC with one abstract method __int__."""
791        __slots__ = ()
792
793        @abc.abstractmethod
794        def __int__(self) -> int:
795            pass
796
797    @runtime_checkable
798    class SupportsFloat(Protocol):
799        """An ABC with one abstract method __float__."""
800        __slots__ = ()
801
802        @abc.abstractmethod
803        def __float__(self) -> float:
804            pass
805
806    @runtime_checkable
807    class SupportsComplex(Protocol):
808        """An ABC with one abstract method __complex__."""
809        __slots__ = ()
810
811        @abc.abstractmethod
812        def __complex__(self) -> complex:
813            pass
814
815    @runtime_checkable
816    class SupportsBytes(Protocol):
817        """An ABC with one abstract method __bytes__."""
818        __slots__ = ()
819
820        @abc.abstractmethod
821        def __bytes__(self) -> bytes:
822            pass
823
824    @runtime_checkable
825    class SupportsIndex(Protocol):
826        __slots__ = ()
827
828        @abc.abstractmethod
829        def __index__(self) -> int:
830            pass
831
832    @runtime_checkable
833    class SupportsAbs(Protocol[T_co]):
834        """
835        An ABC with one abstract method __abs__ that is covariant in its return type.
836        """
837        __slots__ = ()
838
839        @abc.abstractmethod
840        def __abs__(self) -> T_co:
841            pass
842
843    @runtime_checkable
844    class SupportsRound(Protocol[T_co]):
845        """
846        An ABC with one abstract method __round__ that is covariant in its return type.
847        """
848        __slots__ = ()
849
850        @abc.abstractmethod
851        def __round__(self, ndigits: int = 0) -> T_co:
852            pass
853
854
855def _ensure_subclassable(mro_entries):
856    def inner(func):
857        if sys.implementation.name == "pypy" and sys.version_info < (3, 9):
858            cls_dict = {
859                "__call__": staticmethod(func),
860                "__mro_entries__": staticmethod(mro_entries)
861            }
862            t = type(func.__name__, (), cls_dict)
863            return functools.update_wrapper(t(), func)
864        else:
865            func.__mro_entries__ = mro_entries
866            return func
867    return inner
868
869
870# Update this to something like >=3.13.0b1 if and when
871# PEP 728 is implemented in CPython
872_PEP_728_IMPLEMENTED = False
873
874if _PEP_728_IMPLEMENTED:
875    # The standard library TypedDict in Python 3.8 does not store runtime information
876    # about which (if any) keys are optional.  See https://bugs.python.org/issue38834
877    # The standard library TypedDict in Python 3.9.0/1 does not honour the "total"
878    # keyword with old-style TypedDict().  See https://bugs.python.org/issue42059
879    # The standard library TypedDict below Python 3.11 does not store runtime
880    # information about optional and required keys when using Required or NotRequired.
881    # Generic TypedDicts are also impossible using typing.TypedDict on Python <3.11.
882    # Aaaand on 3.12 we add __orig_bases__ to TypedDict
883    # to enable better runtime introspection.
884    # On 3.13 we deprecate some odd ways of creating TypedDicts.
885    # Also on 3.13, PEP 705 adds the ReadOnly[] qualifier.
886    # PEP 728 (still pending) makes more changes.
887    TypedDict = typing.TypedDict
888    _TypedDictMeta = typing._TypedDictMeta
889    is_typeddict = typing.is_typeddict
890else:
891    # 3.10.0 and later
892    _TAKES_MODULE = "module" in inspect.signature(typing._type_check).parameters
893
894    def _get_typeddict_qualifiers(annotation_type):
895        while True:
896            annotation_origin = get_origin(annotation_type)
897            if annotation_origin is Annotated:
898                annotation_args = get_args(annotation_type)
899                if annotation_args:
900                    annotation_type = annotation_args[0]
901                else:
902                    break
903            elif annotation_origin is Required:
904                yield Required
905                annotation_type, = get_args(annotation_type)
906            elif annotation_origin is NotRequired:
907                yield NotRequired
908                annotation_type, = get_args(annotation_type)
909            elif annotation_origin is ReadOnly:
910                yield ReadOnly
911                annotation_type, = get_args(annotation_type)
912            else:
913                break
914
915    class _TypedDictMeta(type):
916        def __new__(cls, name, bases, ns, *, total=True, closed=False):
917            """Create new typed dict class object.
918
919            This method is called when TypedDict is subclassed,
920            or when TypedDict is instantiated. This way
921            TypedDict supports all three syntax forms described in its docstring.
922            Subclasses and instances of TypedDict return actual dictionaries.
923            """
924            for base in bases:
925                if type(base) is not _TypedDictMeta and base is not typing.Generic:
926                    raise TypeError('cannot inherit from both a TypedDict type '
927                                    'and a non-TypedDict base class')
928
929            if any(issubclass(b, typing.Generic) for b in bases):
930                generic_base = (typing.Generic,)
931            else:
932                generic_base = ()
933
934            # typing.py generally doesn't let you inherit from plain Generic, unless
935            # the name of the class happens to be "Protocol"
936            tp_dict = type.__new__(_TypedDictMeta, "Protocol", (*generic_base, dict), ns)
937            tp_dict.__name__ = name
938            if tp_dict.__qualname__ == "Protocol":
939                tp_dict.__qualname__ = name
940
941            if not hasattr(tp_dict, '__orig_bases__'):
942                tp_dict.__orig_bases__ = bases
943
944            annotations = {}
945            if "__annotations__" in ns:
946                own_annotations = ns["__annotations__"]
947            elif "__annotate__" in ns:
948                # TODO: Use inspect.VALUE here, and make the annotations lazily evaluated
949                own_annotations = ns["__annotate__"](1)
950            else:
951                own_annotations = {}
952            msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
953            if _TAKES_MODULE:
954                own_annotations = {
955                    n: typing._type_check(tp, msg, module=tp_dict.__module__)
956                    for n, tp in own_annotations.items()
957                }
958            else:
959                own_annotations = {
960                    n: typing._type_check(tp, msg)
961                    for n, tp in own_annotations.items()
962                }
963            required_keys = set()
964            optional_keys = set()
965            readonly_keys = set()
966            mutable_keys = set()
967            extra_items_type = None
968
969            for base in bases:
970                base_dict = base.__dict__
971
972                annotations.update(base_dict.get('__annotations__', {}))
973                required_keys.update(base_dict.get('__required_keys__', ()))
974                optional_keys.update(base_dict.get('__optional_keys__', ()))
975                readonly_keys.update(base_dict.get('__readonly_keys__', ()))
976                mutable_keys.update(base_dict.get('__mutable_keys__', ()))
977                base_extra_items_type = base_dict.get('__extra_items__', None)
978                if base_extra_items_type is not None:
979                    extra_items_type = base_extra_items_type
980
981            if closed and extra_items_type is None:
982                extra_items_type = Never
983            if closed and "__extra_items__" in own_annotations:
984                annotation_type = own_annotations.pop("__extra_items__")
985                qualifiers = set(_get_typeddict_qualifiers(annotation_type))
986                if Required in qualifiers:
987                    raise TypeError(
988                        "Special key __extra_items__ does not support "
989                        "Required"
990                    )
991                if NotRequired in qualifiers:
992                    raise TypeError(
993                        "Special key __extra_items__ does not support "
994                        "NotRequired"
995                    )
996                extra_items_type = annotation_type
997
998            annotations.update(own_annotations)
999            for annotation_key, annotation_type in own_annotations.items():
1000                qualifiers = set(_get_typeddict_qualifiers(annotation_type))
1001
1002                if Required in qualifiers:
1003                    required_keys.add(annotation_key)
1004                elif NotRequired in qualifiers:
1005                    optional_keys.add(annotation_key)
1006                elif total:
1007                    required_keys.add(annotation_key)
1008                else:
1009                    optional_keys.add(annotation_key)
1010                if ReadOnly in qualifiers:
1011                    mutable_keys.discard(annotation_key)
1012                    readonly_keys.add(annotation_key)
1013                else:
1014                    mutable_keys.add(annotation_key)
1015                    readonly_keys.discard(annotation_key)
1016
1017            tp_dict.__annotations__ = annotations
1018            tp_dict.__required_keys__ = frozenset(required_keys)
1019            tp_dict.__optional_keys__ = frozenset(optional_keys)
1020            tp_dict.__readonly_keys__ = frozenset(readonly_keys)
1021            tp_dict.__mutable_keys__ = frozenset(mutable_keys)
1022            if not hasattr(tp_dict, '__total__'):
1023                tp_dict.__total__ = total
1024            tp_dict.__closed__ = closed
1025            tp_dict.__extra_items__ = extra_items_type
1026            return tp_dict
1027
1028        __call__ = dict  # static method
1029
1030        def __subclasscheck__(cls, other):
1031            # Typed dicts are only for static structural subtyping.
1032            raise TypeError('TypedDict does not support instance and class checks')
1033
1034        __instancecheck__ = __subclasscheck__
1035
1036    _TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
1037
1038    @_ensure_subclassable(lambda bases: (_TypedDict,))
1039    def TypedDict(typename, fields=_marker, /, *, total=True, closed=False, **kwargs):
1040        """A simple typed namespace. At runtime it is equivalent to a plain dict.
1041
1042        TypedDict creates a dictionary type such that a type checker will expect all
1043        instances to have a certain set of keys, where each key is
1044        associated with a value of a consistent type. This expectation
1045        is not checked at runtime.
1046
1047        Usage::
1048
1049            class Point2D(TypedDict):
1050                x: int
1051                y: int
1052                label: str
1053
1054            a: Point2D = {'x': 1, 'y': 2, 'label': 'good'}  # OK
1055            b: Point2D = {'z': 3, 'label': 'bad'}           # Fails type check
1056
1057            assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
1058
1059        The type info can be accessed via the Point2D.__annotations__ dict, and
1060        the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
1061        TypedDict supports an additional equivalent form::
1062
1063            Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
1064
1065        By default, all keys must be present in a TypedDict. It is possible
1066        to override this by specifying totality::
1067
1068            class Point2D(TypedDict, total=False):
1069                x: int
1070                y: int
1071
1072        This means that a Point2D TypedDict can have any of the keys omitted. A type
1073        checker is only expected to support a literal False or True as the value of
1074        the total argument. True is the default, and makes all items defined in the
1075        class body be required.
1076
1077        The Required and NotRequired special forms can also be used to mark
1078        individual keys as being required or not required::
1079
1080            class Point2D(TypedDict):
1081                x: int  # the "x" key must always be present (Required is the default)
1082                y: NotRequired[int]  # the "y" key can be omitted
1083
1084        See PEP 655 for more details on Required and NotRequired.
1085        """
1086        if fields is _marker or fields is None:
1087            if fields is _marker:
1088                deprecated_thing = "Failing to pass a value for the 'fields' parameter"
1089            else:
1090                deprecated_thing = "Passing `None` as the 'fields' parameter"
1091
1092            example = f"`{typename} = TypedDict({typename!r}, {{}})`"
1093            deprecation_msg = (
1094                f"{deprecated_thing} is deprecated and will be disallowed in "
1095                "Python 3.15. To create a TypedDict class with 0 fields "
1096                "using the functional syntax, pass an empty dictionary, e.g. "
1097            ) + example + "."
1098            warnings.warn(deprecation_msg, DeprecationWarning, stacklevel=2)
1099            if closed is not False and closed is not True:
1100                kwargs["closed"] = closed
1101                closed = False
1102            fields = kwargs
1103        elif kwargs:
1104            raise TypeError("TypedDict takes either a dict or keyword arguments,"
1105                            " but not both")
1106        if kwargs:
1107            if sys.version_info >= (3, 13):
1108                raise TypeError("TypedDict takes no keyword arguments")
1109            warnings.warn(
1110                "The kwargs-based syntax for TypedDict definitions is deprecated "
1111                "in Python 3.11, will be removed in Python 3.13, and may not be "
1112                "understood by third-party type checkers.",
1113                DeprecationWarning,
1114                stacklevel=2,
1115            )
1116
1117        ns = {'__annotations__': dict(fields)}
1118        module = _caller()
1119        if module is not None:
1120            # Setting correct module is necessary to make typed dict classes pickleable.
1121            ns['__module__'] = module
1122
1123        td = _TypedDictMeta(typename, (), ns, total=total, closed=closed)
1124        td.__orig_bases__ = (TypedDict,)
1125        return td
1126
1127    if hasattr(typing, "_TypedDictMeta"):
1128        _TYPEDDICT_TYPES = (typing._TypedDictMeta, _TypedDictMeta)
1129    else:
1130        _TYPEDDICT_TYPES = (_TypedDictMeta,)
1131
1132    def is_typeddict(tp):
1133        """Check if an annotation is a TypedDict class
1134
1135        For example::
1136            class Film(TypedDict):
1137                title: str
1138                year: int
1139
1140            is_typeddict(Film)  # => True
1141            is_typeddict(Union[list, str])  # => False
1142        """
1143        # On 3.8, this would otherwise return True
1144        if hasattr(typing, "TypedDict") and tp is typing.TypedDict:
1145            return False
1146        return isinstance(tp, _TYPEDDICT_TYPES)
1147
1148
1149if hasattr(typing, "assert_type"):
1150    assert_type = typing.assert_type
1151
1152else:
1153    def assert_type(val, typ, /):
1154        """Assert (to the type checker) that the value is of the given type.
1155
1156        When the type checker encounters a call to assert_type(), it
1157        emits an error if the value is not of the specified type::
1158
1159            def greet(name: str) -> None:
1160                assert_type(name, str)  # ok
1161                assert_type(name, int)  # type checker error
1162
1163        At runtime this returns the first argument unchanged and otherwise
1164        does nothing.
1165        """
1166        return val
1167
1168
1169if hasattr(typing, "ReadOnly"):  # 3.13+
1170    get_type_hints = typing.get_type_hints
1171else:  # <=3.13
1172    # replaces _strip_annotations()
1173    def _strip_extras(t):
1174        """Strips Annotated, Required and NotRequired from a given type."""
1175        if isinstance(t, _AnnotatedAlias):
1176            return _strip_extras(t.__origin__)
1177        if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired, ReadOnly):
1178            return _strip_extras(t.__args__[0])
1179        if isinstance(t, typing._GenericAlias):
1180            stripped_args = tuple(_strip_extras(a) for a in t.__args__)
1181            if stripped_args == t.__args__:
1182                return t
1183            return t.copy_with(stripped_args)
1184        if hasattr(_types, "GenericAlias") and isinstance(t, _types.GenericAlias):
1185            stripped_args = tuple(_strip_extras(a) for a in t.__args__)
1186            if stripped_args == t.__args__:
1187                return t
1188            return _types.GenericAlias(t.__origin__, stripped_args)
1189        if hasattr(_types, "UnionType") and isinstance(t, _types.UnionType):
1190            stripped_args = tuple(_strip_extras(a) for a in t.__args__)
1191            if stripped_args == t.__args__:
1192                return t
1193            return functools.reduce(operator.or_, stripped_args)
1194
1195        return t
1196
1197    def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
1198        """Return type hints for an object.
1199
1200        This is often the same as obj.__annotations__, but it handles
1201        forward references encoded as string literals, adds Optional[t] if a
1202        default value equal to None is set and recursively replaces all
1203        'Annotated[T, ...]', 'Required[T]' or 'NotRequired[T]' with 'T'
1204        (unless 'include_extras=True').
1205
1206        The argument may be a module, class, method, or function. The annotations
1207        are returned as a dictionary. For classes, annotations include also
1208        inherited members.
1209
1210        TypeError is raised if the argument is not of a type that can contain
1211        annotations, and an empty dictionary is returned if no annotations are
1212        present.
1213
1214        BEWARE -- the behavior of globalns and localns is counterintuitive
1215        (unless you are familiar with how eval() and exec() work).  The
1216        search order is locals first, then globals.
1217
1218        - If no dict arguments are passed, an attempt is made to use the
1219          globals from obj (or the respective module's globals for classes),
1220          and these are also used as the locals.  If the object does not appear
1221          to have globals, an empty dictionary is used.
1222
1223        - If one dict argument is passed, it is used for both globals and
1224          locals.
1225
1226        - If two dict arguments are passed, they specify globals and
1227          locals, respectively.
1228        """
1229        if hasattr(typing, "Annotated"):  # 3.9+
1230            hint = typing.get_type_hints(
1231                obj, globalns=globalns, localns=localns, include_extras=True
1232            )
1233        else:  # 3.8
1234            hint = typing.get_type_hints(obj, globalns=globalns, localns=localns)
1235        if include_extras:
1236            return hint
1237        return {k: _strip_extras(t) for k, t in hint.items()}
1238
1239
1240# Python 3.9+ has PEP 593 (Annotated)
1241if hasattr(typing, 'Annotated'):
1242    Annotated = typing.Annotated
1243    # Not exported and not a public API, but needed for get_origin() and get_args()
1244    # to work.
1245    _AnnotatedAlias = typing._AnnotatedAlias
1246# 3.8
1247else:
1248    class _AnnotatedAlias(typing._GenericAlias, _root=True):
1249        """Runtime representation of an annotated type.
1250
1251        At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1252        with extra annotations. The alias behaves like a normal typing alias,
1253        instantiating is the same as instantiating the underlying type, binding
1254        it to types is also the same.
1255        """
1256        def __init__(self, origin, metadata):
1257            if isinstance(origin, _AnnotatedAlias):
1258                metadata = origin.__metadata__ + metadata
1259                origin = origin.__origin__
1260            super().__init__(origin, origin)
1261            self.__metadata__ = metadata
1262
1263        def copy_with(self, params):
1264            assert len(params) == 1
1265            new_type = params[0]
1266            return _AnnotatedAlias(new_type, self.__metadata__)
1267
1268        def __repr__(self):
1269            return (f"typing_extensions.Annotated[{typing._type_repr(self.__origin__)}, "
1270                    f"{', '.join(repr(a) for a in self.__metadata__)}]")
1271
1272        def __reduce__(self):
1273            return operator.getitem, (
1274                Annotated, (self.__origin__, *self.__metadata__)
1275            )
1276
1277        def __eq__(self, other):
1278            if not isinstance(other, _AnnotatedAlias):
1279                return NotImplemented
1280            if self.__origin__ != other.__origin__:
1281                return False
1282            return self.__metadata__ == other.__metadata__
1283
1284        def __hash__(self):
1285            return hash((self.__origin__, self.__metadata__))
1286
1287    class Annotated:
1288        """Add context specific metadata to a type.
1289
1290        Example: Annotated[int, runtime_check.Unsigned] indicates to the
1291        hypothetical runtime_check module that this type is an unsigned int.
1292        Every other consumer of this type can ignore this metadata and treat
1293        this type as int.
1294
1295        The first argument to Annotated must be a valid type (and will be in
1296        the __origin__ field), the remaining arguments are kept as a tuple in
1297        the __extra__ field.
1298
1299        Details:
1300
1301        - It's an error to call `Annotated` with less than two arguments.
1302        - Nested Annotated are flattened::
1303
1304            Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1305
1306        - Instantiating an annotated type is equivalent to instantiating the
1307        underlying type::
1308
1309            Annotated[C, Ann1](5) == C(5)
1310
1311        - Annotated can be used as a generic type alias::
1312
1313            Optimized = Annotated[T, runtime.Optimize()]
1314            Optimized[int] == Annotated[int, runtime.Optimize()]
1315
1316            OptimizedList = Annotated[List[T], runtime.Optimize()]
1317            OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1318        """
1319
1320        __slots__ = ()
1321
1322        def __new__(cls, *args, **kwargs):
1323            raise TypeError("Type Annotated cannot be instantiated.")
1324
1325        @typing._tp_cache
1326        def __class_getitem__(cls, params):
1327            if not isinstance(params, tuple) or len(params) < 2:
1328                raise TypeError("Annotated[...] should be used "
1329                                "with at least two arguments (a type and an "
1330                                "annotation).")
1331            allowed_special_forms = (ClassVar, Final)
1332            if get_origin(params[0]) in allowed_special_forms:
1333                origin = params[0]
1334            else:
1335                msg = "Annotated[t, ...]: t must be a type."
1336                origin = typing._type_check(params[0], msg)
1337            metadata = tuple(params[1:])
1338            return _AnnotatedAlias(origin, metadata)
1339
1340        def __init_subclass__(cls, *args, **kwargs):
1341            raise TypeError(
1342                f"Cannot subclass {cls.__module__}.Annotated"
1343            )
1344
1345# Python 3.8 has get_origin() and get_args() but those implementations aren't
1346# Annotated-aware, so we can't use those. Python 3.9's versions don't support
1347# ParamSpecArgs and ParamSpecKwargs, so only Python 3.10's versions will do.
1348if sys.version_info[:2] >= (3, 10):
1349    get_origin = typing.get_origin
1350    get_args = typing.get_args
1351# 3.8-3.9
1352else:
1353    try:
1354        # 3.9+
1355        from typing import _BaseGenericAlias
1356    except ImportError:
1357        _BaseGenericAlias = typing._GenericAlias
1358    try:
1359        # 3.9+
1360        from typing import GenericAlias as _typing_GenericAlias
1361    except ImportError:
1362        _typing_GenericAlias = typing._GenericAlias
1363
1364    def get_origin(tp):
1365        """Get the unsubscripted version of a type.
1366
1367        This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1368        and Annotated. Return None for unsupported types. Examples::
1369
1370            get_origin(Literal[42]) is Literal
1371            get_origin(int) is None
1372            get_origin(ClassVar[int]) is ClassVar
1373            get_origin(Generic) is Generic
1374            get_origin(Generic[T]) is Generic
1375            get_origin(Union[T, int]) is Union
1376            get_origin(List[Tuple[T, T]][int]) == list
1377            get_origin(P.args) is P
1378        """
1379        if isinstance(tp, _AnnotatedAlias):
1380            return Annotated
1381        if isinstance(tp, (typing._GenericAlias, _typing_GenericAlias, _BaseGenericAlias,
1382                           ParamSpecArgs, ParamSpecKwargs)):
1383            return tp.__origin__
1384        if tp is typing.Generic:
1385            return typing.Generic
1386        return None
1387
1388    def get_args(tp):
1389        """Get type arguments with all substitutions performed.
1390
1391        For unions, basic simplifications used by Union constructor are performed.
1392        Examples::
1393            get_args(Dict[str, int]) == (str, int)
1394            get_args(int) == ()
1395            get_args(Union[int, Union[T, int], str][int]) == (int, str)
1396            get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1397            get_args(Callable[[], T][int]) == ([], int)
1398        """
1399        if isinstance(tp, _AnnotatedAlias):
1400            return (tp.__origin__, *tp.__metadata__)
1401        if isinstance(tp, (typing._GenericAlias, _typing_GenericAlias)):
1402            if getattr(tp, "_special", False):
1403                return ()
1404            res = tp.__args__
1405            if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis:
1406                res = (list(res[:-1]), res[-1])
1407            return res
1408        return ()
1409
1410
1411# 3.10+
1412if hasattr(typing, 'TypeAlias'):
1413    TypeAlias = typing.TypeAlias
1414# 3.9
1415elif sys.version_info[:2] >= (3, 9):
1416    @_ExtensionsSpecialForm
1417    def TypeAlias(self, parameters):
1418        """Special marker indicating that an assignment should
1419        be recognized as a proper type alias definition by type
1420        checkers.
1421
1422        For example::
1423
1424            Predicate: TypeAlias = Callable[..., bool]
1425
1426        It's invalid when used anywhere except as in the example above.
1427        """
1428        raise TypeError(f"{self} is not subscriptable")
1429# 3.8
1430else:
1431    TypeAlias = _ExtensionsSpecialForm(
1432        'TypeAlias',
1433        doc="""Special marker indicating that an assignment should
1434        be recognized as a proper type alias definition by type
1435        checkers.
1436
1437        For example::
1438
1439            Predicate: TypeAlias = Callable[..., bool]
1440
1441        It's invalid when used anywhere except as in the example
1442        above."""
1443    )
1444
1445
1446if hasattr(typing, "NoDefault"):
1447    NoDefault = typing.NoDefault
1448else:
1449    class NoDefaultTypeMeta(type):
1450        def __setattr__(cls, attr, value):
1451            # TypeError is consistent with the behavior of NoneType
1452            raise TypeError(
1453                f"cannot set {attr!r} attribute of immutable type {cls.__name__!r}"
1454            )
1455
1456    class NoDefaultType(metaclass=NoDefaultTypeMeta):
1457        """The type of the NoDefault singleton."""
1458
1459        __slots__ = ()
1460
1461        def __new__(cls):
1462            return globals().get("NoDefault") or object.__new__(cls)
1463
1464        def __repr__(self):
1465            return "typing_extensions.NoDefault"
1466
1467        def __reduce__(self):
1468            return "NoDefault"
1469
1470    NoDefault = NoDefaultType()
1471    del NoDefaultType, NoDefaultTypeMeta
1472
1473
1474def _set_default(type_param, default):
1475    type_param.has_default = lambda: default is not NoDefault
1476    type_param.__default__ = default
1477
1478
1479def _set_module(typevarlike):
1480    # for pickling:
1481    def_mod = _caller(depth=3)
1482    if def_mod != 'typing_extensions':
1483        typevarlike.__module__ = def_mod
1484
1485
1486class _DefaultMixin:
1487    """Mixin for TypeVarLike defaults."""
1488
1489    __slots__ = ()
1490    __init__ = _set_default
1491
1492
1493# Classes using this metaclass must provide a _backported_typevarlike ClassVar
1494class _TypeVarLikeMeta(type):
1495    def __instancecheck__(cls, __instance: Any) -> bool:
1496        return isinstance(__instance, cls._backported_typevarlike)
1497
1498
1499if _PEP_696_IMPLEMENTED:
1500    from typing import TypeVar
1501else:
1502    # Add default and infer_variance parameters from PEP 696 and 695
1503    class TypeVar(metaclass=_TypeVarLikeMeta):
1504        """Type variable."""
1505
1506        _backported_typevarlike = typing.TypeVar
1507
1508        def __new__(cls, name, *constraints, bound=None,
1509                    covariant=False, contravariant=False,
1510                    default=NoDefault, infer_variance=False):
1511            if hasattr(typing, "TypeAliasType"):
1512                # PEP 695 implemented (3.12+), can pass infer_variance to typing.TypeVar
1513                typevar = typing.TypeVar(name, *constraints, bound=bound,
1514                                         covariant=covariant, contravariant=contravariant,
1515                                         infer_variance=infer_variance)
1516            else:
1517                typevar = typing.TypeVar(name, *constraints, bound=bound,
1518                                         covariant=covariant, contravariant=contravariant)
1519                if infer_variance and (covariant or contravariant):
1520                    raise ValueError("Variance cannot be specified with infer_variance.")
1521                typevar.__infer_variance__ = infer_variance
1522
1523            _set_default(typevar, default)
1524            _set_module(typevar)
1525
1526            def _tvar_prepare_subst(alias, args):
1527                if (
1528                    typevar.has_default()
1529                    and alias.__parameters__.index(typevar) == len(args)
1530                ):
1531                    args += (typevar.__default__,)
1532                return args
1533
1534            typevar.__typing_prepare_subst__ = _tvar_prepare_subst
1535            return typevar
1536
1537        def __init_subclass__(cls) -> None:
1538            raise TypeError(f"type '{__name__}.TypeVar' is not an acceptable base type")
1539
1540
1541# Python 3.10+ has PEP 612
1542if hasattr(typing, 'ParamSpecArgs'):
1543    ParamSpecArgs = typing.ParamSpecArgs
1544    ParamSpecKwargs = typing.ParamSpecKwargs
1545# 3.8-3.9
1546else:
1547    class _Immutable:
1548        """Mixin to indicate that object should not be copied."""
1549        __slots__ = ()
1550
1551        def __copy__(self):
1552            return self
1553
1554        def __deepcopy__(self, memo):
1555            return self
1556
1557    class ParamSpecArgs(_Immutable):
1558        """The args for a ParamSpec object.
1559
1560        Given a ParamSpec object P, P.args is an instance of ParamSpecArgs.
1561
1562        ParamSpecArgs objects have a reference back to their ParamSpec:
1563
1564        P.args.__origin__ is P
1565
1566        This type is meant for runtime introspection and has no special meaning to
1567        static type checkers.
1568        """
1569        def __init__(self, origin):
1570            self.__origin__ = origin
1571
1572        def __repr__(self):
1573            return f"{self.__origin__.__name__}.args"
1574
1575        def __eq__(self, other):
1576            if not isinstance(other, ParamSpecArgs):
1577                return NotImplemented
1578            return self.__origin__ == other.__origin__
1579
1580    class ParamSpecKwargs(_Immutable):
1581        """The kwargs for a ParamSpec object.
1582
1583        Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs.
1584
1585        ParamSpecKwargs objects have a reference back to their ParamSpec:
1586
1587        P.kwargs.__origin__ is P
1588
1589        This type is meant for runtime introspection and has no special meaning to
1590        static type checkers.
1591        """
1592        def __init__(self, origin):
1593            self.__origin__ = origin
1594
1595        def __repr__(self):
1596            return f"{self.__origin__.__name__}.kwargs"
1597
1598        def __eq__(self, other):
1599            if not isinstance(other, ParamSpecKwargs):
1600                return NotImplemented
1601            return self.__origin__ == other.__origin__
1602
1603
1604if _PEP_696_IMPLEMENTED:
1605    from typing import ParamSpec
1606
1607# 3.10+
1608elif hasattr(typing, 'ParamSpec'):
1609
1610    # Add default parameter - PEP 696
1611    class ParamSpec(metaclass=_TypeVarLikeMeta):
1612        """Parameter specification."""
1613
1614        _backported_typevarlike = typing.ParamSpec
1615
1616        def __new__(cls, name, *, bound=None,
1617                    covariant=False, contravariant=False,
1618                    infer_variance=False, default=NoDefault):
1619            if hasattr(typing, "TypeAliasType"):
1620                # PEP 695 implemented, can pass infer_variance to typing.TypeVar
1621                paramspec = typing.ParamSpec(name, bound=bound,
1622                                             covariant=covariant,
1623                                             contravariant=contravariant,
1624                                             infer_variance=infer_variance)
1625            else:
1626                paramspec = typing.ParamSpec(name, bound=bound,
1627                                             covariant=covariant,
1628                                             contravariant=contravariant)
1629                paramspec.__infer_variance__ = infer_variance
1630
1631            _set_default(paramspec, default)
1632            _set_module(paramspec)
1633
1634            def _paramspec_prepare_subst(alias, args):
1635                params = alias.__parameters__
1636                i = params.index(paramspec)
1637                if i == len(args) and paramspec.has_default():
1638                    args = [*args, paramspec.__default__]
1639                if i >= len(args):
1640                    raise TypeError(f"Too few arguments for {alias}")
1641                # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612.
1642                if len(params) == 1 and not typing._is_param_expr(args[0]):
1643                    assert i == 0
1644                    args = (args,)
1645                # Convert lists to tuples to help other libraries cache the results.
1646                elif isinstance(args[i], list):
1647                    args = (*args[:i], tuple(args[i]), *args[i + 1:])
1648                return args
1649
1650            paramspec.__typing_prepare_subst__ = _paramspec_prepare_subst
1651            return paramspec
1652
1653        def __init_subclass__(cls) -> None:
1654            raise TypeError(f"type '{__name__}.ParamSpec' is not an acceptable base type")
1655
1656# 3.8-3.9
1657else:
1658
1659    # Inherits from list as a workaround for Callable checks in Python < 3.9.2.
1660    class ParamSpec(list, _DefaultMixin):
1661        """Parameter specification variable.
1662
1663        Usage::
1664
1665           P = ParamSpec('P')
1666
1667        Parameter specification variables exist primarily for the benefit of static
1668        type checkers.  They are used to forward the parameter types of one
1669        callable to another callable, a pattern commonly found in higher order
1670        functions and decorators.  They are only valid when used in ``Concatenate``,
1671        or s the first argument to ``Callable``. In Python 3.10 and higher,
1672        they are also supported in user-defined Generics at runtime.
1673        See class Generic for more information on generic types.  An
1674        example for annotating a decorator::
1675
1676           T = TypeVar('T')
1677           P = ParamSpec('P')
1678
1679           def add_logging(f: Callable[P, T]) -> Callable[P, T]:
1680               '''A type-safe decorator to add logging to a function.'''
1681               def inner(*args: P.args, **kwargs: P.kwargs) -> T:
1682                   logging.info(f'{f.__name__} was called')
1683                   return f(*args, **kwargs)
1684               return inner
1685
1686           @add_logging
1687           def add_two(x: float, y: float) -> float:
1688               '''Add two numbers together.'''
1689               return x + y
1690
1691        Parameter specification variables defined with covariant=True or
1692        contravariant=True can be used to declare covariant or contravariant
1693        generic types.  These keyword arguments are valid, but their actual semantics
1694        are yet to be decided.  See PEP 612 for details.
1695
1696        Parameter specification variables can be introspected. e.g.:
1697
1698           P.__name__ == 'T'
1699           P.__bound__ == None
1700           P.__covariant__ == False
1701           P.__contravariant__ == False
1702
1703        Note that only parameter specification variables defined in global scope can
1704        be pickled.
1705        """
1706
1707        # Trick Generic __parameters__.
1708        __class__ = typing.TypeVar
1709
1710        @property
1711        def args(self):
1712            return ParamSpecArgs(self)
1713
1714        @property
1715        def kwargs(self):
1716            return ParamSpecKwargs(self)
1717
1718        def __init__(self, name, *, bound=None, covariant=False, contravariant=False,
1719                     infer_variance=False, default=NoDefault):
1720            list.__init__(self, [self])
1721            self.__name__ = name
1722            self.__covariant__ = bool(covariant)
1723            self.__contravariant__ = bool(contravariant)
1724            self.__infer_variance__ = bool(infer_variance)
1725            if bound:
1726                self.__bound__ = typing._type_check(bound, 'Bound must be a type.')
1727            else:
1728                self.__bound__ = None
1729            _DefaultMixin.__init__(self, default)
1730
1731            # for pickling:
1732            def_mod = _caller()
1733            if def_mod != 'typing_extensions':
1734                self.__module__ = def_mod
1735
1736        def __repr__(self):
1737            if self.__infer_variance__:
1738                prefix = ''
1739            elif self.__covariant__:
1740                prefix = '+'
1741            elif self.__contravariant__:
1742                prefix = '-'
1743            else:
1744                prefix = '~'
1745            return prefix + self.__name__
1746
1747        def __hash__(self):
1748            return object.__hash__(self)
1749
1750        def __eq__(self, other):
1751            return self is other
1752
1753        def __reduce__(self):
1754            return self.__name__
1755
1756        # Hack to get typing._type_check to pass.
1757        def __call__(self, *args, **kwargs):
1758            pass
1759
1760
1761# 3.8-3.9
1762if not hasattr(typing, 'Concatenate'):
1763    # Inherits from list as a workaround for Callable checks in Python < 3.9.2.
1764    class _ConcatenateGenericAlias(list):
1765
1766        # Trick Generic into looking into this for __parameters__.
1767        __class__ = typing._GenericAlias
1768
1769        # Flag in 3.8.
1770        _special = False
1771
1772        def __init__(self, origin, args):
1773            super().__init__(args)
1774            self.__origin__ = origin
1775            self.__args__ = args
1776
1777        def __repr__(self):
1778            _type_repr = typing._type_repr
1779            return (f'{_type_repr(self.__origin__)}'
1780                    f'[{", ".join(_type_repr(arg) for arg in self.__args__)}]')
1781
1782        def __hash__(self):
1783            return hash((self.__origin__, self.__args__))
1784
1785        # Hack to get typing._type_check to pass in Generic.
1786        def __call__(self, *args, **kwargs):
1787            pass
1788
1789        @property
1790        def __parameters__(self):
1791            return tuple(
1792                tp for tp in self.__args__ if isinstance(tp, (typing.TypeVar, ParamSpec))
1793            )
1794
1795
1796# 3.8-3.9
1797@typing._tp_cache
1798def _concatenate_getitem(self, parameters):
1799    if parameters == ():
1800        raise TypeError("Cannot take a Concatenate of no types.")
1801    if not isinstance(parameters, tuple):
1802        parameters = (parameters,)
1803    if not isinstance(parameters[-1], ParamSpec):
1804        raise TypeError("The last parameter to Concatenate should be a "
1805                        "ParamSpec variable.")
1806    msg = "Concatenate[arg, ...]: each arg must be a type."
1807    parameters = tuple(typing._type_check(p, msg) for p in parameters)
1808    return _ConcatenateGenericAlias(self, parameters)
1809
1810
1811# 3.10+
1812if hasattr(typing, 'Concatenate'):
1813    Concatenate = typing.Concatenate
1814    _ConcatenateGenericAlias = typing._ConcatenateGenericAlias
1815# 3.9
1816elif sys.version_info[:2] >= (3, 9):
1817    @_ExtensionsSpecialForm
1818    def Concatenate(self, parameters):
1819        """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a
1820        higher order function which adds, removes or transforms parameters of a
1821        callable.
1822
1823        For example::
1824
1825           Callable[Concatenate[int, P], int]
1826
1827        See PEP 612 for detailed information.
1828        """
1829        return _concatenate_getitem(self, parameters)
1830# 3.8
1831else:
1832    class _ConcatenateForm(_ExtensionsSpecialForm, _root=True):
1833        def __getitem__(self, parameters):
1834            return _concatenate_getitem(self, parameters)
1835
1836    Concatenate = _ConcatenateForm(
1837        'Concatenate',
1838        doc="""Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a
1839        higher order function which adds, removes or transforms parameters of a
1840        callable.
1841
1842        For example::
1843
1844           Callable[Concatenate[int, P], int]
1845
1846        See PEP 612 for detailed information.
1847        """)
1848
1849# 3.10+
1850if hasattr(typing, 'TypeGuard'):
1851    TypeGuard = typing.TypeGuard
1852# 3.9
1853elif sys.version_info[:2] >= (3, 9):
1854    @_ExtensionsSpecialForm
1855    def TypeGuard(self, parameters):
1856        """Special typing form used to annotate the return type of a user-defined
1857        type guard function.  ``TypeGuard`` only accepts a single type argument.
1858        At runtime, functions marked this way should return a boolean.
1859
1860        ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static
1861        type checkers to determine a more precise type of an expression within a
1862        program's code flow.  Usually type narrowing is done by analyzing
1863        conditional code flow and applying the narrowing to a block of code.  The
1864        conditional expression here is sometimes referred to as a "type guard".
1865
1866        Sometimes it would be convenient to use a user-defined boolean function
1867        as a type guard.  Such a function should use ``TypeGuard[...]`` as its
1868        return type to alert static type checkers to this intention.
1869
1870        Using  ``-> TypeGuard`` tells the static type checker that for a given
1871        function:
1872
1873        1. The return value is a boolean.
1874        2. If the return value is ``True``, the type of its argument
1875        is the type inside ``TypeGuard``.
1876
1877        For example::
1878
1879            def is_str(val: Union[str, float]):
1880                # "isinstance" type guard
1881                if isinstance(val, str):
1882                    # Type of ``val`` is narrowed to ``str``
1883                    ...
1884                else:
1885                    # Else, type of ``val`` is narrowed to ``float``.
1886                    ...
1887
1888        Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower
1889        form of ``TypeA`` (it can even be a wider form) and this may lead to
1890        type-unsafe results.  The main reason is to allow for things like
1891        narrowing ``List[object]`` to ``List[str]`` even though the latter is not
1892        a subtype of the former, since ``List`` is invariant.  The responsibility of
1893        writing type-safe type guards is left to the user.
1894
1895        ``TypeGuard`` also works with type variables.  For more information, see
1896        PEP 647 (User-Defined Type Guards).
1897        """
1898        item = typing._type_check(parameters, f'{self} accepts only a single type.')
1899        return typing._GenericAlias(self, (item,))
1900# 3.8
1901else:
1902    class _TypeGuardForm(_ExtensionsSpecialForm, _root=True):
1903        def __getitem__(self, parameters):
1904            item = typing._type_check(parameters,
1905                                      f'{self._name} accepts only a single type')
1906            return typing._GenericAlias(self, (item,))
1907
1908    TypeGuard = _TypeGuardForm(
1909        'TypeGuard',
1910        doc="""Special typing form used to annotate the return type of a user-defined
1911        type guard function.  ``TypeGuard`` only accepts a single type argument.
1912        At runtime, functions marked this way should return a boolean.
1913
1914        ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static
1915        type checkers to determine a more precise type of an expression within a
1916        program's code flow.  Usually type narrowing is done by analyzing
1917        conditional code flow and applying the narrowing to a block of code.  The
1918        conditional expression here is sometimes referred to as a "type guard".
1919
1920        Sometimes it would be convenient to use a user-defined boolean function
1921        as a type guard.  Such a function should use ``TypeGuard[...]`` as its
1922        return type to alert static type checkers to this intention.
1923
1924        Using  ``-> TypeGuard`` tells the static type checker that for a given
1925        function:
1926
1927        1. The return value is a boolean.
1928        2. If the return value is ``True``, the type of its argument
1929        is the type inside ``TypeGuard``.
1930
1931        For example::
1932
1933            def is_str(val: Union[str, float]):
1934                # "isinstance" type guard
1935                if isinstance(val, str):
1936                    # Type of ``val`` is narrowed to ``str``
1937                    ...
1938                else:
1939                    # Else, type of ``val`` is narrowed to ``float``.
1940                    ...
1941
1942        Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower
1943        form of ``TypeA`` (it can even be a wider form) and this may lead to
1944        type-unsafe results.  The main reason is to allow for things like
1945        narrowing ``List[object]`` to ``List[str]`` even though the latter is not
1946        a subtype of the former, since ``List`` is invariant.  The responsibility of
1947        writing type-safe type guards is left to the user.
1948
1949        ``TypeGuard`` also works with type variables.  For more information, see
1950        PEP 647 (User-Defined Type Guards).
1951        """)
1952
1953# 3.13+
1954if hasattr(typing, 'TypeIs'):
1955    TypeIs = typing.TypeIs
1956# 3.9
1957elif sys.version_info[:2] >= (3, 9):
1958    @_ExtensionsSpecialForm
1959    def TypeIs(self, parameters):
1960        """Special typing form used to annotate the return type of a user-defined
1961        type narrower function.  ``TypeIs`` only accepts a single type argument.
1962        At runtime, functions marked this way should return a boolean.
1963
1964        ``TypeIs`` aims to benefit *type narrowing* -- a technique used by static
1965        type checkers to determine a more precise type of an expression within a
1966        program's code flow.  Usually type narrowing is done by analyzing
1967        conditional code flow and applying the narrowing to a block of code.  The
1968        conditional expression here is sometimes referred to as a "type guard".
1969
1970        Sometimes it would be convenient to use a user-defined boolean function
1971        as a type guard.  Such a function should use ``TypeIs[...]`` as its
1972        return type to alert static type checkers to this intention.
1973
1974        Using  ``-> TypeIs`` tells the static type checker that for a given
1975        function:
1976
1977        1. The return value is a boolean.
1978        2. If the return value is ``True``, the type of its argument
1979        is the intersection of the type inside ``TypeGuard`` and the argument's
1980        previously known type.
1981
1982        For example::
1983
1984            def is_awaitable(val: object) -> TypeIs[Awaitable[Any]]:
1985                return hasattr(val, '__await__')
1986
1987            def f(val: Union[int, Awaitable[int]]) -> int:
1988                if is_awaitable(val):
1989                    assert_type(val, Awaitable[int])
1990                else:
1991                    assert_type(val, int)
1992
1993        ``TypeIs`` also works with type variables.  For more information, see
1994        PEP 742 (Narrowing types with TypeIs).
1995        """
1996        item = typing._type_check(parameters, f'{self} accepts only a single type.')
1997        return typing._GenericAlias(self, (item,))
1998# 3.8
1999else:
2000    class _TypeIsForm(_ExtensionsSpecialForm, _root=True):
2001        def __getitem__(self, parameters):
2002            item = typing._type_check(parameters,
2003                                      f'{self._name} accepts only a single type')
2004            return typing._GenericAlias(self, (item,))
2005
2006    TypeIs = _TypeIsForm(
2007        'TypeIs',
2008        doc="""Special typing form used to annotate the return type of a user-defined
2009        type narrower function.  ``TypeIs`` only accepts a single type argument.
2010        At runtime, functions marked this way should return a boolean.
2011
2012        ``TypeIs`` aims to benefit *type narrowing* -- a technique used by static
2013        type checkers to determine a more precise type of an expression within a
2014        program's code flow.  Usually type narrowing is done by analyzing
2015        conditional code flow and applying the narrowing to a block of code.  The
2016        conditional expression here is sometimes referred to as a "type guard".
2017
2018        Sometimes it would be convenient to use a user-defined boolean function
2019        as a type guard.  Such a function should use ``TypeIs[...]`` as its
2020        return type to alert static type checkers to this intention.
2021
2022        Using  ``-> TypeIs`` tells the static type checker that for a given
2023        function:
2024
2025        1. The return value is a boolean.
2026        2. If the return value is ``True``, the type of its argument
2027        is the intersection of the type inside ``TypeGuard`` and the argument's
2028        previously known type.
2029
2030        For example::
2031
2032            def is_awaitable(val: object) -> TypeIs[Awaitable[Any]]:
2033                return hasattr(val, '__await__')
2034
2035            def f(val: Union[int, Awaitable[int]]) -> int:
2036                if is_awaitable(val):
2037                    assert_type(val, Awaitable[int])
2038                else:
2039                    assert_type(val, int)
2040
2041        ``TypeIs`` also works with type variables.  For more information, see
2042        PEP 742 (Narrowing types with TypeIs).
2043        """)
2044
2045
2046# Vendored from cpython typing._SpecialFrom
2047class _SpecialForm(typing._Final, _root=True):
2048    __slots__ = ('_name', '__doc__', '_getitem')
2049
2050    def __init__(self, getitem):
2051        self._getitem = getitem
2052        self._name = getitem.__name__
2053        self.__doc__ = getitem.__doc__
2054
2055    def __getattr__(self, item):
2056        if item in {'__name__', '__qualname__'}:
2057            return self._name
2058
2059        raise AttributeError(item)
2060
2061    def __mro_entries__(self, bases):
2062        raise TypeError(f"Cannot subclass {self!r}")
2063
2064    def __repr__(self):
2065        return f'typing_extensions.{self._name}'
2066
2067    def __reduce__(self):
2068        return self._name
2069
2070    def __call__(self, *args, **kwds):
2071        raise TypeError(f"Cannot instantiate {self!r}")
2072
2073    def __or__(self, other):
2074        return typing.Union[self, other]
2075
2076    def __ror__(self, other):
2077        return typing.Union[other, self]
2078
2079    def __instancecheck__(self, obj):
2080        raise TypeError(f"{self} cannot be used with isinstance()")
2081
2082    def __subclasscheck__(self, cls):
2083        raise TypeError(f"{self} cannot be used with issubclass()")
2084
2085    @typing._tp_cache
2086    def __getitem__(self, parameters):
2087        return self._getitem(self, parameters)
2088
2089
2090if hasattr(typing, "LiteralString"):  # 3.11+
2091    LiteralString = typing.LiteralString
2092else:
2093    @_SpecialForm
2094    def LiteralString(self, params):
2095        """Represents an arbitrary literal string.
2096
2097        Example::
2098
2099          from typing_extensions import LiteralString
2100
2101          def query(sql: LiteralString) -> ...:
2102              ...
2103
2104          query("SELECT * FROM table")  # ok
2105          query(f"SELECT * FROM {input()}")  # not ok
2106
2107        See PEP 675 for details.
2108
2109        """
2110        raise TypeError(f"{self} is not subscriptable")
2111
2112
2113if hasattr(typing, "Self"):  # 3.11+
2114    Self = typing.Self
2115else:
2116    @_SpecialForm
2117    def Self(self, params):
2118        """Used to spell the type of "self" in classes.
2119
2120        Example::
2121
2122          from typing import Self
2123
2124          class ReturnsSelf:
2125              def parse(self, data: bytes) -> Self:
2126                  ...
2127                  return self
2128
2129        """
2130
2131        raise TypeError(f"{self} is not subscriptable")
2132
2133
2134if hasattr(typing, "Never"):  # 3.11+
2135    Never = typing.Never
2136else:
2137    @_SpecialForm
2138    def Never(self, params):
2139        """The bottom type, a type that has no members.
2140
2141        This can be used to define a function that should never be
2142        called, or a function that never returns::
2143
2144            from typing_extensions import Never
2145
2146            def never_call_me(arg: Never) -> None:
2147                pass
2148
2149            def int_or_str(arg: int | str) -> None:
2150                never_call_me(arg)  # type checker error
2151                match arg:
2152                    case int():
2153                        print("It's an int")
2154                    case str():
2155                        print("It's a str")
2156                    case _:
2157                        never_call_me(arg)  # ok, arg is of type Never
2158
2159        """
2160
2161        raise TypeError(f"{self} is not subscriptable")
2162
2163
2164if hasattr(typing, 'Required'):  # 3.11+
2165    Required = typing.Required
2166    NotRequired = typing.NotRequired
2167elif sys.version_info[:2] >= (3, 9):  # 3.9-3.10
2168    @_ExtensionsSpecialForm
2169    def Required(self, parameters):
2170        """A special typing construct to mark a key of a total=False TypedDict
2171        as required. For example:
2172
2173            class Movie(TypedDict, total=False):
2174                title: Required[str]
2175                year: int
2176
2177            m = Movie(
2178                title='The Matrix',  # typechecker error if key is omitted
2179                year=1999,
2180            )
2181
2182        There is no runtime checking that a required key is actually provided
2183        when instantiating a related TypedDict.
2184        """
2185        item = typing._type_check(parameters, f'{self._name} accepts only a single type.')
2186        return typing._GenericAlias(self, (item,))
2187
2188    @_ExtensionsSpecialForm
2189    def NotRequired(self, parameters):
2190        """A special typing construct to mark a key of a TypedDict as
2191        potentially missing. For example:
2192
2193            class Movie(TypedDict):
2194                title: str
2195                year: NotRequired[int]
2196
2197            m = Movie(
2198                title='The Matrix',  # typechecker error if key is omitted
2199                year=1999,
2200            )
2201        """
2202        item = typing._type_check(parameters, f'{self._name} accepts only a single type.')
2203        return typing._GenericAlias(self, (item,))
2204
2205else:  # 3.8
2206    class _RequiredForm(_ExtensionsSpecialForm, _root=True):
2207        def __getitem__(self, parameters):
2208            item = typing._type_check(parameters,
2209                                      f'{self._name} accepts only a single type.')
2210            return typing._GenericAlias(self, (item,))
2211
2212    Required = _RequiredForm(
2213        'Required',
2214        doc="""A special typing construct to mark a key of a total=False TypedDict
2215        as required. For example:
2216
2217            class Movie(TypedDict, total=False):
2218                title: Required[str]
2219                year: int
2220
2221            m = Movie(
2222                title='The Matrix',  # typechecker error if key is omitted
2223                year=1999,
2224            )
2225
2226        There is no runtime checking that a required key is actually provided
2227        when instantiating a related TypedDict.
2228        """)
2229    NotRequired = _RequiredForm(
2230        'NotRequired',
2231        doc="""A special typing construct to mark a key of a TypedDict as
2232        potentially missing. For example:
2233
2234            class Movie(TypedDict):
2235                title: str
2236                year: NotRequired[int]
2237
2238            m = Movie(
2239                title='The Matrix',  # typechecker error if key is omitted
2240                year=1999,
2241            )
2242        """)
2243
2244
2245if hasattr(typing, 'ReadOnly'):
2246    ReadOnly = typing.ReadOnly
2247elif sys.version_info[:2] >= (3, 9):  # 3.9-3.12
2248    @_ExtensionsSpecialForm
2249    def ReadOnly(self, parameters):
2250        """A special typing construct to mark an item of a TypedDict as read-only.
2251
2252        For example:
2253
2254            class Movie(TypedDict):
2255                title: ReadOnly[str]
2256                year: int
2257
2258            def mutate_movie(m: Movie) -> None:
2259                m["year"] = 1992  # allowed
2260                m["title"] = "The Matrix"  # typechecker error
2261
2262        There is no runtime checking for this property.
2263        """
2264        item = typing._type_check(parameters, f'{self._name} accepts only a single type.')
2265        return typing._GenericAlias(self, (item,))
2266
2267else:  # 3.8
2268    class _ReadOnlyForm(_ExtensionsSpecialForm, _root=True):
2269        def __getitem__(self, parameters):
2270            item = typing._type_check(parameters,
2271                                      f'{self._name} accepts only a single type.')
2272            return typing._GenericAlias(self, (item,))
2273
2274    ReadOnly = _ReadOnlyForm(
2275        'ReadOnly',
2276        doc="""A special typing construct to mark a key of a TypedDict as read-only.
2277
2278        For example:
2279
2280            class Movie(TypedDict):
2281                title: ReadOnly[str]
2282                year: int
2283
2284            def mutate_movie(m: Movie) -> None:
2285                m["year"] = 1992  # allowed
2286                m["title"] = "The Matrix"  # typechecker error
2287
2288        There is no runtime checking for this propery.
2289        """)
2290
2291
2292_UNPACK_DOC = """\
2293Type unpack operator.
2294
2295The type unpack operator takes the child types from some container type,
2296such as `tuple[int, str]` or a `TypeVarTuple`, and 'pulls them out'. For
2297example:
2298
2299  # For some generic class `Foo`:
2300  Foo[Unpack[tuple[int, str]]]  # Equivalent to Foo[int, str]
2301
2302  Ts = TypeVarTuple('Ts')
2303  # Specifies that `Bar` is generic in an arbitrary number of types.
2304  # (Think of `Ts` as a tuple of an arbitrary number of individual
2305  #  `TypeVar`s, which the `Unpack` is 'pulling out' directly into the
2306  #  `Generic[]`.)
2307  class Bar(Generic[Unpack[Ts]]): ...
2308  Bar[int]  # Valid
2309  Bar[int, str]  # Also valid
2310
2311From Python 3.11, this can also be done using the `*` operator:
2312
2313    Foo[*tuple[int, str]]
2314    class Bar(Generic[*Ts]): ...
2315
2316The operator can also be used along with a `TypedDict` to annotate
2317`**kwargs` in a function signature. For instance:
2318
2319  class Movie(TypedDict):
2320    name: str
2321    year: int
2322
2323  # This function expects two keyword arguments - *name* of type `str` and
2324  # *year* of type `int`.
2325  def foo(**kwargs: Unpack[Movie]): ...
2326
2327Note that there is only some runtime checking of this operator. Not
2328everything the runtime allows may be accepted by static type checkers.
2329
2330For more information, see PEP 646 and PEP 692.
2331"""
2332
2333
2334if sys.version_info >= (3, 12):  # PEP 692 changed the repr of Unpack[]
2335    Unpack = typing.Unpack
2336
2337    def _is_unpack(obj):
2338        return get_origin(obj) is Unpack
2339
2340elif sys.version_info[:2] >= (3, 9):  # 3.9+
2341    class _UnpackSpecialForm(_ExtensionsSpecialForm, _root=True):
2342        def __init__(self, getitem):
2343            super().__init__(getitem)
2344            self.__doc__ = _UNPACK_DOC
2345
2346    class _UnpackAlias(typing._GenericAlias, _root=True):
2347        __class__ = typing.TypeVar
2348
2349        @property
2350        def __typing_unpacked_tuple_args__(self):
2351            assert self.__origin__ is Unpack
2352            assert len(self.__args__) == 1
2353            arg, = self.__args__
2354            if isinstance(arg, (typing._GenericAlias, _types.GenericAlias)):
2355                if arg.__origin__ is not tuple:
2356                    raise TypeError("Unpack[...] must be used with a tuple type")
2357                return arg.__args__
2358            return None
2359
2360    @_UnpackSpecialForm
2361    def Unpack(self, parameters):
2362        item = typing._type_check(parameters, f'{self._name} accepts only a single type.')
2363        return _UnpackAlias(self, (item,))
2364
2365    def _is_unpack(obj):
2366        return isinstance(obj, _UnpackAlias)
2367
2368else:  # 3.8
2369    class _UnpackAlias(typing._GenericAlias, _root=True):
2370        __class__ = typing.TypeVar
2371
2372    class _UnpackForm(_ExtensionsSpecialForm, _root=True):
2373        def __getitem__(self, parameters):
2374            item = typing._type_check(parameters,
2375                                      f'{self._name} accepts only a single type.')
2376            return _UnpackAlias(self, (item,))
2377
2378    Unpack = _UnpackForm('Unpack', doc=_UNPACK_DOC)
2379
2380    def _is_unpack(obj):
2381        return isinstance(obj, _UnpackAlias)
2382
2383
2384if _PEP_696_IMPLEMENTED:
2385    from typing import TypeVarTuple
2386
2387elif hasattr(typing, "TypeVarTuple"):  # 3.11+
2388
2389    def _unpack_args(*args):
2390        newargs = []
2391        for arg in args:
2392            subargs = getattr(arg, '__typing_unpacked_tuple_args__', None)
2393            if subargs is not None and not (subargs and subargs[-1] is ...):
2394                newargs.extend(subargs)
2395            else:
2396                newargs.append(arg)
2397        return newargs
2398
2399    # Add default parameter - PEP 696
2400    class TypeVarTuple(metaclass=_TypeVarLikeMeta):
2401        """Type variable tuple."""
2402
2403        _backported_typevarlike = typing.TypeVarTuple
2404
2405        def __new__(cls, name, *, default=NoDefault):
2406            tvt = typing.TypeVarTuple(name)
2407            _set_default(tvt, default)
2408            _set_module(tvt)
2409
2410            def _typevartuple_prepare_subst(alias, args):
2411                params = alias.__parameters__
2412                typevartuple_index = params.index(tvt)
2413                for param in params[typevartuple_index + 1:]:
2414                    if isinstance(param, TypeVarTuple):
2415                        raise TypeError(
2416                            f"More than one TypeVarTuple parameter in {alias}"
2417                        )
2418
2419                alen = len(args)
2420                plen = len(params)
2421                left = typevartuple_index
2422                right = plen - typevartuple_index - 1
2423                var_tuple_index = None
2424                fillarg = None
2425                for k, arg in enumerate(args):
2426                    if not isinstance(arg, type):
2427                        subargs = getattr(arg, '__typing_unpacked_tuple_args__', None)
2428                        if subargs and len(subargs) == 2 and subargs[-1] is ...:
2429                            if var_tuple_index is not None:
2430                                raise TypeError(
2431                                    "More than one unpacked "
2432                                    "arbitrary-length tuple argument"
2433                                )
2434                            var_tuple_index = k
2435                            fillarg = subargs[0]
2436                if var_tuple_index is not None:
2437                    left = min(left, var_tuple_index)
2438                    right = min(right, alen - var_tuple_index - 1)
2439                elif left + right > alen:
2440                    raise TypeError(f"Too few arguments for {alias};"
2441                                    f" actual {alen}, expected at least {plen - 1}")
2442                if left == alen - right and tvt.has_default():
2443                    replacement = _unpack_args(tvt.__default__)
2444                else:
2445                    replacement = args[left: alen - right]
2446
2447                return (
2448                    *args[:left],
2449                    *([fillarg] * (typevartuple_index - left)),
2450                    replacement,
2451                    *([fillarg] * (plen - right - left - typevartuple_index - 1)),
2452                    *args[alen - right:],
2453                )
2454
2455            tvt.__typing_prepare_subst__ = _typevartuple_prepare_subst
2456            return tvt
2457
2458        def __init_subclass__(self, *args, **kwds):
2459            raise TypeError("Cannot subclass special typing classes")
2460
2461else:  # <=3.10
2462    class TypeVarTuple(_DefaultMixin):
2463        """Type variable tuple.
2464
2465        Usage::
2466
2467            Ts = TypeVarTuple('Ts')
2468
2469        In the same way that a normal type variable is a stand-in for a single
2470        type such as ``int``, a type variable *tuple* is a stand-in for a *tuple*
2471        type such as ``Tuple[int, str]``.
2472
2473        Type variable tuples can be used in ``Generic`` declarations.
2474        Consider the following example::
2475
2476            class Array(Generic[*Ts]): ...
2477
2478        The ``Ts`` type variable tuple here behaves like ``tuple[T1, T2]``,
2479        where ``T1`` and ``T2`` are type variables. To use these type variables
2480        as type parameters of ``Array``, we must *unpack* the type variable tuple using
2481        the star operator: ``*Ts``. The signature of ``Array`` then behaves
2482        as if we had simply written ``class Array(Generic[T1, T2]): ...``.
2483        In contrast to ``Generic[T1, T2]``, however, ``Generic[*Shape]`` allows
2484        us to parameterise the class with an *arbitrary* number of type parameters.
2485
2486        Type variable tuples can be used anywhere a normal ``TypeVar`` can.
2487        This includes class definitions, as shown above, as well as function
2488        signatures and variable annotations::
2489
2490            class Array(Generic[*Ts]):
2491
2492                def __init__(self, shape: Tuple[*Ts]):
2493                    self._shape: Tuple[*Ts] = shape
2494
2495                def get_shape(self) -> Tuple[*Ts]:
2496                    return self._shape
2497
2498            shape = (Height(480), Width(640))
2499            x: Array[Height, Width] = Array(shape)
2500            y = abs(x)  # Inferred type is Array[Height, Width]
2501            z = x + x   #        ...    is Array[Height, Width]
2502            x.get_shape()  #     ...    is tuple[Height, Width]
2503
2504        """
2505
2506        # Trick Generic __parameters__.
2507        __class__ = typing.TypeVar
2508
2509        def __iter__(self):
2510            yield self.__unpacked__
2511
2512        def __init__(self, name, *, default=NoDefault):
2513            self.__name__ = name
2514            _DefaultMixin.__init__(self, default)
2515
2516            # for pickling:
2517            def_mod = _caller()
2518            if def_mod != 'typing_extensions':
2519                self.__module__ = def_mod
2520
2521            self.__unpacked__ = Unpack[self]
2522
2523        def __repr__(self):
2524            return self.__name__
2525
2526        def __hash__(self):
2527            return object.__hash__(self)
2528
2529        def __eq__(self, other):
2530            return self is other
2531
2532        def __reduce__(self):
2533            return self.__name__
2534
2535        def __init_subclass__(self, *args, **kwds):
2536            if '_root' not in kwds:
2537                raise TypeError("Cannot subclass special typing classes")
2538
2539
2540if hasattr(typing, "reveal_type"):  # 3.11+
2541    reveal_type = typing.reveal_type
2542else:  # <=3.10
2543    def reveal_type(obj: T, /) -> T:
2544        """Reveal the inferred type of a variable.
2545
2546        When a static type checker encounters a call to ``reveal_type()``,
2547        it will emit the inferred type of the argument::
2548
2549            x: int = 1
2550            reveal_type(x)
2551
2552        Running a static type checker (e.g., ``mypy``) on this example
2553        will produce output similar to 'Revealed type is "builtins.int"'.
2554
2555        At runtime, the function prints the runtime type of the
2556        argument and returns it unchanged.
2557
2558        """
2559        print(f"Runtime type is {type(obj).__name__!r}", file=sys.stderr)
2560        return obj
2561
2562
2563if hasattr(typing, "_ASSERT_NEVER_REPR_MAX_LENGTH"):  # 3.11+
2564    _ASSERT_NEVER_REPR_MAX_LENGTH = typing._ASSERT_NEVER_REPR_MAX_LENGTH
2565else:  # <=3.10
2566    _ASSERT_NEVER_REPR_MAX_LENGTH = 100
2567
2568
2569if hasattr(typing, "assert_never"):  # 3.11+
2570    assert_never = typing.assert_never
2571else:  # <=3.10
2572    def assert_never(arg: Never, /) -> Never:
2573        """Assert to the type checker that a line of code is unreachable.
2574
2575        Example::
2576
2577            def int_or_str(arg: int | str) -> None:
2578                match arg:
2579                    case int():
2580                        print("It's an int")
2581                    case str():
2582                        print("It's a str")
2583                    case _:
2584                        assert_never(arg)
2585
2586        If a type checker finds that a call to assert_never() is
2587        reachable, it will emit an error.
2588
2589        At runtime, this throws an exception when called.
2590
2591        """
2592        value = repr(arg)
2593        if len(value) > _ASSERT_NEVER_REPR_MAX_LENGTH:
2594            value = value[:_ASSERT_NEVER_REPR_MAX_LENGTH] + '...'
2595        raise AssertionError(f"Expected code to be unreachable, but got: {value}")
2596
2597
2598if sys.version_info >= (3, 12):  # 3.12+
2599    # dataclass_transform exists in 3.11 but lacks the frozen_default parameter
2600    dataclass_transform = typing.dataclass_transform
2601else:  # <=3.11
2602    def dataclass_transform(
2603        *,
2604        eq_default: bool = True,
2605        order_default: bool = False,
2606        kw_only_default: bool = False,
2607        frozen_default: bool = False,
2608        field_specifiers: typing.Tuple[
2609            typing.Union[typing.Type[typing.Any], typing.Callable[..., typing.Any]],
2610            ...
2611        ] = (),
2612        **kwargs: typing.Any,
2613    ) -> typing.Callable[[T], T]:
2614        """Decorator that marks a function, class, or metaclass as providing
2615        dataclass-like behavior.
2616
2617        Example:
2618
2619            from typing_extensions import dataclass_transform
2620
2621            _T = TypeVar("_T")
2622
2623            # Used on a decorator function
2624            @dataclass_transform()
2625            def create_model(cls: type[_T]) -> type[_T]:
2626                ...
2627                return cls
2628
2629            @create_model
2630            class CustomerModel:
2631                id: int
2632                name: str
2633
2634            # Used on a base class
2635            @dataclass_transform()
2636            class ModelBase: ...
2637
2638            class CustomerModel(ModelBase):
2639                id: int
2640                name: str
2641
2642            # Used on a metaclass
2643            @dataclass_transform()
2644            class ModelMeta(type): ...
2645
2646            class ModelBase(metaclass=ModelMeta): ...
2647
2648            class CustomerModel(ModelBase):
2649                id: int
2650                name: str
2651
2652        Each of the ``CustomerModel`` classes defined in this example will now
2653        behave similarly to a dataclass created with the ``@dataclasses.dataclass``
2654        decorator. For example, the type checker will synthesize an ``__init__``
2655        method.
2656
2657        The arguments to this decorator can be used to customize this behavior:
2658        - ``eq_default`` indicates whether the ``eq`` parameter is assumed to be
2659          True or False if it is omitted by the caller.
2660        - ``order_default`` indicates whether the ``order`` parameter is
2661          assumed to be True or False if it is omitted by the caller.
2662        - ``kw_only_default`` indicates whether the ``kw_only`` parameter is
2663          assumed to be True or False if it is omitted by the caller.
2664        - ``frozen_default`` indicates whether the ``frozen`` parameter is
2665          assumed to be True or False if it is omitted by the caller.
2666        - ``field_specifiers`` specifies a static list of supported classes
2667          or functions that describe fields, similar to ``dataclasses.field()``.
2668
2669        At runtime, this decorator records its arguments in the
2670        ``__dataclass_transform__`` attribute on the decorated object.
2671
2672        See PEP 681 for details.
2673
2674        """
2675        def decorator(cls_or_fn):
2676            cls_or_fn.__dataclass_transform__ = {
2677                "eq_default": eq_default,
2678                "order_default": order_default,
2679                "kw_only_default": kw_only_default,
2680                "frozen_default": frozen_default,
2681                "field_specifiers": field_specifiers,
2682                "kwargs": kwargs,
2683            }
2684            return cls_or_fn
2685        return decorator
2686
2687
2688if hasattr(typing, "override"):  # 3.12+
2689    override = typing.override
2690else:  # <=3.11
2691    _F = typing.TypeVar("_F", bound=typing.Callable[..., typing.Any])
2692
2693    def override(arg: _F, /) -> _F:
2694        """Indicate that a method is intended to override a method in a base class.
2695
2696        Usage:
2697
2698            class Base:
2699                def method(self) -> None:
2700                    pass
2701
2702            class Child(Base):
2703                @override
2704                def method(self) -> None:
2705                    super().method()
2706
2707        When this decorator is applied to a method, the type checker will
2708        validate that it overrides a method with the same name on a base class.
2709        This helps prevent bugs that may occur when a base class is changed
2710        without an equivalent change to a child class.
2711
2712        There is no runtime checking of these properties. The decorator
2713        sets the ``__override__`` attribute to ``True`` on the decorated object
2714        to allow runtime introspection.
2715
2716        See PEP 698 for details.
2717
2718        """
2719        try:
2720            arg.__override__ = True
2721        except (AttributeError, TypeError):
2722            # Skip the attribute silently if it is not writable.
2723            # AttributeError happens if the object has __slots__ or a
2724            # read-only property, TypeError if it's a builtin class.
2725            pass
2726        return arg
2727
2728
2729if hasattr(warnings, "deprecated"):
2730    deprecated = warnings.deprecated
2731else:
2732    _T = typing.TypeVar("_T")
2733
2734    class deprecated:
2735        """Indicate that a class, function or overload is deprecated.
2736
2737        When this decorator is applied to an object, the type checker
2738        will generate a diagnostic on usage of the deprecated object.
2739
2740        Usage:
2741
2742            @deprecated("Use B instead")
2743            class A:
2744                pass
2745
2746            @deprecated("Use g instead")
2747            def f():
2748                pass
2749
2750            @overload
2751            @deprecated("int support is deprecated")
2752            def g(x: int) -> int: ...
2753            @overload
2754            def g(x: str) -> int: ...
2755
2756        The warning specified by *category* will be emitted at runtime
2757        on use of deprecated objects. For functions, that happens on calls;
2758        for classes, on instantiation and on creation of subclasses.
2759        If the *category* is ``None``, no warning is emitted at runtime.
2760        The *stacklevel* determines where the
2761        warning is emitted. If it is ``1`` (the default), the warning
2762        is emitted at the direct caller of the deprecated object; if it
2763        is higher, it is emitted further up the stack.
2764        Static type checker behavior is not affected by the *category*
2765        and *stacklevel* arguments.
2766
2767        The deprecation message passed to the decorator is saved in the
2768        ``__deprecated__`` attribute on the decorated object.
2769        If applied to an overload, the decorator
2770        must be after the ``@overload`` decorator for the attribute to
2771        exist on the overload as returned by ``get_overloads()``.
2772
2773        See PEP 702 for details.
2774
2775        """
2776        def __init__(
2777            self,
2778            message: str,
2779            /,
2780            *,
2781            category: typing.Optional[typing.Type[Warning]] = DeprecationWarning,
2782            stacklevel: int = 1,
2783        ) -> None:
2784            if not isinstance(message, str):
2785                raise TypeError(
2786                    "Expected an object of type str for 'message', not "
2787                    f"{type(message).__name__!r}"
2788                )
2789            self.message = message
2790            self.category = category
2791            self.stacklevel = stacklevel
2792
2793        def __call__(self, arg: _T, /) -> _T:
2794            # Make sure the inner functions created below don't
2795            # retain a reference to self.
2796            msg = self.message
2797            category = self.category
2798            stacklevel = self.stacklevel
2799            if category is None:
2800                arg.__deprecated__ = msg
2801                return arg
2802            elif isinstance(arg, type):
2803                import functools
2804                from types import MethodType
2805
2806                original_new = arg.__new__
2807
2808                @functools.wraps(original_new)
2809                def __new__(cls, *args, **kwargs):
2810                    if cls is arg:
2811                        warnings.warn(msg, category=category, stacklevel=stacklevel + 1)
2812                    if original_new is not object.__new__:
2813                        return original_new(cls, *args, **kwargs)
2814                    # Mirrors a similar check in object.__new__.
2815                    elif cls.__init__ is object.__init__ and (args or kwargs):
2816                        raise TypeError(f"{cls.__name__}() takes no arguments")
2817                    else:
2818                        return original_new(cls)
2819
2820                arg.__new__ = staticmethod(__new__)
2821
2822                original_init_subclass = arg.__init_subclass__
2823                # We need slightly different behavior if __init_subclass__
2824                # is a bound method (likely if it was implemented in Python)
2825                if isinstance(original_init_subclass, MethodType):
2826                    original_init_subclass = original_init_subclass.__func__
2827
2828                    @functools.wraps(original_init_subclass)
2829                    def __init_subclass__(*args, **kwargs):
2830                        warnings.warn(msg, category=category, stacklevel=stacklevel + 1)
2831                        return original_init_subclass(*args, **kwargs)
2832
2833                    arg.__init_subclass__ = classmethod(__init_subclass__)
2834                # Or otherwise, which likely means it's a builtin such as
2835                # object's implementation of __init_subclass__.
2836                else:
2837                    @functools.wraps(original_init_subclass)
2838                    def __init_subclass__(*args, **kwargs):
2839                        warnings.warn(msg, category=category, stacklevel=stacklevel + 1)
2840                        return original_init_subclass(*args, **kwargs)
2841
2842                    arg.__init_subclass__ = __init_subclass__
2843
2844                arg.__deprecated__ = __new__.__deprecated__ = msg
2845                __init_subclass__.__deprecated__ = msg
2846                return arg
2847            elif callable(arg):
2848                import functools
2849
2850                @functools.wraps(arg)
2851                def wrapper(*args, **kwargs):
2852                    warnings.warn(msg, category=category, stacklevel=stacklevel + 1)
2853                    return arg(*args, **kwargs)
2854
2855                arg.__deprecated__ = wrapper.__deprecated__ = msg
2856                return wrapper
2857            else:
2858                raise TypeError(
2859                    "@deprecated decorator with non-None category must be applied to "
2860                    f"a class or callable, not {arg!r}"
2861                )
2862
2863
2864# We have to do some monkey patching to deal with the dual nature of
2865# Unpack/TypeVarTuple:
2866# - We want Unpack to be a kind of TypeVar so it gets accepted in
2867#   Generic[Unpack[Ts]]
2868# - We want it to *not* be treated as a TypeVar for the purposes of
2869#   counting generic parameters, so that when we subscript a generic,
2870#   the runtime doesn't try to substitute the Unpack with the subscripted type.
2871if not hasattr(typing, "TypeVarTuple"):
2872    def _check_generic(cls, parameters, elen=_marker):
2873        """Check correct count for parameters of a generic cls (internal helper).
2874
2875        This gives a nice error message in case of count mismatch.
2876        """
2877        if not elen:
2878            raise TypeError(f"{cls} is not a generic class")
2879        if elen is _marker:
2880            if not hasattr(cls, "__parameters__") or not cls.__parameters__:
2881                raise TypeError(f"{cls} is not a generic class")
2882            elen = len(cls.__parameters__)
2883        alen = len(parameters)
2884        if alen != elen:
2885            expect_val = elen
2886            if hasattr(cls, "__parameters__"):
2887                parameters = [p for p in cls.__parameters__ if not _is_unpack(p)]
2888                num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters)
2889                if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples):
2890                    return
2891
2892                # deal with TypeVarLike defaults
2893                # required TypeVarLikes cannot appear after a defaulted one.
2894                if alen < elen:
2895                    # since we validate TypeVarLike default in _collect_type_vars
2896                    # or _collect_parameters we can safely check parameters[alen]
2897                    if (
2898                        getattr(parameters[alen], '__default__', NoDefault)
2899                        is not NoDefault
2900                    ):
2901                        return
2902
2903                    num_default_tv = sum(getattr(p, '__default__', NoDefault)
2904                                         is not NoDefault for p in parameters)
2905
2906                    elen -= num_default_tv
2907
2908                    expect_val = f"at least {elen}"
2909
2910            things = "arguments" if sys.version_info >= (3, 10) else "parameters"
2911            raise TypeError(f"Too {'many' if alen > elen else 'few'} {things}"
2912                            f" for {cls}; actual {alen}, expected {expect_val}")
2913else:
2914    # Python 3.11+
2915
2916    def _check_generic(cls, parameters, elen):
2917        """Check correct count for parameters of a generic cls (internal helper).
2918
2919        This gives a nice error message in case of count mismatch.
2920        """
2921        if not elen:
2922            raise TypeError(f"{cls} is not a generic class")
2923        alen = len(parameters)
2924        if alen != elen:
2925            expect_val = elen
2926            if hasattr(cls, "__parameters__"):
2927                parameters = [p for p in cls.__parameters__ if not _is_unpack(p)]
2928
2929                # deal with TypeVarLike defaults
2930                # required TypeVarLikes cannot appear after a defaulted one.
2931                if alen < elen:
2932                    # since we validate TypeVarLike default in _collect_type_vars
2933                    # or _collect_parameters we can safely check parameters[alen]
2934                    if (
2935                        getattr(parameters[alen], '__default__', NoDefault)
2936                        is not NoDefault
2937                    ):
2938                        return
2939
2940                    num_default_tv = sum(getattr(p, '__default__', NoDefault)
2941                                         is not NoDefault for p in parameters)
2942
2943                    elen -= num_default_tv
2944
2945                    expect_val = f"at least {elen}"
2946
2947            raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments"
2948                            f" for {cls}; actual {alen}, expected {expect_val}")
2949
2950if not _PEP_696_IMPLEMENTED:
2951    typing._check_generic = _check_generic
2952
2953
2954def _has_generic_or_protocol_as_origin() -> bool:
2955    try:
2956        frame = sys._getframe(2)
2957    # - Catch AttributeError: not all Python implementations have sys._getframe()
2958    # - Catch ValueError: maybe we're called from an unexpected module
2959    #   and the call stack isn't deep enough
2960    except (AttributeError, ValueError):
2961        return False  # err on the side of leniency
2962    else:
2963        # If we somehow get invoked from outside typing.py,
2964        # also err on the side of leniency
2965        if frame.f_globals.get("__name__") != "typing":
2966            return False
2967        origin = frame.f_locals.get("origin")
2968        # Cannot use "in" because origin may be an object with a buggy __eq__ that
2969        # throws an error.
2970        return origin is typing.Generic or origin is Protocol or origin is typing.Protocol
2971
2972
2973_TYPEVARTUPLE_TYPES = {TypeVarTuple, getattr(typing, "TypeVarTuple", None)}
2974
2975
2976def _is_unpacked_typevartuple(x) -> bool:
2977    if get_origin(x) is not Unpack:
2978        return False
2979    args = get_args(x)
2980    return (
2981        bool(args)
2982        and len(args) == 1
2983        and type(args[0]) in _TYPEVARTUPLE_TYPES
2984    )
2985
2986
2987# Python 3.11+ _collect_type_vars was renamed to _collect_parameters
2988if hasattr(typing, '_collect_type_vars'):
2989    def _collect_type_vars(types, typevar_types=None):
2990        """Collect all type variable contained in types in order of
2991        first appearance (lexicographic order). For example::
2992
2993            _collect_type_vars((T, List[S, T])) == (T, S)
2994        """
2995        if typevar_types is None:
2996            typevar_types = typing.TypeVar
2997        tvars = []
2998
2999        # A required TypeVarLike cannot appear after a TypeVarLike with a default
3000        # if it was a direct call to `Generic[]` or `Protocol[]`
3001        enforce_default_ordering = _has_generic_or_protocol_as_origin()
3002        default_encountered = False
3003
3004        # Also, a TypeVarLike with a default cannot appear after a TypeVarTuple
3005        type_var_tuple_encountered = False
3006
3007        for t in types:
3008            if _is_unpacked_typevartuple(t):
3009                type_var_tuple_encountered = True
3010            elif isinstance(t, typevar_types) and t not in tvars:
3011                if enforce_default_ordering:
3012                    has_default = getattr(t, '__default__', NoDefault) is not NoDefault
3013                    if has_default:
3014                        if type_var_tuple_encountered:
3015                            raise TypeError('Type parameter with a default'
3016                                            ' follows TypeVarTuple')
3017                        default_encountered = True
3018                    elif default_encountered:
3019                        raise TypeError(f'Type parameter {t!r} without a default'
3020                                        ' follows type parameter with a default')
3021
3022                tvars.append(t)
3023            if _should_collect_from_parameters(t):
3024                tvars.extend([t for t in t.__parameters__ if t not in tvars])
3025        return tuple(tvars)
3026
3027    typing._collect_type_vars = _collect_type_vars
3028else:
3029    def _collect_parameters(args):
3030        """Collect all type variables and parameter specifications in args
3031        in order of first appearance (lexicographic order).
3032
3033        For example::
3034
3035            assert _collect_parameters((T, Callable[P, T])) == (T, P)
3036        """
3037        parameters = []
3038
3039        # A required TypeVarLike cannot appear after a TypeVarLike with default
3040        # if it was a direct call to `Generic[]` or `Protocol[]`
3041        enforce_default_ordering = _has_generic_or_protocol_as_origin()
3042        default_encountered = False
3043
3044        # Also, a TypeVarLike with a default cannot appear after a TypeVarTuple
3045        type_var_tuple_encountered = False
3046
3047        for t in args:
3048            if isinstance(t, type):
3049                # We don't want __parameters__ descriptor of a bare Python class.
3050                pass
3051            elif isinstance(t, tuple):
3052                # `t` might be a tuple, when `ParamSpec` is substituted with
3053                # `[T, int]`, or `[int, *Ts]`, etc.
3054                for x in t:
3055                    for collected in _collect_parameters([x]):
3056                        if collected not in parameters:
3057                            parameters.append(collected)
3058            elif hasattr(t, '__typing_subst__'):
3059                if t not in parameters:
3060                    if enforce_default_ordering:
3061                        has_default = (
3062                            getattr(t, '__default__', NoDefault) is not NoDefault
3063                        )
3064
3065                        if type_var_tuple_encountered and has_default:
3066                            raise TypeError('Type parameter with a default'
3067                                            ' follows TypeVarTuple')
3068
3069                        if has_default:
3070                            default_encountered = True
3071                        elif default_encountered:
3072                            raise TypeError(f'Type parameter {t!r} without a default'
3073                                            ' follows type parameter with a default')
3074
3075                    parameters.append(t)
3076            else:
3077                if _is_unpacked_typevartuple(t):
3078                    type_var_tuple_encountered = True
3079                for x in getattr(t, '__parameters__', ()):
3080                    if x not in parameters:
3081                        parameters.append(x)
3082
3083        return tuple(parameters)
3084
3085    if not _PEP_696_IMPLEMENTED:
3086        typing._collect_parameters = _collect_parameters
3087
3088# Backport typing.NamedTuple as it exists in Python 3.13.
3089# In 3.11, the ability to define generic `NamedTuple`s was supported.
3090# This was explicitly disallowed in 3.9-3.10, and only half-worked in <=3.8.
3091# On 3.12, we added __orig_bases__ to call-based NamedTuples
3092# On 3.13, we deprecated kwargs-based NamedTuples
3093if sys.version_info >= (3, 13):
3094    NamedTuple = typing.NamedTuple
3095else:
3096    def _make_nmtuple(name, types, module, defaults=()):
3097        fields = [n for n, t in types]
3098        annotations = {n: typing._type_check(t, f"field {n} annotation must be a type")
3099                       for n, t in types}
3100        nm_tpl = collections.namedtuple(name, fields,
3101                                        defaults=defaults, module=module)
3102        nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = annotations
3103        # The `_field_types` attribute was removed in 3.9;
3104        # in earlier versions, it is the same as the `__annotations__` attribute
3105        if sys.version_info < (3, 9):
3106            nm_tpl._field_types = annotations
3107        return nm_tpl
3108
3109    _prohibited_namedtuple_fields = typing._prohibited
3110    _special_namedtuple_fields = frozenset({'__module__', '__name__', '__annotations__'})
3111
3112    class _NamedTupleMeta(type):
3113        def __new__(cls, typename, bases, ns):
3114            assert _NamedTuple in bases
3115            for base in bases:
3116                if base is not _NamedTuple and base is not typing.Generic:
3117                    raise TypeError(
3118                        'can only inherit from a NamedTuple type and Generic')
3119            bases = tuple(tuple if base is _NamedTuple else base for base in bases)
3120            if "__annotations__" in ns:
3121                types = ns["__annotations__"]
3122            elif "__annotate__" in ns:
3123                # TODO: Use inspect.VALUE here, and make the annotations lazily evaluated
3124                types = ns["__annotate__"](1)
3125            else:
3126                types = {}
3127            default_names = []
3128            for field_name in types:
3129                if field_name in ns:
3130                    default_names.append(field_name)
3131                elif default_names:
3132                    raise TypeError(f"Non-default namedtuple field {field_name} "
3133                                    f"cannot follow default field"
3134                                    f"{'s' if len(default_names) > 1 else ''} "
3135                                    f"{', '.join(default_names)}")
3136            nm_tpl = _make_nmtuple(
3137                typename, types.items(),
3138                defaults=[ns[n] for n in default_names],
3139                module=ns['__module__']
3140            )
3141            nm_tpl.__bases__ = bases
3142            if typing.Generic in bases:
3143                if hasattr(typing, '_generic_class_getitem'):  # 3.12+
3144                    nm_tpl.__class_getitem__ = classmethod(typing._generic_class_getitem)
3145                else:
3146                    class_getitem = typing.Generic.__class_getitem__.__func__
3147                    nm_tpl.__class_getitem__ = classmethod(class_getitem)
3148            # update from user namespace without overriding special namedtuple attributes
3149            for key, val in ns.items():
3150                if key in _prohibited_namedtuple_fields:
3151                    raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
3152                elif key not in _special_namedtuple_fields:
3153                    if key not in nm_tpl._fields:
3154                        setattr(nm_tpl, key, ns[key])
3155                    try:
3156                        set_name = type(val).__set_name__
3157                    except AttributeError:
3158                        pass
3159                    else:
3160                        try:
3161                            set_name(val, nm_tpl, key)
3162                        except BaseException as e:
3163                            msg = (
3164                                f"Error calling __set_name__ on {type(val).__name__!r} "
3165                                f"instance {key!r} in {typename!r}"
3166                            )
3167                            # BaseException.add_note() existed on py311,
3168                            # but the __set_name__ machinery didn't start
3169                            # using add_note() until py312.
3170                            # Making sure exceptions are raised in the same way
3171                            # as in "normal" classes seems most important here.
3172                            if sys.version_info >= (3, 12):
3173                                e.add_note(msg)
3174                                raise
3175                            else:
3176                                raise RuntimeError(msg) from e
3177
3178            if typing.Generic in bases:
3179                nm_tpl.__init_subclass__()
3180            return nm_tpl
3181
3182    _NamedTuple = type.__new__(_NamedTupleMeta, 'NamedTuple', (), {})
3183
3184    def _namedtuple_mro_entries(bases):
3185        assert NamedTuple in bases
3186        return (_NamedTuple,)
3187
3188    @_ensure_subclassable(_namedtuple_mro_entries)
3189    def NamedTuple(typename, fields=_marker, /, **kwargs):
3190        """Typed version of namedtuple.
3191
3192        Usage::
3193
3194            class Employee(NamedTuple):
3195                name: str
3196                id: int
3197
3198        This is equivalent to::
3199
3200            Employee = collections.namedtuple('Employee', ['name', 'id'])
3201
3202        The resulting class has an extra __annotations__ attribute, giving a
3203        dict that maps field names to types.  (The field names are also in
3204        the _fields attribute, which is part of the namedtuple API.)
3205        An alternative equivalent functional syntax is also accepted::
3206
3207            Employee = NamedTuple('Employee', [('name', str), ('id', int)])
3208        """
3209        if fields is _marker:
3210            if kwargs:
3211                deprecated_thing = "Creating NamedTuple classes using keyword arguments"
3212                deprecation_msg = (
3213                    "{name} is deprecated and will be disallowed in Python {remove}. "
3214                    "Use the class-based or functional syntax instead."
3215                )
3216            else:
3217                deprecated_thing = "Failing to pass a value for the 'fields' parameter"
3218                example = f"`{typename} = NamedTuple({typename!r}, [])`"
3219                deprecation_msg = (
3220                    "{name} is deprecated and will be disallowed in Python {remove}. "
3221                    "To create a NamedTuple class with 0 fields "
3222                    "using the functional syntax, "
3223                    "pass an empty list, e.g. "
3224                ) + example + "."
3225        elif fields is None:
3226            if kwargs:
3227                raise TypeError(
3228                    "Cannot pass `None` as the 'fields' parameter "
3229                    "and also specify fields using keyword arguments"
3230                )
3231            else:
3232                deprecated_thing = "Passing `None` as the 'fields' parameter"
3233                example = f"`{typename} = NamedTuple({typename!r}, [])`"
3234                deprecation_msg = (
3235                    "{name} is deprecated and will be disallowed in Python {remove}. "
3236                    "To create a NamedTuple class with 0 fields "
3237                    "using the functional syntax, "
3238                    "pass an empty list, e.g. "
3239                ) + example + "."
3240        elif kwargs:
3241            raise TypeError("Either list of fields or keywords"
3242                            " can be provided to NamedTuple, not both")
3243        if fields is _marker or fields is None:
3244            warnings.warn(
3245                deprecation_msg.format(name=deprecated_thing, remove="3.15"),
3246                DeprecationWarning,
3247                stacklevel=2,
3248            )
3249            fields = kwargs.items()
3250        nt = _make_nmtuple(typename, fields, module=_caller())
3251        nt.__orig_bases__ = (NamedTuple,)
3252        return nt
3253
3254
3255if hasattr(collections.abc, "Buffer"):
3256    Buffer = collections.abc.Buffer
3257else:
3258    class Buffer(abc.ABC):  # noqa: B024
3259        """Base class for classes that implement the buffer protocol.
3260
3261        The buffer protocol allows Python objects to expose a low-level
3262        memory buffer interface. Before Python 3.12, it is not possible
3263        to implement the buffer protocol in pure Python code, or even
3264        to check whether a class implements the buffer protocol. In
3265        Python 3.12 and higher, the ``__buffer__`` method allows access
3266        to the buffer protocol from Python code, and the
3267        ``collections.abc.Buffer`` ABC allows checking whether a class
3268        implements the buffer protocol.
3269
3270        To indicate support for the buffer protocol in earlier versions,
3271        inherit from this ABC, either in a stub file or at runtime,
3272        or use ABC registration. This ABC provides no methods, because
3273        there is no Python-accessible methods shared by pre-3.12 buffer
3274        classes. It is useful primarily for static checks.
3275
3276        """
3277
3278    # As a courtesy, register the most common stdlib buffer classes.
3279    Buffer.register(memoryview)
3280    Buffer.register(bytearray)
3281    Buffer.register(bytes)
3282
3283
3284# Backport of types.get_original_bases, available on 3.12+ in CPython
3285if hasattr(_types, "get_original_bases"):
3286    get_original_bases = _types.get_original_bases
3287else:
3288    def get_original_bases(cls, /):
3289        """Return the class's "original" bases prior to modification by `__mro_entries__`.
3290
3291        Examples::
3292
3293            from typing import TypeVar, Generic
3294            from typing_extensions import NamedTuple, TypedDict
3295
3296            T = TypeVar("T")
3297            class Foo(Generic[T]): ...
3298            class Bar(Foo[int], float): ...
3299            class Baz(list[str]): ...
3300            Eggs = NamedTuple("Eggs", [("a", int), ("b", str)])
3301            Spam = TypedDict("Spam", {"a": int, "b": str})
3302
3303            assert get_original_bases(Bar) == (Foo[int], float)
3304            assert get_original_bases(Baz) == (list[str],)
3305            assert get_original_bases(Eggs) == (NamedTuple,)
3306            assert get_original_bases(Spam) == (TypedDict,)
3307            assert get_original_bases(int) == (object,)
3308        """
3309        try:
3310            return cls.__dict__.get("__orig_bases__", cls.__bases__)
3311        except AttributeError:
3312            raise TypeError(
3313                f'Expected an instance of type, not {type(cls).__name__!r}'
3314            ) from None
3315
3316
3317# NewType is a class on Python 3.10+, making it pickleable
3318# The error message for subclassing instances of NewType was improved on 3.11+
3319if sys.version_info >= (3, 11):
3320    NewType = typing.NewType
3321else:
3322    class NewType:
3323        """NewType creates simple unique types with almost zero
3324        runtime overhead. NewType(name, tp) is considered a subtype of tp
3325        by static type checkers. At runtime, NewType(name, tp) returns
3326        a dummy callable that simply returns its argument. Usage::
3327            UserId = NewType('UserId', int)
3328            def name_by_id(user_id: UserId) -> str:
3329                ...
3330            UserId('user')          # Fails type check
3331            name_by_id(42)          # Fails type check
3332            name_by_id(UserId(42))  # OK
3333            num = UserId(5) + 1     # type: int
3334        """
3335
3336        def __call__(self, obj, /):
3337            return obj
3338
3339        def __init__(self, name, tp):
3340            self.__qualname__ = name
3341            if '.' in name:
3342                name = name.rpartition('.')[-1]
3343            self.__name__ = name
3344            self.__supertype__ = tp
3345            def_mod = _caller()
3346            if def_mod != 'typing_extensions':
3347                self.__module__ = def_mod
3348
3349        def __mro_entries__(self, bases):
3350            # We defined __mro_entries__ to get a better error message
3351            # if a user attempts to subclass a NewType instance. bpo-46170
3352            supercls_name = self.__name__
3353
3354            class Dummy:
3355                def __init_subclass__(cls):
3356                    subcls_name = cls.__name__
3357                    raise TypeError(
3358                        f"Cannot subclass an instance of NewType. "
3359                        f"Perhaps you were looking for: "
3360                        f"`{subcls_name} = NewType({subcls_name!r}, {supercls_name})`"
3361                    )
3362
3363            return (Dummy,)
3364
3365        def __repr__(self):
3366            return f'{self.__module__}.{self.__qualname__}'
3367
3368        def __reduce__(self):
3369            return self.__qualname__
3370
3371        if sys.version_info >= (3, 10):
3372            # PEP 604 methods
3373            # It doesn't make sense to have these methods on Python <3.10
3374
3375            def __or__(self, other):
3376                return typing.Union[self, other]
3377
3378            def __ror__(self, other):
3379                return typing.Union[other, self]
3380
3381
3382if hasattr(typing, "TypeAliasType"):
3383    TypeAliasType = typing.TypeAliasType
3384else:
3385    def _is_unionable(obj):
3386        """Corresponds to is_unionable() in unionobject.c in CPython."""
3387        return obj is None or isinstance(obj, (
3388            type,
3389            _types.GenericAlias,
3390            _types.UnionType,
3391            TypeAliasType,
3392        ))
3393
3394    class TypeAliasType:
3395        """Create named, parameterized type aliases.
3396
3397        This provides a backport of the new `type` statement in Python 3.12:
3398
3399            type ListOrSet[T] = list[T] | set[T]
3400
3401        is equivalent to:
3402
3403            T = TypeVar("T")
3404            ListOrSet = TypeAliasType("ListOrSet", list[T] | set[T], type_params=(T,))
3405
3406        The name ListOrSet can then be used as an alias for the type it refers to.
3407
3408        The type_params argument should contain all the type parameters used
3409        in the value of the type alias. If the alias is not generic, this
3410        argument is omitted.
3411
3412        Static type checkers should only support type aliases declared using
3413        TypeAliasType that follow these rules:
3414
3415        - The first argument (the name) must be a string literal.
3416        - The TypeAliasType instance must be immediately assigned to a variable
3417          of the same name. (For example, 'X = TypeAliasType("Y", int)' is invalid,
3418          as is 'X, Y = TypeAliasType("X", int), TypeAliasType("Y", int)').
3419
3420        """
3421
3422        def __init__(self, name: str, value, *, type_params=()):
3423            if not isinstance(name, str):
3424                raise TypeError("TypeAliasType name must be a string")
3425            self.__value__ = value
3426            self.__type_params__ = type_params
3427
3428            parameters = []
3429            for type_param in type_params:
3430                if isinstance(type_param, TypeVarTuple):
3431                    parameters.extend(type_param)
3432                else:
3433                    parameters.append(type_param)
3434            self.__parameters__ = tuple(parameters)
3435            def_mod = _caller()
3436            if def_mod != 'typing_extensions':
3437                self.__module__ = def_mod
3438            # Setting this attribute closes the TypeAliasType from further modification
3439            self.__name__ = name
3440
3441        def __setattr__(self, name: str, value: object, /) -> None:
3442            if hasattr(self, "__name__"):
3443                self._raise_attribute_error(name)
3444            super().__setattr__(name, value)
3445
3446        def __delattr__(self, name: str, /) -> Never:
3447            self._raise_attribute_error(name)
3448
3449        def _raise_attribute_error(self, name: str) -> Never:
3450            # Match the Python 3.12 error messages exactly
3451            if name == "__name__":
3452                raise AttributeError("readonly attribute")
3453            elif name in {"__value__", "__type_params__", "__parameters__", "__module__"}:
3454                raise AttributeError(
3455                    f"attribute '{name}' of 'typing.TypeAliasType' objects "
3456                    "is not writable"
3457                )
3458            else:
3459                raise AttributeError(
3460                    f"'typing.TypeAliasType' object has no attribute '{name}'"
3461                )
3462
3463        def __repr__(self) -> str:
3464            return self.__name__
3465
3466        def __getitem__(self, parameters):
3467            if not isinstance(parameters, tuple):
3468                parameters = (parameters,)
3469            parameters = [
3470                typing._type_check(
3471                    item, f'Subscripting {self.__name__} requires a type.'
3472                )
3473                for item in parameters
3474            ]
3475            return typing._GenericAlias(self, tuple(parameters))
3476
3477        def __reduce__(self):
3478            return self.__name__
3479
3480        def __init_subclass__(cls, *args, **kwargs):
3481            raise TypeError(
3482                "type 'typing_extensions.TypeAliasType' is not an acceptable base type"
3483            )
3484
3485        # The presence of this method convinces typing._type_check
3486        # that TypeAliasTypes are types.
3487        def __call__(self):
3488            raise TypeError("Type alias is not callable")
3489
3490        if sys.version_info >= (3, 10):
3491            def __or__(self, right):
3492                # For forward compatibility with 3.12, reject Unions
3493                # that are not accepted by the built-in Union.
3494                if not _is_unionable(right):
3495                    return NotImplemented
3496                return typing.Union[self, right]
3497
3498            def __ror__(self, left):
3499                if not _is_unionable(left):
3500                    return NotImplemented
3501                return typing.Union[left, self]
3502
3503
3504if hasattr(typing, "is_protocol"):
3505    is_protocol = typing.is_protocol
3506    get_protocol_members = typing.get_protocol_members
3507else:
3508    def is_protocol(tp: type, /) -> bool:
3509        """Return True if the given type is a Protocol.
3510
3511        Example::
3512
3513            >>> from typing_extensions import Protocol, is_protocol
3514            >>> class P(Protocol):
3515            ...     def a(self) -> str: ...
3516            ...     b: int
3517            >>> is_protocol(P)
3518            True
3519            >>> is_protocol(int)
3520            False
3521        """
3522        return (
3523            isinstance(tp, type)
3524            and getattr(tp, '_is_protocol', False)
3525            and tp is not Protocol
3526            and tp is not typing.Protocol
3527        )
3528
3529    def get_protocol_members(tp: type, /) -> typing.FrozenSet[str]:
3530        """Return the set of members defined in a Protocol.
3531
3532        Example::
3533
3534            >>> from typing_extensions import Protocol, get_protocol_members
3535            >>> class P(Protocol):
3536            ...     def a(self) -> str: ...
3537            ...     b: int
3538            >>> get_protocol_members(P)
3539            frozenset({'a', 'b'})
3540
3541        Raise a TypeError for arguments that are not Protocols.
3542        """
3543        if not is_protocol(tp):
3544            raise TypeError(f'{tp!r} is not a Protocol')
3545        if hasattr(tp, '__protocol_attrs__'):
3546            return frozenset(tp.__protocol_attrs__)
3547        return frozenset(_get_protocol_attrs(tp))
3548
3549
3550if hasattr(typing, "Doc"):
3551    Doc = typing.Doc
3552else:
3553    class Doc:
3554        """Define the documentation of a type annotation using ``Annotated``, to be
3555         used in class attributes, function and method parameters, return values,
3556         and variables.
3557
3558        The value should be a positional-only string literal to allow static tools
3559        like editors and documentation generators to use it.
3560
3561        This complements docstrings.
3562
3563        The string value passed is available in the attribute ``documentation``.
3564
3565        Example::
3566
3567            >>> from typing_extensions import Annotated, Doc
3568            >>> def hi(to: Annotated[str, Doc("Who to say hi to")]) -> None: ...
3569        """
3570        def __init__(self, documentation: str, /) -> None:
3571            self.documentation = documentation
3572
3573        def __repr__(self) -> str:
3574            return f"Doc({self.documentation!r})"
3575
3576        def __hash__(self) -> int:
3577            return hash(self.documentation)
3578
3579        def __eq__(self, other: object) -> bool:
3580            if not isinstance(other, Doc):
3581                return NotImplemented
3582            return self.documentation == other.documentation
3583
3584
3585_CapsuleType = getattr(_types, "CapsuleType", None)
3586
3587if _CapsuleType is None:
3588    try:
3589        import _socket
3590    except ImportError:
3591        pass
3592    else:
3593        _CAPI = getattr(_socket, "CAPI", None)
3594        if _CAPI is not None:
3595            _CapsuleType = type(_CAPI)
3596
3597if _CapsuleType is not None:
3598    CapsuleType = _CapsuleType
3599    __all__.append("CapsuleType")
3600
3601
3602# Aliases for items that have always been in typing.
3603# Explicitly assign these (rather than using `from typing import *` at the top),
3604# so that we get a CI error if one of these is deleted from typing.py
3605# in a future version of Python
3606AbstractSet = typing.AbstractSet
3607AnyStr = typing.AnyStr
3608BinaryIO = typing.BinaryIO
3609Callable = typing.Callable
3610Collection = typing.Collection
3611Container = typing.Container
3612Dict = typing.Dict
3613ForwardRef = typing.ForwardRef
3614FrozenSet = typing.FrozenSet
3615Generic = typing.Generic
3616Hashable = typing.Hashable
3617IO = typing.IO
3618ItemsView = typing.ItemsView
3619Iterable = typing.Iterable
3620Iterator = typing.Iterator
3621KeysView = typing.KeysView
3622List = typing.List
3623Mapping = typing.Mapping
3624MappingView = typing.MappingView
3625Match = typing.Match
3626MutableMapping = typing.MutableMapping
3627MutableSequence = typing.MutableSequence
3628MutableSet = typing.MutableSet
3629Optional = typing.Optional
3630Pattern = typing.Pattern
3631Reversible = typing.Reversible
3632Sequence = typing.Sequence
3633Set = typing.Set
3634Sized = typing.Sized
3635TextIO = typing.TextIO
3636Tuple = typing.Tuple
3637Union = typing.Union
3638ValuesView = typing.ValuesView
3639cast = typing.cast
3640no_type_check = typing.no_type_check
3641no_type_check_decorator = typing.no_type_check_decorator
3642