blob: abd5899806f290dfccedf9ce623bc946a9146030 [file] [log] [blame]
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001"""
2The typing module: Support for gradual typing as defined by PEP 484.
3
4At large scale, the structure of the module is following:
Tim McNamara5265b3a2018-09-01 20:56:58 +12005* Imports and exports, all public names should be explicitly added to __all__.
Ivan Levkivskyid911e402018-01-20 11:23:59 +00006* Internal helper functions: these should never be used in code outside this module.
kj73607be2020-12-24 12:33:48 +08007* _SpecialForm and its instances (special forms):
8 Any, NoReturn, ClassVar, Union, Optional, Concatenate
9* Classes whose instances can be type arguments in addition to types:
10 ForwardRef, TypeVar and ParamSpec
Ivan Levkivskyid911e402018-01-20 11:23:59 +000011* The core of internal generics API: _GenericAlias and _VariadicGenericAlias, the latter is
12 currently only used by Tuple and Callable. All subscripted types like X[int], Union[int, str],
13 etc., are instances of either of these classes.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +010014* The public counterpart of the generics API consists of two classes: Generic and Protocol.
Ivan Levkivskyid911e402018-01-20 11:23:59 +000015* Public helper functions: get_type_hints, overload, cast, no_type_check,
16 no_type_check_decorator.
17* Generic aliases for collections.abc ABCs and few additional protocols.
ananthan-123ab6423f2020-02-19 10:03:05 +053018* Special types: NewType, NamedTuple, TypedDict.
Ivan Levkivskyid911e402018-01-20 11:23:59 +000019* Wrapper submodules for re and io related types.
20"""
21
HongWeipeng6ce03ec2019-09-27 15:54:26 +080022from abc import abstractmethod, ABCMeta
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070023import collections
Ivan Levkivskyid911e402018-01-20 11:23:59 +000024import collections.abc
Brett Cannonf3ad0422016-04-15 10:51:30 -070025import contextlib
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070026import functools
Serhiy Storchaka09f32212018-05-26 21:19:26 +030027import operator
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070028import re as stdlib_re # Avoid confusion with the re we export.
29import sys
30import types
Guido van Rossum48b069a2020-04-07 09:50:06 -070031from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType, GenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070032
33# Please keep __all__ alphabetized within each category.
34__all__ = [
35 # Super-special typing primitives.
Jakub Stasiakcf5b1092020-02-05 02:10:19 +010036 'Annotated',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070037 'Any',
38 'Callable',
Guido van Rossum0a6976d2016-09-11 15:34:56 -070039 'ClassVar',
kj73607be2020-12-24 12:33:48 +080040 'Concatenate',
Ivan Levkivskyif3672422019-05-26 09:37:07 +010041 'Final',
Anthony Sottiled30da5d2019-05-29 11:19:38 -070042 'ForwardRef',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070043 'Generic',
Ivan Levkivskyib891c462019-05-26 09:37:48 +010044 'Literal',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070045 'Optional',
kj73607be2020-12-24 12:33:48 +080046 'ParamSpec',
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +010047 'Protocol',
Guido van Rossumeb9aca32016-05-24 16:38:22 -070048 'Tuple',
49 'Type',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070050 'TypeVar',
51 'Union',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070052
53 # ABCs (from collections.abc).
54 'AbstractSet', # collections.abc.Set.
55 'ByteString',
56 'Container',
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +020057 'ContextManager',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070058 'Hashable',
59 'ItemsView',
60 'Iterable',
61 'Iterator',
62 'KeysView',
63 'Mapping',
64 'MappingView',
65 'MutableMapping',
66 'MutableSequence',
67 'MutableSet',
68 'Sequence',
69 'Sized',
70 'ValuesView',
Ivan Levkivskyid911e402018-01-20 11:23:59 +000071 'Awaitable',
72 'AsyncIterator',
73 'AsyncIterable',
74 'Coroutine',
75 'Collection',
76 'AsyncGenerator',
77 'AsyncContextManager',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070078
79 # Structural checks, a.k.a. protocols.
80 'Reversible',
81 'SupportsAbs',
Ivan Levkivskyif06e0212017-05-02 19:14:07 +020082 'SupportsBytes',
83 'SupportsComplex',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070084 'SupportsFloat',
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -070085 'SupportsIndex',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070086 'SupportsInt',
87 'SupportsRound',
88
89 # Concrete collection types.
Anthony Sottiled30da5d2019-05-29 11:19:38 -070090 'ChainMap',
Ivan Levkivskyib692dc82017-02-13 22:50:14 +010091 'Counter',
Raymond Hettinger80490522017-01-16 22:42:37 -080092 'Deque',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070093 'Dict',
Guido van Rossumbd5b9a02016-04-05 08:28:52 -070094 'DefaultDict',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070095 'List',
Anthony Sottiled30da5d2019-05-29 11:19:38 -070096 'OrderedDict',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070097 'Set',
Guido van Rossumefa798d2016-08-23 11:01:50 -070098 'FrozenSet',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070099 'NamedTuple', # Not really a type.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +0100100 'TypedDict', # Not really a type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700101 'Generator',
Serhiy Storchaka93242d72021-10-03 20:03:49 +0300102
Miss Islington (bot)e1bcc882021-05-04 02:51:33 -0700103 # Other concrete types.
104 'BinaryIO',
105 'IO',
106 'Match',
107 'Pattern',
108 'TextIO',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700109
110 # One-off things.
111 'AnyStr',
112 'cast',
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100113 'final',
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +0100114 'get_args',
115 'get_origin',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700116 'get_type_hints',
Patrick Reader0705ec82020-09-16 05:58:32 +0100117 'is_typeddict',
Guido van Rossum91185fe2016-06-08 11:19:11 -0700118 'NewType',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700119 'no_type_check',
120 'no_type_check_decorator',
aetracht45738202018-03-19 14:41:32 -0400121 'NoReturn',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700122 'overload',
Jelle Zijlstra52243362021-04-10 19:57:05 -0700123 'ParamSpecArgs',
124 'ParamSpecKwargs',
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100125 'runtime_checkable',
Guido van Rossum0e0563c2016-04-05 14:54:25 -0700126 'Text',
Guido van Rossum91185fe2016-06-08 11:19:11 -0700127 'TYPE_CHECKING',
Mikhail Golubev4f3c2502020-10-08 00:44:31 +0300128 'TypeAlias',
Ken Jin05ab4b62021-04-27 22:31:04 +0800129 'TypeGuard',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700130]
131
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700132# The pseudo-submodules 're' and 'io' are part of the public
133# namespace, but excluded from __all__ because they might stomp on
134# legitimate imports of those modules.
135
kj463c7d32020-12-14 02:38:24 +0800136
Miss Islington (bot)bfcb4142022-01-27 08:48:08 -0800137def _type_convert(arg, module=None, *, allow_special_forms=False):
kj463c7d32020-12-14 02:38:24 +0800138 """For converting None to type(None), and strings to ForwardRef."""
139 if arg is None:
140 return type(None)
141 if isinstance(arg, str):
Miss Islington (bot)bfcb4142022-01-27 08:48:08 -0800142 return ForwardRef(arg, module=module, is_class=allow_special_forms)
kj463c7d32020-12-14 02:38:24 +0800143 return arg
144
145
Miss Islington (bot)41e0aea2022-01-25 06:38:45 -0800146def _type_check(arg, msg, is_argument=True, module=None, *, allow_special_forms=False):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000147 """Check that the argument is a type, and return it (internal helper).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700148
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000149 As a special case, accept None and return type(None) instead. Also wrap strings
150 into ForwardRef instances. Consider several corner cases, for example plain
151 special forms like Union are not valid, while Union[int, str] is OK, etc.
152 The msg argument is a human-readable error message, e.g::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700153
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000154 "Union[arg, ...]: arg should be a type."
Guido van Rossum4cefe742016-09-27 15:20:12 -0700155
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000156 We append the repr() of the actual value (truncated to 100 chars).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700157 """
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100158 invalid_generic_forms = (Generic, Protocol)
Miss Islington (bot)41e0aea2022-01-25 06:38:45 -0800159 if not allow_special_forms:
Miss Islington (bot)d312b852021-09-25 02:21:13 -0700160 invalid_generic_forms += (ClassVar,)
161 if is_argument:
162 invalid_generic_forms += (Final,)
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400163
Miss Islington (bot)bfcb4142022-01-27 08:48:08 -0800164 arg = _type_convert(arg, module=module, allow_special_forms=allow_special_forms)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000165 if (isinstance(arg, _GenericAlias) and
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400166 arg.__origin__ in invalid_generic_forms):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000167 raise TypeError(f"{arg} is not valid as type argument")
Miss Islington (bot)d312b852021-09-25 02:21:13 -0700168 if arg in (Any, NoReturn, Final):
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300169 return arg
170 if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000171 raise TypeError(f"Plain {arg} is not valid as type argument")
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -0700172 if isinstance(arg, (type, TypeVar, ForwardRef, types.UnionType, ParamSpec)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000173 return arg
174 if not callable(arg):
175 raise TypeError(f"{msg} Got {arg!r:.100}.")
176 return arg
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700177
178
Miss Islington (bot)536e35a2021-08-04 13:36:01 -0700179def _is_param_expr(arg):
180 return arg is ... or isinstance(arg,
181 (tuple, list, ParamSpec, _ConcatenateGenericAlias))
182
183
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000184def _type_repr(obj):
185 """Return the repr() of an object, special-casing types (internal helper).
186
187 If obj is a type, we return a shorter version than the default
188 type.__repr__, based on the module and qualified name, which is
189 typically enough to uniquely identify a type. For everything
190 else, we fall back on repr(obj).
191 """
kj1f7dfb22020-11-02 02:13:38 +0800192 if isinstance(obj, types.GenericAlias):
193 return repr(obj)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000194 if isinstance(obj, type):
195 if obj.__module__ == 'builtins':
196 return obj.__qualname__
197 return f'{obj.__module__}.{obj.__qualname__}'
198 if obj is ...:
199 return('...')
200 if isinstance(obj, types.FunctionType):
201 return obj.__name__
202 return repr(obj)
203
204
Ken Jina2721642021-07-19 22:22:59 +0800205def _collect_type_vars(types_, typevar_types=None):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700206 """Collect all type variable contained
kj73607be2020-12-24 12:33:48 +0800207 in types in order of first appearance (lexicographic order). For example::
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000208
209 _collect_type_vars((T, List[S, T])) == (T, S)
210 """
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700211 if typevar_types is None:
212 typevar_types = TypeVar
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000213 tvars = []
Ken Jina2721642021-07-19 22:22:59 +0800214 for t in types_:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700215 if isinstance(t, typevar_types) and t not in tvars:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000216 tvars.append(t)
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -0700217 if isinstance(t, (_GenericAlias, GenericAlias, types.UnionType)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000218 tvars.extend([t for t in t.__parameters__ if t not in tvars])
219 return tuple(tvars)
220
221
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300222def _check_generic(cls, parameters, elen):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000223 """Check correct count for parameters of a generic cls (internal helper).
224 This gives a nice error message in case of count mismatch.
225 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300226 if not elen:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000227 raise TypeError(f"{cls} is not a generic class")
228 alen = len(parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000229 if alen != elen:
Miss Islington (bot)c8db2922021-08-02 00:08:24 -0700230 raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments for {cls};"
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000231 f" actual {alen}, expected {elen}")
232
kj73607be2020-12-24 12:33:48 +0800233def _prepare_paramspec_params(cls, params):
234 """Prepares the parameters for a Generic containing ParamSpec
235 variables (internal helper).
236 """
237 # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612.
Miss Islington (bot)536e35a2021-08-04 13:36:01 -0700238 if (len(cls.__parameters__) == 1
239 and params and not _is_param_expr(params[0])):
240 assert isinstance(cls.__parameters__[0], ParamSpec)
kj73607be2020-12-24 12:33:48 +0800241 return (params,)
242 else:
Miss Islington (bot)c8db2922021-08-02 00:08:24 -0700243 _check_generic(cls, params, len(cls.__parameters__))
kj73607be2020-12-24 12:33:48 +0800244 _params = []
245 # Convert lists to tuples to help other libraries cache the results.
246 for p, tvar in zip(params, cls.__parameters__):
247 if isinstance(tvar, ParamSpec) and isinstance(p, list):
248 p = tuple(p)
249 _params.append(p)
250 return tuple(_params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000251
Yurii Karabasf03d3182020-11-17 04:23:19 +0200252def _deduplicate(params):
253 # Weed out strict duplicates, preserving the first of each occurrence.
254 all_params = set(params)
255 if len(all_params) < len(params):
256 new_params = []
257 for t in params:
258 if t in all_params:
259 new_params.append(t)
260 all_params.remove(t)
261 params = new_params
262 assert not all_params, all_params
263 return params
264
265
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000266def _remove_dups_flatten(parameters):
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700267 """An internal helper for Union creation and substitution: flatten Unions
268 among parameters, then remove duplicates.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000269 """
270 # Flatten out Union[Union[...], ...].
271 params = []
272 for p in parameters:
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -0700273 if isinstance(p, (_UnionGenericAlias, types.UnionType)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000274 params.extend(p.__args__)
275 elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
276 params.extend(p[1:])
277 else:
278 params.append(p)
Yurii Karabasf03d3182020-11-17 04:23:19 +0200279
280 return tuple(_deduplicate(params))
281
282
283def _flatten_literal_params(parameters):
284 """An internal helper for Literal creation: flatten Literals among parameters"""
285 params = []
286 for p in parameters:
287 if isinstance(p, _LiteralGenericAlias):
288 params.extend(p.__args__)
289 else:
290 params.append(p)
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700291 return tuple(params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000292
293
294_cleanups = []
295
296
Yurii Karabasf03d3182020-11-17 04:23:19 +0200297def _tp_cache(func=None, /, *, typed=False):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000298 """Internal wrapper caching __getitem__ of generic types with a fallback to
299 original function for non-hashable arguments.
300 """
Yurii Karabasf03d3182020-11-17 04:23:19 +0200301 def decorator(func):
302 cached = functools.lru_cache(typed=typed)(func)
303 _cleanups.append(cached.cache_clear)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000304
Yurii Karabasf03d3182020-11-17 04:23:19 +0200305 @functools.wraps(func)
306 def inner(*args, **kwds):
307 try:
308 return cached(*args, **kwds)
309 except TypeError:
310 pass # All real errors (not unhashable args) are raised below.
311 return func(*args, **kwds)
312 return inner
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000313
Yurii Karabasf03d3182020-11-17 04:23:19 +0200314 if func is not None:
315 return decorator(func)
316
317 return decorator
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000318
wyfo653f4202020-07-22 21:47:28 +0200319def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
Graham Bleaney84ef33c2020-09-08 18:41:10 -0400320 """Evaluate all forward references in the given type t.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000321 For use of globalns and localns see the docstring for get_type_hints().
wyfo653f4202020-07-22 21:47:28 +0200322 recursive_guard is used to prevent prevent infinite recursion
323 with recursive ForwardRef.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000324 """
325 if isinstance(t, ForwardRef):
wyfo653f4202020-07-22 21:47:28 +0200326 return t._evaluate(globalns, localns, recursive_guard)
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -0700327 if isinstance(t, (_GenericAlias, GenericAlias, types.UnionType)):
wyfo653f4202020-07-22 21:47:28 +0200328 ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000329 if ev_args == t.__args__:
330 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300331 if isinstance(t, GenericAlias):
332 return GenericAlias(t.__origin__, ev_args)
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -0700333 if isinstance(t, types.UnionType):
Miss Islington (bot)0aea99e2021-07-24 12:35:33 -0700334 return functools.reduce(operator.or_, ev_args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300335 else:
336 return t.copy_with(ev_args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000337 return t
338
339
340class _Final:
341 """Mixin to prohibit subclassing"""
Guido van Rossum4cefe742016-09-27 15:20:12 -0700342
Guido van Rossum83ec3022017-01-17 20:43:28 -0800343 __slots__ = ('__weakref__',)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700344
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300345 def __init_subclass__(self, /, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000346 if '_root' not in kwds:
347 raise TypeError("Cannot subclass special typing classes")
348
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100349class _Immutable:
350 """Mixin to indicate that object should not be copied."""
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300351 __slots__ = ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000352
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100353 def __copy__(self):
354 return self
355
356 def __deepcopy__(self, memo):
357 return self
358
359
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300360# Internal indicator of special typing constructs.
361# See __doc__ instance attribute for specific docs.
362class _SpecialForm(_Final, _root=True):
363 __slots__ = ('_name', '__doc__', '_getitem')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000364
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300365 def __init__(self, getitem):
366 self._getitem = getitem
367 self._name = getitem.__name__
368 self.__doc__ = getitem.__doc__
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000369
Miss Islington (bot)c895f2b2021-07-19 10:57:27 -0700370 def __getattr__(self, item):
371 if item in {'__name__', '__qualname__'}:
372 return self._name
373
374 raise AttributeError(item)
375
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300376 def __mro_entries__(self, bases):
377 raise TypeError(f"Cannot subclass {self!r}")
Guido van Rossum4cefe742016-09-27 15:20:12 -0700378
379 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000380 return 'typing.' + self._name
381
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100382 def __reduce__(self):
383 return self._name
Guido van Rossum4cefe742016-09-27 15:20:12 -0700384
385 def __call__(self, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000386 raise TypeError(f"Cannot instantiate {self!r}")
387
Ken Jinca5a4cf2021-07-24 22:49:25 +0800388 def __or__(self, other):
389 return Union[self, other]
390
391 def __ror__(self, other):
392 return Union[other, self]
393
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000394 def __instancecheck__(self, obj):
395 raise TypeError(f"{self} cannot be used with isinstance()")
396
397 def __subclasscheck__(self, cls):
398 raise TypeError(f"{self} cannot be used with issubclass()")
399
400 @_tp_cache
401 def __getitem__(self, parameters):
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300402 return self._getitem(self, parameters)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700403
Yurii Karabasf03d3182020-11-17 04:23:19 +0200404
405class _LiteralSpecialForm(_SpecialForm, _root=True):
Yurii Karabasf03d3182020-11-17 04:23:19 +0200406 def __getitem__(self, parameters):
Miss Islington (bot)3997f3c2021-10-31 01:43:40 -0700407 if not isinstance(parameters, tuple):
408 parameters = (parameters,)
409 return self._getitem(self, *parameters)
Yurii Karabasf03d3182020-11-17 04:23:19 +0200410
411
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300412@_SpecialForm
413def Any(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000414 """Special type indicating an unconstrained type.
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700415
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000416 - Any is compatible with every type.
417 - Any assumed to have all methods.
418 - All values assumed to be instances of Any.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700419
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000420 Note that all the above statements are true from the point of view of
421 static type checkers. At runtime, Any should not be used with instance
422 or class checks.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300423 """
424 raise TypeError(f"{self} is not subscriptable")
Guido van Rossumd70fe632015-08-05 12:11:06 +0200425
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300426@_SpecialForm
427def NoReturn(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000428 """Special type indicating functions that never return.
429 Example::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700430
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000431 from typing import NoReturn
432
433 def stop() -> NoReturn:
434 raise Exception('no way')
435
436 This type is invalid in other positions, e.g., ``List[NoReturn]``
437 will fail in static type checkers.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300438 """
439 raise TypeError(f"{self} is not subscriptable")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000440
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300441@_SpecialForm
442def ClassVar(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000443 """Special type construct to mark class variables.
444
445 An annotation wrapped in ClassVar indicates that a given
446 attribute is intended to be used as a class variable and
447 should not be set on instances of that class. Usage::
448
449 class Starship:
450 stats: ClassVar[Dict[str, int]] = {} # class variable
451 damage: int = 10 # instance variable
452
453 ClassVar accepts only types and cannot be further subscribed.
454
455 Note that ClassVar is not a class itself, and should not
456 be used with isinstance() or issubclass().
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300457 """
458 item = _type_check(parameters, f'{self} accepts only single type.')
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700459 return _GenericAlias(self, (item,))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000460
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300461@_SpecialForm
462def Final(self, parameters):
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100463 """Special typing construct to indicate final names to type checkers.
464
465 A final name cannot be re-assigned or overridden in a subclass.
466 For example:
467
468 MAX_SIZE: Final = 9000
469 MAX_SIZE += 1 # Error reported by type checker
470
471 class Connection:
472 TIMEOUT: Final[int] = 10
473
474 class FastConnector(Connection):
475 TIMEOUT = 1 # Error reported by type checker
476
477 There is no runtime checking of these properties.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300478 """
479 item = _type_check(parameters, f'{self} accepts only single type.')
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700480 return _GenericAlias(self, (item,))
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100481
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300482@_SpecialForm
483def Union(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000484 """Union type; Union[X, Y] means either X or Y.
485
486 To define a union, use e.g. Union[int, str]. Details:
487 - The arguments must be types and there must be at least one.
488 - None as an argument is a special case and is replaced by
489 type(None).
490 - Unions of unions are flattened, e.g.::
491
492 Union[Union[int, str], float] == Union[int, str, float]
493
494 - Unions of a single argument vanish, e.g.::
495
496 Union[int] == int # The constructor actually returns int
497
498 - Redundant arguments are skipped, e.g.::
499
500 Union[int, str, int] == Union[int, str]
501
502 - When comparing unions, the argument order is ignored, e.g.::
503
504 Union[int, str] == Union[str, int]
505
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000506 - You cannot subclass or instantiate a union.
507 - You can use Optional[X] as a shorthand for Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300508 """
509 if parameters == ():
510 raise TypeError("Cannot take a Union of no types.")
511 if not isinstance(parameters, tuple):
512 parameters = (parameters,)
513 msg = "Union[arg, ...]: each arg must be a type."
514 parameters = tuple(_type_check(p, msg) for p in parameters)
515 parameters = _remove_dups_flatten(parameters)
516 if len(parameters) == 1:
517 return parameters[0]
Miss Islington (bot)36a24972021-08-06 10:08:27 -0700518 if len(parameters) == 2 and type(None) in parameters:
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700519 return _UnionGenericAlias(self, parameters, name="Optional")
520 return _UnionGenericAlias(self, parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000521
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300522@_SpecialForm
523def Optional(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000524 """Optional type.
525
526 Optional[X] is equivalent to Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300527 """
528 arg = _type_check(parameters, f"{self} requires a single type.")
529 return Union[arg, type(None)]
Guido van Rossumb7dedc82016-10-29 12:44:29 -0700530
Yurii Karabasf03d3182020-11-17 04:23:19 +0200531@_LiteralSpecialForm
Miss Islington (bot)3997f3c2021-10-31 01:43:40 -0700532@_tp_cache(typed=True)
533def Literal(self, *parameters):
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100534 """Special typing form to define literal types (a.k.a. value types).
535
536 This form can be used to indicate to type checkers that the corresponding
537 variable or function parameter has a value equivalent to the provided
538 literal (or one of several literals):
539
540 def validate_simple(data: Any) -> Literal[True]: # always returns True
541 ...
542
543 MODE = Literal['r', 'rb', 'w', 'wb']
544 def open_helper(file: str, mode: MODE) -> str:
545 ...
546
547 open_helper('/some/path', 'r') # Passes type check
548 open_helper('/other/path', 'typo') # Error in type checker
549
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300550 Literal[...] cannot be subclassed. At runtime, an arbitrary value
551 is allowed as type argument to Literal[...], but type checkers may
552 impose restrictions.
553 """
554 # There is no '_type_check' call because arguments to Literal[...] are
555 # values, not types.
Yurii Karabasf03d3182020-11-17 04:23:19 +0200556 parameters = _flatten_literal_params(parameters)
557
558 try:
559 parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
560 except TypeError: # unhashable parameters
561 pass
562
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700563 return _LiteralGenericAlias(self, parameters)
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100564
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700565
Mikhail Golubev4f3c2502020-10-08 00:44:31 +0300566@_SpecialForm
567def TypeAlias(self, parameters):
568 """Special marker indicating that an assignment should
569 be recognized as a proper type alias definition by type
570 checkers.
571
572 For example::
573
574 Predicate: TypeAlias = Callable[..., bool]
575
576 It's invalid when used anywhere except as in the example above.
577 """
578 raise TypeError(f"{self} is not subscriptable")
579
580
kj73607be2020-12-24 12:33:48 +0800581@_SpecialForm
582def Concatenate(self, parameters):
Ken Jin11276cd2021-01-02 08:45:50 +0800583 """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a
584 higher order function which adds, removes or transforms parameters of a
585 callable.
kj73607be2020-12-24 12:33:48 +0800586
587 For example::
588
589 Callable[Concatenate[int, P], int]
590
591 See PEP 612 for detailed information.
592 """
593 if parameters == ():
594 raise TypeError("Cannot take a Concatenate of no types.")
595 if not isinstance(parameters, tuple):
596 parameters = (parameters,)
597 if not isinstance(parameters[-1], ParamSpec):
598 raise TypeError("The last parameter to Concatenate should be a "
599 "ParamSpec variable.")
600 msg = "Concatenate[arg, ...]: each arg must be a type."
Miss Islington (bot)89db0902022-01-27 05:01:24 -0800601 parameters = (*(_type_check(p, msg) for p in parameters[:-1]), parameters[-1])
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700602 return _ConcatenateGenericAlias(self, parameters)
kj73607be2020-12-24 12:33:48 +0800603
604
Ken Jin05ab4b62021-04-27 22:31:04 +0800605@_SpecialForm
606def TypeGuard(self, parameters):
607 """Special typing form used to annotate the return type of a user-defined
608 type guard function. ``TypeGuard`` only accepts a single type argument.
609 At runtime, functions marked this way should return a boolean.
610
611 ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static
612 type checkers to determine a more precise type of an expression within a
613 program's code flow. Usually type narrowing is done by analyzing
614 conditional code flow and applying the narrowing to a block of code. The
615 conditional expression here is sometimes referred to as a "type guard".
616
617 Sometimes it would be convenient to use a user-defined boolean function
618 as a type guard. Such a function should use ``TypeGuard[...]`` as its
619 return type to alert static type checkers to this intention.
620
621 Using ``-> TypeGuard`` tells the static type checker that for a given
622 function:
623
624 1. The return value is a boolean.
625 2. If the return value is ``True``, the type of its argument
626 is the type inside ``TypeGuard``.
627
628 For example::
629
630 def is_str(val: Union[str, float]):
631 # "isinstance" type guard
632 if isinstance(val, str):
633 # Type of ``val`` is narrowed to ``str``
634 ...
635 else:
636 # Else, type of ``val`` is narrowed to ``float``.
637 ...
638
639 Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower
640 form of ``TypeA`` (it can even be a wider form) and this may lead to
641 type-unsafe results. The main reason is to allow for things like
642 narrowing ``List[object]`` to ``List[str]`` even though the latter is not
643 a subtype of the former, since ``List`` is invariant. The responsibility of
644 writing type-safe type guards is left to the user.
645
646 ``TypeGuard`` also works with type variables. For more information, see
647 PEP 647 (User-Defined Type Guards).
648 """
649 item = _type_check(parameters, f'{self} accepts only single type.')
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700650 return _GenericAlias(self, (item,))
Ken Jin05ab4b62021-04-27 22:31:04 +0800651
652
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000653class ForwardRef(_Final, _root=True):
Guido van Rossumb24569a2016-11-20 18:01:29 -0800654 """Internal wrapper to hold a forward reference."""
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700655
Guido van Rossum4cefe742016-09-27 15:20:12 -0700656 __slots__ = ('__forward_arg__', '__forward_code__',
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400657 '__forward_evaluated__', '__forward_value__',
Miss Islington (bot)d312b852021-09-25 02:21:13 -0700658 '__forward_is_argument__', '__forward_is_class__',
659 '__forward_module__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700660
Miss Islington (bot)d312b852021-09-25 02:21:13 -0700661 def __init__(self, arg, is_argument=True, module=None, *, is_class=False):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700662 if not isinstance(arg, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000663 raise TypeError(f"Forward reference must be a string -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700664 try:
665 code = compile(arg, '<string>', 'eval')
666 except SyntaxError:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000667 raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700668 self.__forward_arg__ = arg
669 self.__forward_code__ = code
670 self.__forward_evaluated__ = False
671 self.__forward_value__ = None
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400672 self.__forward_is_argument__ = is_argument
Miss Islington (bot)d312b852021-09-25 02:21:13 -0700673 self.__forward_is_class__ = is_class
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700674 self.__forward_module__ = module
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700675
wyfo653f4202020-07-22 21:47:28 +0200676 def _evaluate(self, globalns, localns, recursive_guard):
677 if self.__forward_arg__ in recursive_guard:
678 return self
Guido van Rossumdad17902016-11-10 08:29:18 -0800679 if not self.__forward_evaluated__ or localns is not globalns:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700680 if globalns is None and localns is None:
681 globalns = localns = {}
682 elif globalns is None:
683 globalns = localns
684 elif localns is None:
685 localns = globalns
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700686 if self.__forward_module__ is not None:
687 globalns = getattr(
688 sys.modules.get(self.__forward_module__, None), '__dict__', globalns
689 )
Miss Islington (bot)d312b852021-09-25 02:21:13 -0700690 type_ = _type_check(
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700691 eval(self.__forward_code__, globalns, localns),
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400692 "Forward references must evaluate to types.",
wyfo653f4202020-07-22 21:47:28 +0200693 is_argument=self.__forward_is_argument__,
Miss Islington (bot)41e0aea2022-01-25 06:38:45 -0800694 allow_special_forms=self.__forward_is_class__,
wyfo653f4202020-07-22 21:47:28 +0200695 )
696 self.__forward_value__ = _eval_type(
697 type_, globalns, localns, recursive_guard | {self.__forward_arg__}
698 )
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700699 self.__forward_evaluated__ = True
700 return self.__forward_value__
701
Guido van Rossum4cefe742016-09-27 15:20:12 -0700702 def __eq__(self, other):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000703 if not isinstance(other, ForwardRef):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700704 return NotImplemented
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100705 if self.__forward_evaluated__ and other.__forward_evaluated__:
706 return (self.__forward_arg__ == other.__forward_arg__ and
707 self.__forward_value__ == other.__forward_value__)
708 return self.__forward_arg__ == other.__forward_arg__
Guido van Rossum4cefe742016-09-27 15:20:12 -0700709
710 def __hash__(self):
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100711 return hash(self.__forward_arg__)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700712
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700713 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000714 return f'ForwardRef({self.__forward_arg__!r})'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700715
kj73607be2020-12-24 12:33:48 +0800716class _TypeVarLike:
717 """Mixin for TypeVar-like types (TypeVar and ParamSpec)."""
718 def __init__(self, bound, covariant, contravariant):
719 """Used to setup TypeVars and ParamSpec's bound, covariant and
720 contravariant attributes.
721 """
722 if covariant and contravariant:
723 raise ValueError("Bivariant types are not supported.")
724 self.__covariant__ = bool(covariant)
725 self.__contravariant__ = bool(contravariant)
726 if bound:
727 self.__bound__ = _type_check(bound, "Bound must be a type.")
728 else:
729 self.__bound__ = None
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700730
kj73607be2020-12-24 12:33:48 +0800731 def __or__(self, right):
732 return Union[self, right]
733
Jelle Zijlstra90459192021-04-10 20:00:05 -0700734 def __ror__(self, left):
735 return Union[left, self]
kj73607be2020-12-24 12:33:48 +0800736
737 def __repr__(self):
738 if self.__covariant__:
739 prefix = '+'
740 elif self.__contravariant__:
741 prefix = '-'
742 else:
743 prefix = '~'
744 return prefix + self.__name__
745
746 def __reduce__(self):
747 return self.__name__
748
749
750class TypeVar( _Final, _Immutable, _TypeVarLike, _root=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700751 """Type variable.
752
753 Usage::
754
755 T = TypeVar('T') # Can be anything
756 A = TypeVar('A', str, bytes) # Must be str or bytes
757
758 Type variables exist primarily for the benefit of static type
759 checkers. They serve as the parameters for generic types as well
760 as for generic function definitions. See class Generic for more
761 information on generic types. Generic functions work as follows:
762
Guido van Rossumb24569a2016-11-20 18:01:29 -0800763 def repeat(x: T, n: int) -> List[T]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700764 '''Return a list containing n references to x.'''
765 return [x]*n
766
767 def longest(x: A, y: A) -> A:
768 '''Return the longest of two strings.'''
769 return x if len(x) >= len(y) else y
770
771 The latter example's signature is essentially the overloading
772 of (str, str) -> str and (bytes, bytes) -> bytes. Also note
773 that if the arguments are instances of some subclass of str,
774 the return type is still plain str.
775
Guido van Rossumb24569a2016-11-20 18:01:29 -0800776 At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700777
Guido van Rossumefa798d2016-08-23 11:01:50 -0700778 Type variables defined with covariant=True or contravariant=True
João D. Ferreira86bfed32018-07-07 16:41:20 +0100779 can be used to declare covariant or contravariant generic types.
Guido van Rossumefa798d2016-08-23 11:01:50 -0700780 See PEP 484 for more details. By default generic types are invariant
781 in all type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700782
783 Type variables can be introspected. e.g.:
784
785 T.__name__ == 'T'
786 T.__constraints__ == ()
787 T.__covariant__ == False
788 T.__contravariant__ = False
789 A.__constraints__ == (str, bytes)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100790
791 Note that only type variables defined in global scope can be pickled.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700792 """
793
Guido van Rossum4cefe742016-09-27 15:20:12 -0700794 __slots__ = ('__name__', '__bound__', '__constraints__',
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300795 '__covariant__', '__contravariant__', '__dict__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700796
797 def __init__(self, name, *constraints, bound=None,
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800798 covariant=False, contravariant=False):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700799 self.__name__ = name
kj73607be2020-12-24 12:33:48 +0800800 super().__init__(bound, covariant, contravariant)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700801 if constraints and bound is not None:
802 raise TypeError("Constraints cannot be combined with bound=...")
803 if constraints and len(constraints) == 1:
804 raise TypeError("A single constraint is not allowed")
805 msg = "TypeVar(name, constraint, ...): constraints must be types."
806 self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
HongWeipenga25a04f2020-04-21 04:01:53 +0800807 try:
808 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling
809 except (AttributeError, ValueError):
810 def_mod = None
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300811 if def_mod != 'typing':
812 self.__module__ = def_mod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700813
Maggie Moss1b4552c2020-09-09 13:23:24 -0700814
Jelle Zijlstra52243362021-04-10 19:57:05 -0700815class ParamSpecArgs(_Final, _Immutable, _root=True):
816 """The args for a ParamSpec object.
817
818 Given a ParamSpec object P, P.args is an instance of ParamSpecArgs.
819
820 ParamSpecArgs objects have a reference back to their ParamSpec:
821
822 P.args.__origin__ is P
823
824 This type is meant for runtime introspection and has no special meaning to
825 static type checkers.
826 """
827 def __init__(self, origin):
828 self.__origin__ = origin
829
830 def __repr__(self):
831 return f"{self.__origin__.__name__}.args"
832
833
834class ParamSpecKwargs(_Final, _Immutable, _root=True):
835 """The kwargs for a ParamSpec object.
836
837 Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs.
838
839 ParamSpecKwargs objects have a reference back to their ParamSpec:
840
841 P.kwargs.__origin__ is P
842
843 This type is meant for runtime introspection and has no special meaning to
844 static type checkers.
845 """
846 def __init__(self, origin):
847 self.__origin__ = origin
848
849 def __repr__(self):
850 return f"{self.__origin__.__name__}.kwargs"
851
852
kj73607be2020-12-24 12:33:48 +0800853class ParamSpec(_Final, _Immutable, _TypeVarLike, _root=True):
854 """Parameter specification variable.
Maggie Moss1b4552c2020-09-09 13:23:24 -0700855
kj73607be2020-12-24 12:33:48 +0800856 Usage::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700857
kj73607be2020-12-24 12:33:48 +0800858 P = ParamSpec('P')
859
860 Parameter specification variables exist primarily for the benefit of static
861 type checkers. They are used to forward the parameter types of one
Ken Jin11276cd2021-01-02 08:45:50 +0800862 callable to another callable, a pattern commonly found in higher order
863 functions and decorators. They are only valid when used in ``Concatenate``,
Miss Islington (bot)315a60a2022-01-28 10:36:16 -0800864 or as the first argument to ``Callable``, or as parameters for user-defined
Ken Jin11276cd2021-01-02 08:45:50 +0800865 Generics. See class Generic for more information on generic types. An
866 example for annotating a decorator::
kj73607be2020-12-24 12:33:48 +0800867
868 T = TypeVar('T')
869 P = ParamSpec('P')
870
871 def add_logging(f: Callable[P, T]) -> Callable[P, T]:
872 '''A type-safe decorator to add logging to a function.'''
873 def inner(*args: P.args, **kwargs: P.kwargs) -> T:
874 logging.info(f'{f.__name__} was called')
875 return f(*args, **kwargs)
876 return inner
877
878 @add_logging
879 def add_two(x: float, y: float) -> float:
880 '''Add two numbers together.'''
881 return x + y
882
883 Parameter specification variables defined with covariant=True or
884 contravariant=True can be used to declare covariant or contravariant
885 generic types. These keyword arguments are valid, but their actual semantics
886 are yet to be decided. See PEP 612 for details.
887
888 Parameter specification variables can be introspected. e.g.:
889
890 P.__name__ == 'T'
891 P.__bound__ == None
892 P.__covariant__ == False
893 P.__contravariant__ == False
894
895 Note that only parameter specification variables defined in global scope can
896 be pickled.
897 """
898
899 __slots__ = ('__name__', '__bound__', '__covariant__', '__contravariant__',
900 '__dict__')
901
Jelle Zijlstra52243362021-04-10 19:57:05 -0700902 @property
903 def args(self):
904 return ParamSpecArgs(self)
905
906 @property
907 def kwargs(self):
908 return ParamSpecKwargs(self)
kj73607be2020-12-24 12:33:48 +0800909
Ken Jinace008c2021-01-11 08:11:41 +0800910 def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
kj73607be2020-12-24 12:33:48 +0800911 self.__name__ = name
912 super().__init__(bound, covariant, contravariant)
913 try:
914 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
915 except (AttributeError, ValueError):
916 def_mod = None
917 if def_mod != 'typing':
918 self.__module__ = def_mod
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100919
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700920
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000921def _is_dunder(attr):
922 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800923
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300924class _BaseGenericAlias(_Final, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000925 """The central part of internal API.
926
927 This represents a generic version of type 'origin' with type arguments 'params'.
928 There are two kind of these aliases: user defined and special. The special ones
929 are wrappers around builtin collections and ABCs in collections.abc. These must
930 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
931 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700932 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300933 def __init__(self, origin, *, inst=True, name=None):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000934 self._inst = inst
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000935 self._name = name
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700936 self.__origin__ = origin
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000937 self.__slots__ = None # This is not documented.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300938
939 def __call__(self, *args, **kwargs):
940 if not self._inst:
941 raise TypeError(f"Type {self._name} cannot be instantiated; "
942 f"use {self.__origin__.__name__}() instead")
943 result = self.__origin__(*args, **kwargs)
944 try:
945 result.__orig_class__ = self
946 except AttributeError:
947 pass
948 return result
949
950 def __mro_entries__(self, bases):
951 res = []
952 if self.__origin__ not in bases:
953 res.append(self.__origin__)
954 i = bases.index(self)
955 for b in bases[i+1:]:
956 if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
957 break
958 else:
959 res.append(Generic)
960 return tuple(res)
961
962 def __getattr__(self, attr):
Miss Islington (bot)c895f2b2021-07-19 10:57:27 -0700963 if attr in {'__name__', '__qualname__'}:
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700964 return self._name or self.__origin__.__name__
Miss Islington (bot)c895f2b2021-07-19 10:57:27 -0700965
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300966 # We are careful for copy and pickle.
967 # Also for simplicity we just don't relay all dunder names
968 if '__origin__' in self.__dict__ and not _is_dunder(attr):
969 return getattr(self.__origin__, attr)
970 raise AttributeError(attr)
971
972 def __setattr__(self, attr, val):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700973 if _is_dunder(attr) or attr in {'_name', '_inst', '_nparams',
974 '_typevar_types', '_paramspec_tvars'}:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300975 super().__setattr__(attr, val)
976 else:
977 setattr(self.__origin__, attr, val)
978
979 def __instancecheck__(self, obj):
980 return self.__subclasscheck__(type(obj))
981
982 def __subclasscheck__(self, cls):
983 raise TypeError("Subscripted generics cannot be used with"
984 " class and instance checks")
985
Miss Islington (bot)87539cc2021-12-17 03:33:07 -0800986 def __dir__(self):
987 return list(set(super().__dir__()
988 + [attr for attr in dir(self.__origin__) if not _is_dunder(attr)]))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300989
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300990# Special typing constructs Union, Optional, Generic, Callable and Tuple
991# use three special attributes for internal bookkeeping of generic types:
992# * __parameters__ is a tuple of unique free type parameters of a generic
993# type, for example, Dict[T, T].__parameters__ == (T,);
994# * __origin__ keeps a reference to a type that was subscripted,
995# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
996# the type.
997# * __args__ is a tuple of all arguments used in subscripting,
998# e.g., Dict[T, int].__args__ == (T, int).
999
1000
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001001class _GenericAlias(_BaseGenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001002 def __init__(self, origin, params, *, inst=True, name=None,
1003 _typevar_types=TypeVar,
1004 _paramspec_tvars=False):
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001005 super().__init__(origin, inst=inst, name=name)
1006 if not isinstance(params, tuple):
1007 params = (params,)
1008 self.__args__ = tuple(... if a is _TypingEllipsis else
1009 () if a is _TypingEmpty else
1010 a for a in params)
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001011 self.__parameters__ = _collect_type_vars(params, typevar_types=_typevar_types)
1012 self._typevar_types = _typevar_types
1013 self._paramspec_tvars = _paramspec_tvars
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001014 if not name:
1015 self.__module__ = origin.__module__
1016
1017 def __eq__(self, other):
1018 if not isinstance(other, _GenericAlias):
1019 return NotImplemented
1020 return (self.__origin__ == other.__origin__
1021 and self.__args__ == other.__args__)
1022
1023 def __hash__(self):
1024 return hash((self.__origin__, self.__args__))
1025
Maggie Moss1b4552c2020-09-09 13:23:24 -07001026 def __or__(self, right):
1027 return Union[self, right]
1028
Serhiy Storchaka80844d12021-07-16 16:42:04 +03001029 def __ror__(self, left):
1030 return Union[left, self]
Maggie Moss1b4552c2020-09-09 13:23:24 -07001031
Guido van Rossum4cefe742016-09-27 15:20:12 -07001032 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001033 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001034 if self.__origin__ in (Generic, Protocol):
1035 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001036 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001037 if not isinstance(params, tuple):
1038 params = (params,)
kj73607be2020-12-24 12:33:48 +08001039 params = tuple(_type_convert(p) for p in params)
Miss Islington (bot)c8db2922021-08-02 00:08:24 -07001040 if (self._paramspec_tvars
1041 and any(isinstance(t, ParamSpec) for t in self.__parameters__)):
1042 params = _prepare_paramspec_params(self, params)
1043 else:
1044 _check_generic(self, params, len(self.__parameters__))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001045
1046 subst = dict(zip(self.__parameters__, params))
1047 new_args = []
1048 for arg in self.__args__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001049 if isinstance(arg, self._typevar_types):
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001050 if isinstance(arg, ParamSpec):
1051 arg = subst[arg]
1052 if not _is_param_expr(arg):
1053 raise TypeError(f"Expected a list of types, an ellipsis, "
1054 f"ParamSpec, or Concatenate. Got {arg}")
1055 else:
1056 arg = subst[arg]
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001057 elif isinstance(arg, (_GenericAlias, GenericAlias, types.UnionType)):
Serhiy Storchaka0122d482020-05-10 13:39:40 +03001058 subparams = arg.__parameters__
1059 if subparams:
1060 subargs = tuple(subst[x] for x in subparams)
1061 arg = arg[subargs]
kj73607be2020-12-24 12:33:48 +08001062 # Required to flatten out the args for CallableGenericAlias
1063 if self.__origin__ == collections.abc.Callable and isinstance(arg, tuple):
1064 new_args.extend(arg)
1065 else:
1066 new_args.append(arg)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001067 return self.copy_with(tuple(new_args))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001068
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001069 def copy_with(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001070 return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001071
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001072 def __repr__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001073 if self._name:
1074 name = 'typing.' + self._name
1075 else:
1076 name = _type_repr(self.__origin__)
1077 args = ", ".join([_type_repr(a) for a in self.__args__])
1078 return f'{name}[{args}]'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001079
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001080 def __reduce__(self):
1081 if self._name:
1082 origin = globals()[self._name]
1083 else:
1084 origin = self.__origin__
1085 args = tuple(self.__args__)
1086 if len(args) == 1 and not isinstance(args[0], tuple):
1087 args, = args
1088 return operator.getitem, (origin, args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001089
1090 def __mro_entries__(self, bases):
Miss Islington (bot)81fa08c2021-08-28 11:09:45 -07001091 if isinstance(self.__origin__, _SpecialForm):
1092 raise TypeError(f"Cannot subclass {self!r}")
1093
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001094 if self._name: # generic version of an ABC or built-in class
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001095 return super().__mro_entries__(bases)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001096 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001097 if Protocol in bases:
1098 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001099 i = bases.index(self)
1100 for b in bases[i+1:]:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001101 if isinstance(b, _BaseGenericAlias) and b is not self:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001102 return ()
1103 return (self.__origin__,)
1104
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001105
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001106# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
1107# 1 for List and 2 for Dict. It may be -1 if variable number of
1108# parameters are accepted (needs custom __getitem__).
1109
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001110class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001111 def __init__(self, origin, nparams, *, inst=True, name=None):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001112 if name is None:
1113 name = origin.__name__
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001114 super().__init__(origin, inst=inst, name=name)
1115 self._nparams = nparams
Serhiy Storchaka2fbc57a2020-05-10 15:14:27 +03001116 if origin.__module__ == 'builtins':
1117 self.__doc__ = f'A generic version of {origin.__qualname__}.'
1118 else:
1119 self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001120
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001121 @_tp_cache
1122 def __getitem__(self, params):
1123 if not isinstance(params, tuple):
1124 params = (params,)
1125 msg = "Parameters to generic types must be types."
1126 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001127 _check_generic(self, params, self._nparams)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001128 return self.copy_with(params)
1129
1130 def copy_with(self, params):
1131 return _GenericAlias(self.__origin__, params,
1132 name=self._name, inst=self._inst)
1133
1134 def __repr__(self):
1135 return 'typing.' + self._name
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001136
1137 def __subclasscheck__(self, cls):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001138 if isinstance(cls, _SpecialGenericAlias):
1139 return issubclass(cls.__origin__, self.__origin__)
1140 if not isinstance(cls, _GenericAlias):
1141 return issubclass(cls, self.__origin__)
1142 return super().__subclasscheck__(cls)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001143
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001144 def __reduce__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001145 return self._name
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001146
Maggie Moss1b4552c2020-09-09 13:23:24 -07001147 def __or__(self, right):
1148 return Union[self, right]
1149
Serhiy Storchaka80844d12021-07-16 16:42:04 +03001150 def __ror__(self, left):
1151 return Union[left, self]
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001152
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001153class _CallableGenericAlias(_GenericAlias, _root=True):
1154 def __repr__(self):
1155 assert self._name == 'Callable'
kj73607be2020-12-24 12:33:48 +08001156 args = self.__args__
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001157 if len(args) == 2 and _is_param_expr(args[0]):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001158 return super().__repr__()
1159 return (f'typing.Callable'
kj73607be2020-12-24 12:33:48 +08001160 f'[[{", ".join([_type_repr(a) for a in args[:-1]])}], '
1161 f'{_type_repr(args[-1])}]')
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001162
1163 def __reduce__(self):
1164 args = self.__args__
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001165 if not (len(args) == 2 and _is_param_expr(args[0])):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001166 args = list(args[:-1]), args[-1]
1167 return operator.getitem, (Callable, args)
1168
1169
1170class _CallableType(_SpecialGenericAlias, _root=True):
1171 def copy_with(self, params):
1172 return _CallableGenericAlias(self.__origin__, params,
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001173 name=self._name, inst=self._inst,
1174 _typevar_types=(TypeVar, ParamSpec),
1175 _paramspec_tvars=True)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001176
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001177 def __getitem__(self, params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001178 if not isinstance(params, tuple) or len(params) != 2:
1179 raise TypeError("Callable must be used as "
1180 "Callable[[arg, ...], result].")
1181 args, result = params
kj463c7d32020-12-14 02:38:24 +08001182 # This relaxes what args can be on purpose to allow things like
1183 # PEP 612 ParamSpec. Responsibility for whether a user is using
1184 # Callable[...] properly is deferred to static type checkers.
1185 if isinstance(args, list):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001186 params = (tuple(args), result)
kj463c7d32020-12-14 02:38:24 +08001187 else:
1188 params = (args, result)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001189 return self.__getitem_inner__(params)
1190
1191 @_tp_cache
1192 def __getitem_inner__(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001193 args, result = params
1194 msg = "Callable[args, result]: result must be a type."
1195 result = _type_check(result, msg)
1196 if args is Ellipsis:
1197 return self.copy_with((_TypingEllipsis, result))
kj463c7d32020-12-14 02:38:24 +08001198 if not isinstance(args, tuple):
1199 args = (args,)
1200 args = tuple(_type_convert(arg) for arg in args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001201 params = args + (result,)
1202 return self.copy_with(params)
1203
1204
1205class _TupleType(_SpecialGenericAlias, _root=True):
1206 @_tp_cache
1207 def __getitem__(self, params):
1208 if params == ():
1209 return self.copy_with((_TypingEmpty,))
1210 if not isinstance(params, tuple):
1211 params = (params,)
1212 if len(params) == 2 and params[1] is ...:
1213 msg = "Tuple[t, ...]: t must be a type."
1214 p = _type_check(params[0], msg)
1215 return self.copy_with((p, _TypingEllipsis))
1216 msg = "Tuple[t0, t1, ...]: each t must be a type."
1217 params = tuple(_type_check(p, msg) for p in params)
1218 return self.copy_with(params)
1219
1220
1221class _UnionGenericAlias(_GenericAlias, _root=True):
1222 def copy_with(self, params):
1223 return Union[params]
1224
1225 def __eq__(self, other):
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001226 if not isinstance(other, (_UnionGenericAlias, types.UnionType)):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001227 return NotImplemented
1228 return set(self.__args__) == set(other.__args__)
1229
1230 def __hash__(self):
1231 return hash(frozenset(self.__args__))
1232
1233 def __repr__(self):
1234 args = self.__args__
1235 if len(args) == 2:
1236 if args[0] is type(None):
1237 return f'typing.Optional[{_type_repr(args[1])}]'
1238 elif args[1] is type(None):
1239 return f'typing.Optional[{_type_repr(args[0])}]'
1240 return super().__repr__()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001241
Maggie Moss1b4552c2020-09-09 13:23:24 -07001242 def __instancecheck__(self, obj):
1243 return self.__subclasscheck__(type(obj))
1244
1245 def __subclasscheck__(self, cls):
1246 for arg in self.__args__:
1247 if issubclass(cls, arg):
1248 return True
1249
Miss Islington (bot)36a24972021-08-06 10:08:27 -07001250 def __reduce__(self):
1251 func, (origin, args) = super().__reduce__()
1252 return func, (Union, args)
1253
Maggie Moss1b4552c2020-09-09 13:23:24 -07001254
Yurii Karabasf03d3182020-11-17 04:23:19 +02001255def _value_and_type_iter(parameters):
1256 return ((p, type(p)) for p in parameters)
1257
1258
1259class _LiteralGenericAlias(_GenericAlias, _root=True):
1260
1261 def __eq__(self, other):
1262 if not isinstance(other, _LiteralGenericAlias):
1263 return NotImplemented
1264
1265 return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__))
1266
1267 def __hash__(self):
Yurii Karabas1b540772020-11-19 18:17:38 +02001268 return hash(frozenset(_value_and_type_iter(self.__args__)))
Yurii Karabasf03d3182020-11-17 04:23:19 +02001269
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001270
kj73607be2020-12-24 12:33:48 +08001271class _ConcatenateGenericAlias(_GenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001272 def __init__(self, *args, **kwargs):
1273 super().__init__(*args, **kwargs,
1274 _typevar_types=(TypeVar, ParamSpec),
1275 _paramspec_tvars=True)
kj73607be2020-12-24 12:33:48 +08001276
Miss Islington (bot)89db0902022-01-27 05:01:24 -08001277 def copy_with(self, params):
1278 if isinstance(params[-1], (list, tuple)):
1279 return (*params[:-1], *params[-1])
1280 if isinstance(params[-1], _ConcatenateGenericAlias):
1281 params = (*params[:-1], *params[-1].__args__)
1282 elif not isinstance(params[-1], ParamSpec):
1283 raise TypeError("The last parameter to Concatenate should be a "
1284 "ParamSpec variable.")
1285 return super().copy_with(params)
1286
kj73607be2020-12-24 12:33:48 +08001287
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001288class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001289 """Abstract base class for generic types.
1290
Guido van Rossumb24569a2016-11-20 18:01:29 -08001291 A generic type is typically declared by inheriting from
1292 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001293 For example, a generic mapping type might be defined as::
1294
1295 class Mapping(Generic[KT, VT]):
1296 def __getitem__(self, key: KT) -> VT:
1297 ...
1298 # Etc.
1299
1300 This class can then be used as follows::
1301
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001302 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001303 try:
1304 return mapping[key]
1305 except KeyError:
1306 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001307 """
Guido van Rossumd70fe632015-08-05 12:11:06 +02001308 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001309 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +02001310
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001311 @_tp_cache
1312 def __class_getitem__(cls, params):
1313 if not isinstance(params, tuple):
1314 params = (params,)
1315 if not params and cls is not Tuple:
1316 raise TypeError(
1317 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
kj73607be2020-12-24 12:33:48 +08001318 params = tuple(_type_convert(p) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001319 if cls in (Generic, Protocol):
1320 # Generic and Protocol can only be subscripted with unique type variables.
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001321 if not all(isinstance(p, (TypeVar, ParamSpec)) for p in params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001322 raise TypeError(
kj73607be2020-12-24 12:33:48 +08001323 f"Parameters to {cls.__name__}[...] must all be type variables "
1324 f"or parameter specification variables.")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001325 if len(set(params)) != len(params):
1326 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001327 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001328 else:
1329 # Subscripting a regular Generic subclass.
kj73607be2020-12-24 12:33:48 +08001330 if any(isinstance(t, ParamSpec) for t in cls.__parameters__):
1331 params = _prepare_paramspec_params(cls, params)
Miss Islington (bot)c8db2922021-08-02 00:08:24 -07001332 else:
1333 _check_generic(cls, params, len(cls.__parameters__))
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001334 return _GenericAlias(cls, params,
1335 _typevar_types=(TypeVar, ParamSpec),
1336 _paramspec_tvars=True)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001337
1338 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +01001339 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001340 tvars = []
1341 if '__orig_bases__' in cls.__dict__:
1342 error = Generic in cls.__orig_bases__
1343 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001344 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001345 if error:
1346 raise TypeError("Cannot inherit from plain Generic")
1347 if '__orig_bases__' in cls.__dict__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001348 tvars = _collect_type_vars(cls.__orig_bases__, (TypeVar, ParamSpec))
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001349 # Look for Generic[T1, ..., Tn].
1350 # If found, tvars must be a subset of it.
1351 # If not found, tvars is it.
1352 # Also check for and reject plain Generic,
1353 # and reject multiple Generic[...].
1354 gvars = None
1355 for base in cls.__orig_bases__:
1356 if (isinstance(base, _GenericAlias) and
1357 base.__origin__ is Generic):
1358 if gvars is not None:
1359 raise TypeError(
1360 "Cannot inherit from Generic[...] multiple types.")
1361 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001362 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001363 tvarset = set(tvars)
1364 gvarset = set(gvars)
1365 if not tvarset <= gvarset:
1366 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
1367 s_args = ', '.join(str(g) for g in gvars)
1368 raise TypeError(f"Some type variables ({s_vars}) are"
1369 f" not listed in Generic[{s_args}]")
1370 tvars = gvars
1371 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001372
1373
1374class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001375 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
1376 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001377 to sneak in where prohibited.
1378 """
1379
1380
1381class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001382 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001383
1384
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001385_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
1386 '_is_protocol', '_is_runtime_protocol']
1387
1388_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
1389 '__init__', '__module__', '__new__', '__slots__',
Guido van Rossum48b069a2020-04-07 09:50:06 -07001390 '__subclasshook__', '__weakref__', '__class_getitem__']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001391
1392# These special attributes will be not collected as protocol members.
1393EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
1394
1395
1396def _get_protocol_attrs(cls):
1397 """Collect protocol members from a protocol class objects.
1398
1399 This includes names actually defined in the class dictionary, as well
1400 as names that appear in annotations. Special names (above) are skipped.
1401 """
1402 attrs = set()
1403 for base in cls.__mro__[:-1]: # without object
1404 if base.__name__ in ('Protocol', 'Generic'):
1405 continue
1406 annotations = getattr(base, '__annotations__', {})
1407 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
1408 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
1409 attrs.add(attr)
1410 return attrs
1411
1412
1413def _is_callable_members_only(cls):
1414 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
1415 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
1416
1417
Miss Islington (bot)79e9f5a2021-09-02 23:26:53 -07001418def _no_init_or_replace_init(self, *args, **kwargs):
1419 cls = type(self)
1420
1421 if cls._is_protocol:
1422 raise TypeError('Protocols cannot be instantiated')
1423
Miss Islington (bot)c0816492021-09-08 08:05:23 -07001424 # Already using a custom `__init__`. No need to calculate correct
1425 # `__init__` to call. This can lead to RecursionError. See bpo-45121.
1426 if cls.__init__ is not _no_init_or_replace_init:
1427 return
1428
Miss Islington (bot)79e9f5a2021-09-02 23:26:53 -07001429 # Initially, `__init__` of a protocol subclass is set to `_no_init_or_replace_init`.
1430 # The first instantiation of the subclass will call `_no_init_or_replace_init` which
1431 # searches for a proper new `__init__` in the MRO. The new `__init__`
1432 # replaces the subclass' old `__init__` (ie `_no_init_or_replace_init`). Subsequent
1433 # instantiation of the protocol subclass will thus use the new
1434 # `__init__` and no longer call `_no_init_or_replace_init`.
1435 for base in cls.__mro__:
1436 init = base.__dict__.get('__init__', _no_init_or_replace_init)
1437 if init is not _no_init_or_replace_init:
1438 cls.__init__ = init
1439 break
1440 else:
1441 # should not happen
1442 cls.__init__ = object.__init__
1443
1444 cls.__init__(self, *args, **kwargs)
1445
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001446
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001447def _caller(depth=1, default='__main__'):
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001448 try:
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001449 return sys._getframe(depth + 1).f_globals.get('__name__', default)
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001450 except (AttributeError, ValueError): # For platforms without _getframe()
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001451 return None
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001452
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001453
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001454def _allow_reckless_class_checks(depth=3):
Nickolena Fishercfaf4c02020-04-26 12:49:11 -05001455 """Allow instance and class checks for special stdlib modules.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001456
1457 The abc and functools modules indiscriminately call isinstance() and
1458 issubclass() on the whole MRO of a user class, which may contain protocols.
1459 """
1460 try:
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001461 return sys._getframe(depth).f_globals['__name__'] in ['abc', 'functools']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001462 except (AttributeError, ValueError): # For platforms without _getframe().
1463 return True
1464
1465
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001466_PROTO_ALLOWLIST = {
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001467 'collections.abc': [
1468 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
1469 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
1470 ],
1471 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1472}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001473
1474
1475class _ProtocolMeta(ABCMeta):
1476 # This metaclass is really unfortunate and exists only because of
1477 # the lack of __instancehook__.
1478 def __instancecheck__(cls, instance):
1479 # We need this method for situations where attributes are
1480 # assigned in __init__.
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001481 if (
1482 getattr(cls, '_is_protocol', False) and
1483 not getattr(cls, '_is_runtime_protocol', False) and
1484 not _allow_reckless_class_checks(depth=2)
1485 ):
1486 raise TypeError("Instance and class checks can only be used with"
1487 " @runtime_checkable protocols")
1488
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001489 if ((not getattr(cls, '_is_protocol', False) or
1490 _is_callable_members_only(cls)) and
1491 issubclass(instance.__class__, cls)):
1492 return True
1493 if cls._is_protocol:
1494 if all(hasattr(instance, attr) and
1495 # All *methods* can be blocked by setting them to None.
1496 (not callable(getattr(cls, attr, None)) or
1497 getattr(instance, attr) is not None)
1498 for attr in _get_protocol_attrs(cls)):
1499 return True
1500 return super().__instancecheck__(instance)
1501
1502
1503class Protocol(Generic, metaclass=_ProtocolMeta):
1504 """Base class for protocol classes.
1505
1506 Protocol classes are defined as::
1507
1508 class Proto(Protocol):
1509 def meth(self) -> int:
1510 ...
1511
1512 Such classes are primarily used with static type checkers that recognize
1513 structural subtyping (static duck-typing), for example::
1514
1515 class C:
1516 def meth(self) -> int:
1517 return 0
1518
1519 def func(x: Proto) -> int:
1520 return x.meth()
1521
1522 func(C()) # Passes static type check
1523
1524 See PEP 544 for details. Protocol classes decorated with
1525 @typing.runtime_checkable act as simple-minded runtime protocols that check
1526 only the presence of given attributes, ignoring their type signatures.
1527 Protocol classes can be generic, they are defined as::
1528
1529 class GenProto(Protocol[T]):
1530 def meth(self) -> T:
1531 ...
1532 """
1533 __slots__ = ()
1534 _is_protocol = True
1535 _is_runtime_protocol = False
1536
1537 def __init_subclass__(cls, *args, **kwargs):
1538 super().__init_subclass__(*args, **kwargs)
1539
1540 # Determine if this is a protocol or a concrete subclass.
1541 if not cls.__dict__.get('_is_protocol', False):
1542 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1543
1544 # Set (or override) the protocol subclass hook.
1545 def _proto_hook(other):
1546 if not cls.__dict__.get('_is_protocol', False):
1547 return NotImplemented
1548
1549 # First, perform various sanity checks.
1550 if not getattr(cls, '_is_runtime_protocol', False):
Rossc1af1282020-12-29 11:55:28 +00001551 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001552 return NotImplemented
1553 raise TypeError("Instance and class checks can only be used with"
1554 " @runtime_checkable protocols")
1555 if not _is_callable_members_only(cls):
Rossc1af1282020-12-29 11:55:28 +00001556 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001557 return NotImplemented
1558 raise TypeError("Protocols with non-method members"
1559 " don't support issubclass()")
1560 if not isinstance(other, type):
1561 # Same error message as for issubclass(1, int).
1562 raise TypeError('issubclass() arg 1 must be a class')
1563
1564 # Second, perform the actual structural compatibility check.
1565 for attr in _get_protocol_attrs(cls):
1566 for base in other.__mro__:
1567 # Check if the members appears in the class dictionary...
1568 if attr in base.__dict__:
1569 if base.__dict__[attr] is None:
1570 return NotImplemented
1571 break
1572
1573 # ...or in annotations, if it is a sub-protocol.
1574 annotations = getattr(base, '__annotations__', {})
1575 if (isinstance(annotations, collections.abc.Mapping) and
1576 attr in annotations and
1577 issubclass(other, Generic) and other._is_protocol):
1578 break
1579 else:
1580 return NotImplemented
1581 return True
1582
1583 if '__subclasshook__' not in cls.__dict__:
1584 cls.__subclasshook__ = _proto_hook
1585
1586 # We have nothing more to do for non-protocols...
1587 if not cls._is_protocol:
1588 return
1589
1590 # ... otherwise check consistency of bases, and prohibit instantiation.
1591 for base in cls.__bases__:
1592 if not (base in (object, Generic) or
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001593 base.__module__ in _PROTO_ALLOWLIST and
1594 base.__name__ in _PROTO_ALLOWLIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001595 issubclass(base, Generic) and base._is_protocol):
1596 raise TypeError('Protocols can only inherit from other'
1597 ' protocols, got %r' % base)
Miss Islington (bot)79e9f5a2021-09-02 23:26:53 -07001598 cls.__init__ = _no_init_or_replace_init
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001599
1600
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001601class _AnnotatedAlias(_GenericAlias, _root=True):
1602 """Runtime representation of an annotated type.
1603
1604 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1605 with extra annotations. The alias behaves like a normal typing alias,
1606 instantiating is the same as instantiating the underlying type, binding
1607 it to types is also the same.
1608 """
1609 def __init__(self, origin, metadata):
1610 if isinstance(origin, _AnnotatedAlias):
1611 metadata = origin.__metadata__ + metadata
1612 origin = origin.__origin__
Miss Islington (bot)06e9a352021-08-25 11:36:47 -07001613 super().__init__(origin, origin)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001614 self.__metadata__ = metadata
1615
1616 def copy_with(self, params):
1617 assert len(params) == 1
1618 new_type = params[0]
1619 return _AnnotatedAlias(new_type, self.__metadata__)
1620
1621 def __repr__(self):
1622 return "typing.Annotated[{}, {}]".format(
1623 _type_repr(self.__origin__),
1624 ", ".join(repr(a) for a in self.__metadata__)
1625 )
1626
1627 def __reduce__(self):
1628 return operator.getitem, (
1629 Annotated, (self.__origin__,) + self.__metadata__
1630 )
1631
1632 def __eq__(self, other):
1633 if not isinstance(other, _AnnotatedAlias):
1634 return NotImplemented
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001635 return (self.__origin__ == other.__origin__
1636 and self.__metadata__ == other.__metadata__)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001637
1638 def __hash__(self):
1639 return hash((self.__origin__, self.__metadata__))
1640
Miss Islington (bot)06e9a352021-08-25 11:36:47 -07001641 def __getattr__(self, attr):
1642 if attr in {'__name__', '__qualname__'}:
1643 return 'Annotated'
1644 return super().__getattr__(attr)
1645
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001646
1647class Annotated:
1648 """Add context specific metadata to a type.
1649
1650 Example: Annotated[int, runtime_check.Unsigned] indicates to the
1651 hypothetical runtime_check module that this type is an unsigned int.
1652 Every other consumer of this type can ignore this metadata and treat
1653 this type as int.
1654
1655 The first argument to Annotated must be a valid type.
1656
1657 Details:
1658
1659 - It's an error to call `Annotated` with less than two arguments.
1660 - Nested Annotated are flattened::
1661
1662 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1663
1664 - Instantiating an annotated type is equivalent to instantiating the
1665 underlying type::
1666
1667 Annotated[C, Ann1](5) == C(5)
1668
1669 - Annotated can be used as a generic type alias::
1670
1671 Optimized = Annotated[T, runtime.Optimize()]
1672 Optimized[int] == Annotated[int, runtime.Optimize()]
1673
1674 OptimizedList = Annotated[List[T], runtime.Optimize()]
1675 OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1676 """
1677
1678 __slots__ = ()
1679
1680 def __new__(cls, *args, **kwargs):
1681 raise TypeError("Type Annotated cannot be instantiated.")
1682
1683 @_tp_cache
1684 def __class_getitem__(cls, params):
1685 if not isinstance(params, tuple) or len(params) < 2:
1686 raise TypeError("Annotated[...] should be used "
1687 "with at least two arguments (a type and an "
1688 "annotation).")
1689 msg = "Annotated[t, ...]: t must be a type."
Miss Islington (bot)41e0aea2022-01-25 06:38:45 -08001690 origin = _type_check(params[0], msg, allow_special_forms=True)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001691 metadata = tuple(params[1:])
1692 return _AnnotatedAlias(origin, metadata)
1693
1694 def __init_subclass__(cls, *args, **kwargs):
1695 raise TypeError(
1696 "Cannot subclass {}.Annotated".format(cls.__module__)
1697 )
1698
1699
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001700def runtime_checkable(cls):
1701 """Mark a protocol class as a runtime protocol.
1702
1703 Such protocol can be used with isinstance() and issubclass().
1704 Raise TypeError if applied to a non-protocol class.
1705 This allows a simple-minded structural check very similar to
1706 one trick ponies in collections.abc such as Iterable.
1707 For example::
1708
1709 @runtime_checkable
1710 class Closable(Protocol):
1711 def close(self): ...
1712
1713 assert isinstance(open('/some/file'), Closable)
1714
1715 Warning: this will check only the presence of the required methods,
1716 not their type signatures!
1717 """
1718 if not issubclass(cls, Generic) or not cls._is_protocol:
1719 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1720 ' got %r' % cls)
1721 cls._is_runtime_protocol = True
1722 return cls
1723
1724
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001725def cast(typ, val):
1726 """Cast a value to a type.
1727
1728 This returns the value unchanged. To the type checker this
1729 signals that the return value has the designated type, but at
1730 runtime we intentionally don't check anything (we want this
1731 to be as fast as possible).
1732 """
1733 return val
1734
1735
1736def _get_defaults(func):
1737 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001738 try:
1739 code = func.__code__
1740 except AttributeError:
1741 # Some built-in functions don't have __code__, __defaults__, etc.
1742 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001743 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001744 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001745 arg_names = arg_names[:pos_count]
1746 defaults = func.__defaults__ or ()
1747 kwdefaults = func.__kwdefaults__
1748 res = dict(kwdefaults) if kwdefaults else {}
1749 pos_offset = pos_count - len(defaults)
1750 for name, value in zip(arg_names[pos_offset:], defaults):
1751 assert name not in res
1752 res[name] = value
1753 return res
1754
1755
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001756_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1757 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001758 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001759
1760
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001761def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001762 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001763
Guido van Rossum991d14f2016-11-09 13:12:51 -08001764 This is often the same as obj.__annotations__, but it handles
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001765 forward references encoded as string literals, adds Optional[t] if a
1766 default value equal to None is set and recursively replaces all
1767 'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001768
Guido van Rossum991d14f2016-11-09 13:12:51 -08001769 The argument may be a module, class, method, or function. The annotations
1770 are returned as a dictionary. For classes, annotations include also
1771 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001772
Guido van Rossum991d14f2016-11-09 13:12:51 -08001773 TypeError is raised if the argument is not of a type that can contain
1774 annotations, and an empty dictionary is returned if no annotations are
1775 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001776
Guido van Rossum991d14f2016-11-09 13:12:51 -08001777 BEWARE -- the behavior of globalns and localns is counterintuitive
1778 (unless you are familiar with how eval() and exec() work). The
1779 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001780
Guido van Rossum991d14f2016-11-09 13:12:51 -08001781 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001782 globals from obj (or the respective module's globals for classes),
1783 and these are also used as the locals. If the object does not appear
Ken Jin1b1f9852021-04-27 01:31:21 +08001784 to have globals, an empty dictionary is used. For classes, the search
1785 order is globals first then locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001786
Guido van Rossum991d14f2016-11-09 13:12:51 -08001787 - If one dict argument is passed, it is used for both globals and
1788 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001789
Guido van Rossum991d14f2016-11-09 13:12:51 -08001790 - If two dict arguments are passed, they specify globals and
1791 locals, respectively.
1792 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001793
Guido van Rossum991d14f2016-11-09 13:12:51 -08001794 if getattr(obj, '__no_type_check__', None):
1795 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001796 # Classes require a special treatment.
1797 if isinstance(obj, type):
1798 hints = {}
1799 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001800 if globalns is None:
Miss Islington (bot)3df23b52021-06-26 16:52:28 -07001801 base_globals = getattr(sys.modules.get(base.__module__, None), '__dict__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001802 else:
1803 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001804 ann = base.__dict__.get('__annotations__', {})
larryhastings2f2b6982021-04-29 20:09:08 -07001805 if isinstance(ann, types.GetSetDescriptorType):
1806 ann = {}
Ken Jin852150d2021-04-13 01:23:12 +08001807 base_locals = dict(vars(base)) if localns is None else localns
Ken Jin1b1f9852021-04-27 01:31:21 +08001808 if localns is None and globalns is None:
1809 # This is surprising, but required. Before Python 3.10,
1810 # get_type_hints only evaluated the globalns of
1811 # a class. To maintain backwards compatibility, we reverse
1812 # the globalns and localns order so that eval() looks into
1813 # *base_globals* first rather than *base_locals*.
1814 # This only affects ForwardRefs.
1815 base_globals, base_locals = base_locals, base_globals
Guido van Rossum991d14f2016-11-09 13:12:51 -08001816 for name, value in ann.items():
1817 if value is None:
1818 value = type(None)
1819 if isinstance(value, str):
Miss Islington (bot)d312b852021-09-25 02:21:13 -07001820 value = ForwardRef(value, is_argument=False, is_class=True)
Ken Jin852150d2021-04-13 01:23:12 +08001821 value = _eval_type(value, base_globals, base_locals)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001822 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001823 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001824
1825 if globalns is None:
1826 if isinstance(obj, types.ModuleType):
1827 globalns = obj.__dict__
1828 else:
benedwards140aca3a32019-11-21 17:24:58 +00001829 nsobj = obj
1830 # Find globalns for the unwrapped object.
1831 while hasattr(nsobj, '__wrapped__'):
1832 nsobj = nsobj.__wrapped__
1833 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001834 if localns is None:
1835 localns = globalns
1836 elif localns is None:
1837 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001838 hints = getattr(obj, '__annotations__', None)
1839 if hints is None:
1840 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001841 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001842 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001843 else:
1844 raise TypeError('{!r} is not a module, class, method, '
1845 'or function.'.format(obj))
1846 defaults = _get_defaults(obj)
1847 hints = dict(hints)
1848 for name, value in hints.items():
1849 if value is None:
1850 value = type(None)
1851 if isinstance(value, str):
Miss Islington (bot)d312b852021-09-25 02:21:13 -07001852 # class-level forward refs were handled above, this must be either
1853 # a module-level annotation or a function argument annotation
1854 value = ForwardRef(
1855 value,
1856 is_argument=not isinstance(obj, types.ModuleType),
1857 is_class=False,
1858 )
Guido van Rossum991d14f2016-11-09 13:12:51 -08001859 value = _eval_type(value, globalns, localns)
1860 if name in defaults and defaults[name] is None:
1861 value = Optional[value]
1862 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001863 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1864
1865
1866def _strip_annotations(t):
1867 """Strips the annotations from a given type.
1868 """
1869 if isinstance(t, _AnnotatedAlias):
1870 return _strip_annotations(t.__origin__)
1871 if isinstance(t, _GenericAlias):
1872 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1873 if stripped_args == t.__args__:
1874 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001875 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001876 if isinstance(t, GenericAlias):
1877 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1878 if stripped_args == t.__args__:
1879 return t
1880 return GenericAlias(t.__origin__, stripped_args)
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001881 if isinstance(t, types.UnionType):
Ken Jina2721642021-07-19 22:22:59 +08001882 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1883 if stripped_args == t.__args__:
1884 return t
Miss Islington (bot)0aea99e2021-07-24 12:35:33 -07001885 return functools.reduce(operator.or_, stripped_args)
Ken Jina2721642021-07-19 22:22:59 +08001886
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001887 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001888
1889
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001890def get_origin(tp):
1891 """Get the unsubscripted version of a type.
1892
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001893 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1894 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001895
1896 get_origin(Literal[42]) is Literal
1897 get_origin(int) is None
1898 get_origin(ClassVar[int]) is ClassVar
1899 get_origin(Generic) is Generic
1900 get_origin(Generic[T]) is Generic
1901 get_origin(Union[T, int]) is Union
1902 get_origin(List[Tuple[T, T]][int]) == list
Jelle Zijlstra52243362021-04-10 19:57:05 -07001903 get_origin(P.args) is P
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001904 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001905 if isinstance(tp, _AnnotatedAlias):
1906 return Annotated
Jelle Zijlstra52243362021-04-10 19:57:05 -07001907 if isinstance(tp, (_BaseGenericAlias, GenericAlias,
1908 ParamSpecArgs, ParamSpecKwargs)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001909 return tp.__origin__
1910 if tp is Generic:
1911 return Generic
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001912 if isinstance(tp, types.UnionType):
1913 return types.UnionType
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001914 return None
1915
1916
1917def get_args(tp):
1918 """Get type arguments with all substitutions performed.
1919
1920 For unions, basic simplifications used by Union constructor are performed.
1921 Examples::
1922 get_args(Dict[str, int]) == (str, int)
1923 get_args(int) == ()
1924 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1925 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1926 get_args(Callable[[], T][int]) == ([], int)
1927 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001928 if isinstance(tp, _AnnotatedAlias):
1929 return (tp.__origin__,) + tp.__metadata__
Ken Jin4140f102020-12-29 04:06:19 +08001930 if isinstance(tp, (_GenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001931 res = tp.__args__
Ken Jinefb1f092020-12-29 10:26:19 +08001932 if (tp.__origin__ is collections.abc.Callable
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001933 and not (len(res) == 2 and _is_param_expr(res[0]))):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001934 res = (list(res[:-1]), res[-1])
1935 return res
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001936 if isinstance(tp, types.UnionType):
Ken Jinefb1f092020-12-29 10:26:19 +08001937 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001938 return ()
1939
1940
Patrick Reader0705ec82020-09-16 05:58:32 +01001941def is_typeddict(tp):
1942 """Check if an annotation is a TypedDict class
1943
1944 For example::
1945 class Film(TypedDict):
1946 title: str
1947 year: int
1948
1949 is_typeddict(Film) # => True
1950 is_typeddict(Union[list, str]) # => False
1951 """
1952 return isinstance(tp, _TypedDictMeta)
1953
1954
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001955def no_type_check(arg):
1956 """Decorator to indicate that annotations are not type hints.
1957
1958 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001959 applies recursively to all methods and classes defined in that class
1960 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001961
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001962 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001963 """
1964 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001965 arg_attrs = arg.__dict__.copy()
1966 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001967 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001968 arg_attrs.pop(attr)
1969 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001970 if isinstance(obj, types.FunctionType):
1971 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001972 if isinstance(obj, type):
1973 no_type_check(obj)
1974 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001975 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001976 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001977 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001978 return arg
1979
1980
1981def no_type_check_decorator(decorator):
1982 """Decorator to give another decorator the @no_type_check effect.
1983
1984 This wraps the decorator with something that wraps the decorated
1985 function in @no_type_check.
1986 """
1987
1988 @functools.wraps(decorator)
1989 def wrapped_decorator(*args, **kwds):
1990 func = decorator(*args, **kwds)
1991 func = no_type_check(func)
1992 return func
1993
1994 return wrapped_decorator
1995
1996
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001997def _overload_dummy(*args, **kwds):
1998 """Helper for @overload to raise when called."""
1999 raise NotImplementedError(
2000 "You should not call an overloaded function. "
2001 "A series of @overload-decorated functions "
2002 "outside a stub module should always be followed "
2003 "by an implementation that is not @overload-ed.")
2004
2005
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002006def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07002007 """Decorator for overloaded functions/methods.
2008
2009 In a stub file, place two or more stub definitions for the same
2010 function in a row, each decorated with @overload. For example:
2011
2012 @overload
2013 def utf8(value: None) -> None: ...
2014 @overload
2015 def utf8(value: bytes) -> bytes: ...
2016 @overload
2017 def utf8(value: str) -> bytes: ...
2018
2019 In a non-stub file (i.e. a regular .py file), do the same but
2020 follow it with an implementation. The implementation should *not*
2021 be decorated with @overload. For example:
2022
2023 @overload
2024 def utf8(value: None) -> None: ...
2025 @overload
2026 def utf8(value: bytes) -> bytes: ...
2027 @overload
2028 def utf8(value: str) -> bytes: ...
2029 def utf8(value):
2030 # implementation goes here
2031 """
2032 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002033
2034
Ivan Levkivskyif3672422019-05-26 09:37:07 +01002035def final(f):
2036 """A decorator to indicate final methods and final classes.
2037
2038 Use this decorator to indicate to type checkers that the decorated
2039 method cannot be overridden, and decorated class cannot be subclassed.
2040 For example:
2041
2042 class Base:
2043 @final
2044 def done(self) -> None:
2045 ...
2046 class Sub(Base):
2047 def done(self) -> None: # Error reported by type checker
2048 ...
2049
2050 @final
2051 class Leaf:
2052 ...
2053 class Other(Leaf): # Error reported by type checker
2054 ...
2055
2056 There is no runtime checking of these properties.
2057 """
2058 return f
2059
2060
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002061# Some unconstrained type variables. These are used by the container types.
2062# (These are not for export.)
2063T = TypeVar('T') # Any type.
2064KT = TypeVar('KT') # Key type.
2065VT = TypeVar('VT') # Value type.
2066T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
2067V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
2068VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
2069T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
2070# Internal type variable used for Type[].
2071CT_co = TypeVar('CT_co', covariant=True, bound=type)
2072
2073# A useful type variable with constraints. This represents string types.
2074# (This one *is* for export!)
2075AnyStr = TypeVar('AnyStr', bytes, str)
2076
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002077
2078# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03002079_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002080
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002081Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
2082Awaitable = _alias(collections.abc.Awaitable, 1)
2083Coroutine = _alias(collections.abc.Coroutine, 3)
2084AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
2085AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
2086Iterable = _alias(collections.abc.Iterable, 1)
2087Iterator = _alias(collections.abc.Iterator, 1)
2088Reversible = _alias(collections.abc.Reversible, 1)
2089Sized = _alias(collections.abc.Sized, 0) # Not generic.
2090Container = _alias(collections.abc.Container, 1)
2091Collection = _alias(collections.abc.Collection, 1)
2092Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002093Callable.__doc__ = \
2094 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002095
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002096 The subscription syntax must always be used with exactly two
2097 values: the argument list and the return type. The argument list
2098 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002099
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002100 There is no syntax to indicate optional or keyword arguments,
2101 such function types are rarely used as callback types.
2102 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002103AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
2104MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002105# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002106Mapping = _alias(collections.abc.Mapping, 2)
2107MutableMapping = _alias(collections.abc.MutableMapping, 2)
2108Sequence = _alias(collections.abc.Sequence, 1)
2109MutableSequence = _alias(collections.abc.MutableSequence, 1)
2110ByteString = _alias(collections.abc.ByteString, 0) # Not generic
2111# Tuple accepts variable number of parameters.
2112Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002113Tuple.__doc__ = \
2114 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002115
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002116 Example: Tuple[T1, T2] is a tuple of two elements corresponding
2117 to type variables T1 and T2. Tuple[int, float, str] is a tuple
2118 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002119
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002120 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
2121 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002122List = _alias(list, 1, inst=False, name='List')
2123Deque = _alias(collections.deque, 1, name='Deque')
2124Set = _alias(set, 1, inst=False, name='Set')
2125FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
2126MappingView = _alias(collections.abc.MappingView, 1)
2127KeysView = _alias(collections.abc.KeysView, 1)
2128ItemsView = _alias(collections.abc.ItemsView, 2)
2129ValuesView = _alias(collections.abc.ValuesView, 1)
2130ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
2131AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
2132Dict = _alias(dict, 2, inst=False, name='Dict')
2133DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
2134OrderedDict = _alias(collections.OrderedDict, 2)
2135Counter = _alias(collections.Counter, 1)
2136ChainMap = _alias(collections.ChainMap, 2)
2137Generator = _alias(collections.abc.Generator, 3)
2138AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
2139Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002140Type.__doc__ = \
2141 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002142
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002143 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002144
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002145 class User: ... # Abstract base for User classes
2146 class BasicUser(User): ...
2147 class ProUser(User): ...
2148 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08002149
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002150 And a function that takes a class argument that's a subclass of
2151 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08002152
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002153 U = TypeVar('U', bound=User)
2154 def new_user(user_class: Type[U]) -> U:
2155 user = user_class()
2156 # (Here we could write the user object to a database)
2157 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08002158
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002159 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08002160
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002161 At this point the type checker knows that joe has type BasicUser.
2162 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002163
2164
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002165@runtime_checkable
2166class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002167 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002168 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002169
2170 @abstractmethod
2171 def __int__(self) -> int:
2172 pass
2173
2174
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002175@runtime_checkable
2176class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002177 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002178 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002179
2180 @abstractmethod
2181 def __float__(self) -> float:
2182 pass
2183
2184
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002185@runtime_checkable
2186class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002187 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002188 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002189
2190 @abstractmethod
2191 def __complex__(self) -> complex:
2192 pass
2193
2194
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002195@runtime_checkable
2196class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002197 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002198 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002199
2200 @abstractmethod
2201 def __bytes__(self) -> bytes:
2202 pass
2203
2204
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002205@runtime_checkable
2206class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002207 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07002208 __slots__ = ()
2209
2210 @abstractmethod
2211 def __index__(self) -> int:
2212 pass
2213
2214
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002215@runtime_checkable
2216class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002217 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002218 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002219
2220 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002221 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002222 pass
2223
2224
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002225@runtime_checkable
2226class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002227 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002228 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002229
2230 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002231 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002232 pass
2233
2234
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002235def _make_nmtuple(name, types, module, defaults = ()):
2236 fields = [n for n, t in types]
2237 types = {n: _type_check(t, f"field {n} annotation must be a type")
2238 for n, t in types}
2239 nm_tpl = collections.namedtuple(name, fields,
2240 defaults=defaults, module=module)
2241 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002242 return nm_tpl
2243
2244
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002245# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002246_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
2247 '_fields', '_field_defaults',
2248 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002249
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002250_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002251
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002252
Guido van Rossum2f841442016-11-15 09:48:06 -08002253class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002254
Guido van Rossum2f841442016-11-15 09:48:06 -08002255 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002256 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08002257 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002258 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08002259 for field_name in types:
2260 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002261 default_names.append(field_name)
2262 elif default_names:
2263 raise TypeError(f"Non-default namedtuple field {field_name} "
2264 f"cannot follow default field"
2265 f"{'s' if len(default_names) > 1 else ''} "
2266 f"{', '.join(default_names)}")
2267 nm_tpl = _make_nmtuple(typename, types.items(),
2268 defaults=[ns[n] for n in default_names],
2269 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08002270 # update from user namespace without overriding special namedtuple attributes
2271 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002272 if key in _prohibited:
2273 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
2274 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08002275 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08002276 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002277
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002278
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002279def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08002280 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002281
Guido van Rossum2f841442016-11-15 09:48:06 -08002282 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002283
Guido van Rossum2f841442016-11-15 09:48:06 -08002284 class Employee(NamedTuple):
2285 name: str
2286 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002287
Guido van Rossum2f841442016-11-15 09:48:06 -08002288 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002289
Guido van Rossum2f841442016-11-15 09:48:06 -08002290 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002291
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07002292 The resulting class has an extra __annotations__ attribute, giving a
2293 dict that maps field names to types. (The field names are also in
2294 the _fields attribute, which is part of the namedtuple API.)
2295 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002296
Guido van Rossum2f841442016-11-15 09:48:06 -08002297 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002298
Guido van Rossum2f841442016-11-15 09:48:06 -08002299 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002300
Guido van Rossum2f841442016-11-15 09:48:06 -08002301 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
2302 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002303 if fields is None:
2304 fields = kwargs.items()
2305 elif kwargs:
2306 raise TypeError("Either list of fields or keywords"
2307 " can be provided to NamedTuple, not both")
2308 try:
2309 module = sys._getframe(1).f_globals.get('__name__', '__main__')
2310 except (AttributeError, ValueError):
2311 module = None
2312 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002313
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002314_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
2315
2316def _namedtuple_mro_entries(bases):
2317 if len(bases) > 1:
2318 raise TypeError("Multiple inheritance with NamedTuple is not supported")
2319 assert bases[0] is NamedTuple
2320 return (_NamedTuple,)
2321
2322NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002323
2324
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002325class _TypedDictMeta(type):
2326 def __new__(cls, name, bases, ns, total=True):
2327 """Create new typed dict class object.
2328
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002329 This method is called when TypedDict is subclassed,
2330 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002331 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002332 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002333 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002334 for base in bases:
2335 if type(base) is not _TypedDictMeta:
2336 raise TypeError('cannot inherit from both a TypedDict type '
2337 'and a non-TypedDict base class')
2338 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002339
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002340 annotations = {}
2341 own_annotations = ns.get('__annotations__', {})
2342 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002343 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002344 own_annotations = {
Miss Islington (bot)480f29f2021-07-17 01:48:17 -07002345 n: _type_check(tp, msg, module=tp_dict.__module__)
2346 for n, tp in own_annotations.items()
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002347 }
2348 required_keys = set()
2349 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002350
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002351 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002352 annotations.update(base.__dict__.get('__annotations__', {}))
2353 required_keys.update(base.__dict__.get('__required_keys__', ()))
2354 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002355
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002356 annotations.update(own_annotations)
2357 if total:
2358 required_keys.update(own_annotation_keys)
2359 else:
2360 optional_keys.update(own_annotation_keys)
2361
2362 tp_dict.__annotations__ = annotations
2363 tp_dict.__required_keys__ = frozenset(required_keys)
2364 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002365 if not hasattr(tp_dict, '__total__'):
2366 tp_dict.__total__ = total
2367 return tp_dict
2368
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002369 __call__ = dict # static method
2370
2371 def __subclasscheck__(cls, other):
2372 # Typed dicts are only for static structural subtyping.
2373 raise TypeError('TypedDict does not support instance and class checks')
2374
2375 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002376
2377
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002378def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002379 """A simple typed namespace. At runtime it is equivalent to a plain dict.
2380
2381 TypedDict creates a dictionary type that expects all of its
2382 instances to have a certain set of keys, where each key is
2383 associated with a value of a consistent type. This expectation
2384 is not checked at runtime but is only enforced by type checkers.
2385 Usage::
2386
2387 class Point2D(TypedDict):
2388 x: int
2389 y: int
2390 label: str
2391
2392 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
2393 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
2394
2395 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
2396
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002397 The type info can be accessed via the Point2D.__annotations__ dict, and
2398 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
2399 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002400
2401 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
2402 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
2403
ananthan-123ab6423f2020-02-19 10:03:05 +05302404 By default, all keys must be present in a TypedDict. It is possible
2405 to override this by specifying totality.
2406 Usage::
2407
2408 class point2D(TypedDict, total=False):
2409 x: int
2410 y: int
2411
2412 This means that a point2D TypedDict can have any of the keys omitted.A type
2413 checker is only expected to support a literal False or True as the value of
2414 the total argument. True is the default, and makes all items defined in the
2415 class body be required.
2416
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002417 The class syntax is only supported in Python 3.6+, while two other
2418 syntax forms work for Python 2.7 and 3.2+
2419 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002420 if fields is None:
2421 fields = kwargs
2422 elif kwargs:
2423 raise TypeError("TypedDict takes either a dict or keyword arguments,"
2424 " but not both")
2425
Alex Grönholm67b769f2020-12-10 23:49:05 +02002426 ns = {'__annotations__': dict(fields)}
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002427 try:
2428 # Setting correct module is necessary to make typed dict classes pickleable.
2429 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
2430 except (AttributeError, ValueError):
2431 pass
2432
Alex Grönholm67b769f2020-12-10 23:49:05 +02002433 return _TypedDictMeta(typename, (), ns, total=total)
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002434
2435_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
2436TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002437
2438
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002439class NewType:
Guido van Rossum91185fe2016-06-08 11:19:11 -07002440 """NewType creates simple unique types with almost zero
2441 runtime overhead. NewType(name, tp) is considered a subtype of tp
2442 by static type checkers. At runtime, NewType(name, tp) returns
Miss Islington (bot)3f024e22021-11-26 06:58:13 -08002443 a dummy callable that simply returns its argument. Usage::
Guido van Rossum91185fe2016-06-08 11:19:11 -07002444
2445 UserId = NewType('UserId', int)
2446
2447 def name_by_id(user_id: UserId) -> str:
2448 ...
2449
2450 UserId('user') # Fails type check
2451
2452 name_by_id(42) # Fails type check
2453 name_by_id(UserId(42)) # OK
2454
2455 num = UserId(5) + 1 # type: int
2456 """
2457
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002458 def __init__(self, name, tp):
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002459 self.__qualname__ = name
Łukasz Langa05f5d8e2021-07-24 12:07:56 +02002460 if '.' in name:
2461 name = name.rpartition('.')[-1]
2462 self.__name__ = name
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002463 self.__supertype__ = tp
Miss Islington (bot)56122b02021-07-30 06:48:01 -07002464 def_mod = _caller()
2465 if def_mod != 'typing':
2466 self.__module__ = def_mod
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002467
2468 def __repr__(self):
2469 return f'{self.__module__}.{self.__qualname__}'
2470
2471 def __call__(self, x):
Guido van Rossum91185fe2016-06-08 11:19:11 -07002472 return x
2473
Łukasz Langa05f5d8e2021-07-24 12:07:56 +02002474 def __reduce__(self):
2475 return self.__qualname__
2476
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002477 def __or__(self, other):
2478 return Union[self, other]
2479
2480 def __ror__(self, other):
2481 return Union[other, self]
Guido van Rossum91185fe2016-06-08 11:19:11 -07002482
2483
Guido van Rossum0e0563c2016-04-05 14:54:25 -07002484# Python-version-specific alias (Python 2: unicode; Python 3: str)
2485Text = str
2486
2487
Guido van Rossum91185fe2016-06-08 11:19:11 -07002488# Constant that's True when type checking, but False here.
2489TYPE_CHECKING = False
2490
2491
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002492class IO(Generic[AnyStr]):
2493 """Generic base class for TextIO and BinaryIO.
2494
2495 This is an abstract, generic version of the return of open().
2496
2497 NOTE: This does not distinguish between the different possible
2498 classes (text vs. binary, read vs. write vs. read/write,
2499 append-only, unbuffered). The TextIO and BinaryIO subclasses
2500 below capture the distinctions between text vs. binary, which is
2501 pervasive in the interface; however we currently do not offer a
2502 way to track the other distinctions in the type system.
2503 """
2504
Guido van Rossumd70fe632015-08-05 12:11:06 +02002505 __slots__ = ()
2506
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002507 @property
2508 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002509 def mode(self) -> str:
2510 pass
2511
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002512 @property
2513 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002514 def name(self) -> str:
2515 pass
2516
2517 @abstractmethod
2518 def close(self) -> None:
2519 pass
2520
Shantanu2e6569b2020-01-29 18:52:36 -08002521 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002522 @abstractmethod
2523 def closed(self) -> bool:
2524 pass
2525
2526 @abstractmethod
2527 def fileno(self) -> int:
2528 pass
2529
2530 @abstractmethod
2531 def flush(self) -> None:
2532 pass
2533
2534 @abstractmethod
2535 def isatty(self) -> bool:
2536 pass
2537
2538 @abstractmethod
2539 def read(self, n: int = -1) -> AnyStr:
2540 pass
2541
2542 @abstractmethod
2543 def readable(self) -> bool:
2544 pass
2545
2546 @abstractmethod
2547 def readline(self, limit: int = -1) -> AnyStr:
2548 pass
2549
2550 @abstractmethod
2551 def readlines(self, hint: int = -1) -> List[AnyStr]:
2552 pass
2553
2554 @abstractmethod
2555 def seek(self, offset: int, whence: int = 0) -> int:
2556 pass
2557
2558 @abstractmethod
2559 def seekable(self) -> bool:
2560 pass
2561
2562 @abstractmethod
2563 def tell(self) -> int:
2564 pass
2565
2566 @abstractmethod
2567 def truncate(self, size: int = None) -> int:
2568 pass
2569
2570 @abstractmethod
2571 def writable(self) -> bool:
2572 pass
2573
2574 @abstractmethod
2575 def write(self, s: AnyStr) -> int:
2576 pass
2577
2578 @abstractmethod
2579 def writelines(self, lines: List[AnyStr]) -> None:
2580 pass
2581
2582 @abstractmethod
2583 def __enter__(self) -> 'IO[AnyStr]':
2584 pass
2585
2586 @abstractmethod
2587 def __exit__(self, type, value, traceback) -> None:
2588 pass
2589
2590
2591class BinaryIO(IO[bytes]):
2592 """Typed version of the return of open() in binary mode."""
2593
Guido van Rossumd70fe632015-08-05 12:11:06 +02002594 __slots__ = ()
2595
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002596 @abstractmethod
2597 def write(self, s: Union[bytes, bytearray]) -> int:
2598 pass
2599
2600 @abstractmethod
2601 def __enter__(self) -> 'BinaryIO':
2602 pass
2603
2604
2605class TextIO(IO[str]):
2606 """Typed version of the return of open() in text mode."""
2607
Guido van Rossumd70fe632015-08-05 12:11:06 +02002608 __slots__ = ()
2609
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002610 @property
2611 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002612 def buffer(self) -> BinaryIO:
2613 pass
2614
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002615 @property
2616 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002617 def encoding(self) -> str:
2618 pass
2619
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002620 @property
2621 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002622 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002623 pass
2624
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002625 @property
2626 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002627 def line_buffering(self) -> bool:
2628 pass
2629
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002630 @property
2631 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002632 def newlines(self) -> Any:
2633 pass
2634
2635 @abstractmethod
2636 def __enter__(self) -> 'TextIO':
2637 pass
2638
2639
2640class io:
2641 """Wrapper namespace for IO generic classes."""
2642
2643 __all__ = ['IO', 'TextIO', 'BinaryIO']
2644 IO = IO
2645 TextIO = TextIO
2646 BinaryIO = BinaryIO
2647
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002648
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002649io.__name__ = __name__ + '.io'
2650sys.modules[io.__name__] = io
2651
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002652Pattern = _alias(stdlib_re.Pattern, 1)
2653Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002654
2655class re:
2656 """Wrapper namespace for re type aliases."""
2657
2658 __all__ = ['Pattern', 'Match']
2659 Pattern = Pattern
2660 Match = Match
2661
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002662
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002663re.__name__ = __name__ + '.re'
2664sys.modules[re.__name__] = re