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