blob: ae31589dc433905ccf30758bc4ad500d8390eaaf [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',
Miss Islington (bot)e1bcc882021-05-04 02:51:33 -0700102
103 # 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)480f29f2021-07-17 01:48:17 -0700137def _type_convert(arg, module=None):
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)480f29f2021-07-17 01:48:17 -0700142 return ForwardRef(arg, module=module)
kj463c7d32020-12-14 02:38:24 +0800143 return arg
144
145
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700146def _type_check(arg, msg, is_argument=True, module=None):
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)
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700159 if is_argument:
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100160 invalid_generic_forms = invalid_generic_forms + (ClassVar, Final)
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400161
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700162 arg = _type_convert(arg, module=module)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000163 if (isinstance(arg, _GenericAlias) and
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400164 arg.__origin__ in invalid_generic_forms):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000165 raise TypeError(f"{arg} is not valid as type argument")
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300166 if arg in (Any, NoReturn):
167 return arg
168 if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000169 raise TypeError(f"Plain {arg} is not valid as type argument")
kj73607be2020-12-24 12:33:48 +0800170 if isinstance(arg, (type, TypeVar, ForwardRef, types.Union, ParamSpec)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000171 return arg
172 if not callable(arg):
173 raise TypeError(f"{msg} Got {arg!r:.100}.")
174 return arg
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700175
176
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000177def _type_repr(obj):
178 """Return the repr() of an object, special-casing types (internal helper).
179
180 If obj is a type, we return a shorter version than the default
181 type.__repr__, based on the module and qualified name, which is
182 typically enough to uniquely identify a type. For everything
183 else, we fall back on repr(obj).
184 """
kj1f7dfb22020-11-02 02:13:38 +0800185 if isinstance(obj, types.GenericAlias):
186 return repr(obj)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000187 if isinstance(obj, type):
188 if obj.__module__ == 'builtins':
189 return obj.__qualname__
190 return f'{obj.__module__}.{obj.__qualname__}'
191 if obj is ...:
192 return('...')
193 if isinstance(obj, types.FunctionType):
194 return obj.__name__
195 return repr(obj)
196
197
Ken Jina2721642021-07-19 22:22:59 +0800198def _collect_type_vars(types_, typevar_types=None):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700199 """Collect all type variable contained
kj73607be2020-12-24 12:33:48 +0800200 in types in order of first appearance (lexicographic order). For example::
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000201
202 _collect_type_vars((T, List[S, T])) == (T, S)
203 """
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700204 if typevar_types is None:
205 typevar_types = TypeVar
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000206 tvars = []
Ken Jina2721642021-07-19 22:22:59 +0800207 for t in types_:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700208 if isinstance(t, typevar_types) and t not in tvars:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000209 tvars.append(t)
Ken Jina2721642021-07-19 22:22:59 +0800210 if isinstance(t, (_GenericAlias, GenericAlias, types.Union)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000211 tvars.extend([t for t in t.__parameters__ if t not in tvars])
212 return tuple(tvars)
213
214
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300215def _check_generic(cls, parameters, elen):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000216 """Check correct count for parameters of a generic cls (internal helper).
217 This gives a nice error message in case of count mismatch.
218 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300219 if not elen:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000220 raise TypeError(f"{cls} is not a generic class")
221 alen = len(parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000222 if alen != elen:
223 raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};"
224 f" actual {alen}, expected {elen}")
225
kj73607be2020-12-24 12:33:48 +0800226def _prepare_paramspec_params(cls, params):
227 """Prepares the parameters for a Generic containing ParamSpec
228 variables (internal helper).
229 """
230 # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612.
231 if len(cls.__parameters__) == 1 and len(params) > 1:
232 return (params,)
233 else:
234 _params = []
235 # Convert lists to tuples to help other libraries cache the results.
236 for p, tvar in zip(params, cls.__parameters__):
237 if isinstance(tvar, ParamSpec) and isinstance(p, list):
238 p = tuple(p)
239 _params.append(p)
240 return tuple(_params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000241
Yurii Karabasf03d3182020-11-17 04:23:19 +0200242def _deduplicate(params):
243 # Weed out strict duplicates, preserving the first of each occurrence.
244 all_params = set(params)
245 if len(all_params) < len(params):
246 new_params = []
247 for t in params:
248 if t in all_params:
249 new_params.append(t)
250 all_params.remove(t)
251 params = new_params
252 assert not all_params, all_params
253 return params
254
255
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000256def _remove_dups_flatten(parameters):
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700257 """An internal helper for Union creation and substitution: flatten Unions
258 among parameters, then remove duplicates.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000259 """
260 # Flatten out Union[Union[...], ...].
261 params = []
262 for p in parameters:
Maggie Moss1b4552c2020-09-09 13:23:24 -0700263 if isinstance(p, (_UnionGenericAlias, types.Union)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000264 params.extend(p.__args__)
265 elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
266 params.extend(p[1:])
267 else:
268 params.append(p)
Yurii Karabasf03d3182020-11-17 04:23:19 +0200269
270 return tuple(_deduplicate(params))
271
272
273def _flatten_literal_params(parameters):
274 """An internal helper for Literal creation: flatten Literals among parameters"""
275 params = []
276 for p in parameters:
277 if isinstance(p, _LiteralGenericAlias):
278 params.extend(p.__args__)
279 else:
280 params.append(p)
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700281 return tuple(params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000282
283
284_cleanups = []
285
286
Yurii Karabasf03d3182020-11-17 04:23:19 +0200287def _tp_cache(func=None, /, *, typed=False):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000288 """Internal wrapper caching __getitem__ of generic types with a fallback to
289 original function for non-hashable arguments.
290 """
Yurii Karabasf03d3182020-11-17 04:23:19 +0200291 def decorator(func):
292 cached = functools.lru_cache(typed=typed)(func)
293 _cleanups.append(cached.cache_clear)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000294
Yurii Karabasf03d3182020-11-17 04:23:19 +0200295 @functools.wraps(func)
296 def inner(*args, **kwds):
297 try:
298 return cached(*args, **kwds)
299 except TypeError:
300 pass # All real errors (not unhashable args) are raised below.
301 return func(*args, **kwds)
302 return inner
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000303
Yurii Karabasf03d3182020-11-17 04:23:19 +0200304 if func is not None:
305 return decorator(func)
306
307 return decorator
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000308
wyfo653f4202020-07-22 21:47:28 +0200309def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
Graham Bleaney84ef33c2020-09-08 18:41:10 -0400310 """Evaluate all forward references in the given type t.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000311 For use of globalns and localns see the docstring for get_type_hints().
wyfo653f4202020-07-22 21:47:28 +0200312 recursive_guard is used to prevent prevent infinite recursion
313 with recursive ForwardRef.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000314 """
315 if isinstance(t, ForwardRef):
wyfo653f4202020-07-22 21:47:28 +0200316 return t._evaluate(globalns, localns, recursive_guard)
Ken Jina2721642021-07-19 22:22:59 +0800317 if isinstance(t, (_GenericAlias, GenericAlias, types.Union)):
wyfo653f4202020-07-22 21:47:28 +0200318 ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000319 if ev_args == t.__args__:
320 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300321 if isinstance(t, GenericAlias):
322 return GenericAlias(t.__origin__, ev_args)
Ken Jina2721642021-07-19 22:22:59 +0800323 if isinstance(t, types.Union):
Miss Islington (bot)0aea99e2021-07-24 12:35:33 -0700324 return functools.reduce(operator.or_, ev_args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300325 else:
326 return t.copy_with(ev_args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000327 return t
328
329
330class _Final:
331 """Mixin to prohibit subclassing"""
Guido van Rossum4cefe742016-09-27 15:20:12 -0700332
Guido van Rossum83ec3022017-01-17 20:43:28 -0800333 __slots__ = ('__weakref__',)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700334
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300335 def __init_subclass__(self, /, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000336 if '_root' not in kwds:
337 raise TypeError("Cannot subclass special typing classes")
338
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100339class _Immutable:
340 """Mixin to indicate that object should not be copied."""
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300341 __slots__ = ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000342
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100343 def __copy__(self):
344 return self
345
346 def __deepcopy__(self, memo):
347 return self
348
349
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300350# Internal indicator of special typing constructs.
351# See __doc__ instance attribute for specific docs.
352class _SpecialForm(_Final, _root=True):
353 __slots__ = ('_name', '__doc__', '_getitem')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000354
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300355 def __init__(self, getitem):
356 self._getitem = getitem
357 self._name = getitem.__name__
358 self.__doc__ = getitem.__doc__
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000359
Miss Islington (bot)c895f2b2021-07-19 10:57:27 -0700360 def __getattr__(self, item):
361 if item in {'__name__', '__qualname__'}:
362 return self._name
363
364 raise AttributeError(item)
365
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300366 def __mro_entries__(self, bases):
367 raise TypeError(f"Cannot subclass {self!r}")
Guido van Rossum4cefe742016-09-27 15:20:12 -0700368
369 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000370 return 'typing.' + self._name
371
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100372 def __reduce__(self):
373 return self._name
Guido van Rossum4cefe742016-09-27 15:20:12 -0700374
375 def __call__(self, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000376 raise TypeError(f"Cannot instantiate {self!r}")
377
Ken Jinca5a4cf2021-07-24 22:49:25 +0800378 def __or__(self, other):
379 return Union[self, other]
380
381 def __ror__(self, other):
382 return Union[other, self]
383
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000384 def __instancecheck__(self, obj):
385 raise TypeError(f"{self} cannot be used with isinstance()")
386
387 def __subclasscheck__(self, cls):
388 raise TypeError(f"{self} cannot be used with issubclass()")
389
390 @_tp_cache
391 def __getitem__(self, parameters):
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300392 return self._getitem(self, parameters)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700393
Yurii Karabasf03d3182020-11-17 04:23:19 +0200394
395class _LiteralSpecialForm(_SpecialForm, _root=True):
396 @_tp_cache(typed=True)
397 def __getitem__(self, parameters):
398 return self._getitem(self, parameters)
399
400
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300401@_SpecialForm
402def Any(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000403 """Special type indicating an unconstrained type.
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700404
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000405 - Any is compatible with every type.
406 - Any assumed to have all methods.
407 - All values assumed to be instances of Any.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700408
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000409 Note that all the above statements are true from the point of view of
410 static type checkers. At runtime, Any should not be used with instance
411 or class checks.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300412 """
413 raise TypeError(f"{self} is not subscriptable")
Guido van Rossumd70fe632015-08-05 12:11:06 +0200414
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300415@_SpecialForm
416def NoReturn(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000417 """Special type indicating functions that never return.
418 Example::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700419
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000420 from typing import NoReturn
421
422 def stop() -> NoReturn:
423 raise Exception('no way')
424
425 This type is invalid in other positions, e.g., ``List[NoReturn]``
426 will fail in static type checkers.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300427 """
428 raise TypeError(f"{self} is not subscriptable")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000429
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300430@_SpecialForm
431def ClassVar(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000432 """Special type construct to mark class variables.
433
434 An annotation wrapped in ClassVar indicates that a given
435 attribute is intended to be used as a class variable and
436 should not be set on instances of that class. Usage::
437
438 class Starship:
439 stats: ClassVar[Dict[str, int]] = {} # class variable
440 damage: int = 10 # instance variable
441
442 ClassVar accepts only types and cannot be further subscribed.
443
444 Note that ClassVar is not a class itself, and should not
445 be used with isinstance() or issubclass().
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300446 """
447 item = _type_check(parameters, f'{self} accepts only single type.')
448 return _GenericAlias(self, (item,))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000449
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300450@_SpecialForm
451def Final(self, parameters):
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100452 """Special typing construct to indicate final names to type checkers.
453
454 A final name cannot be re-assigned or overridden in a subclass.
455 For example:
456
457 MAX_SIZE: Final = 9000
458 MAX_SIZE += 1 # Error reported by type checker
459
460 class Connection:
461 TIMEOUT: Final[int] = 10
462
463 class FastConnector(Connection):
464 TIMEOUT = 1 # Error reported by type checker
465
466 There is no runtime checking of these properties.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300467 """
468 item = _type_check(parameters, f'{self} accepts only single type.')
469 return _GenericAlias(self, (item,))
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100470
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300471@_SpecialForm
472def Union(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000473 """Union type; Union[X, Y] means either X or Y.
474
475 To define a union, use e.g. Union[int, str]. Details:
476 - The arguments must be types and there must be at least one.
477 - None as an argument is a special case and is replaced by
478 type(None).
479 - Unions of unions are flattened, e.g.::
480
481 Union[Union[int, str], float] == Union[int, str, float]
482
483 - Unions of a single argument vanish, e.g.::
484
485 Union[int] == int # The constructor actually returns int
486
487 - Redundant arguments are skipped, e.g.::
488
489 Union[int, str, int] == Union[int, str]
490
491 - When comparing unions, the argument order is ignored, e.g.::
492
493 Union[int, str] == Union[str, int]
494
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000495 - You cannot subclass or instantiate a union.
496 - You can use Optional[X] as a shorthand for Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300497 """
498 if parameters == ():
499 raise TypeError("Cannot take a Union of no types.")
500 if not isinstance(parameters, tuple):
501 parameters = (parameters,)
502 msg = "Union[arg, ...]: each arg must be a type."
503 parameters = tuple(_type_check(p, msg) for p in parameters)
504 parameters = _remove_dups_flatten(parameters)
505 if len(parameters) == 1:
506 return parameters[0]
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300507 return _UnionGenericAlias(self, parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000508
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300509@_SpecialForm
510def Optional(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000511 """Optional type.
512
513 Optional[X] is equivalent to Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300514 """
515 arg = _type_check(parameters, f"{self} requires a single type.")
516 return Union[arg, type(None)]
Guido van Rossumb7dedc82016-10-29 12:44:29 -0700517
Yurii Karabasf03d3182020-11-17 04:23:19 +0200518@_LiteralSpecialForm
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300519def Literal(self, parameters):
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100520 """Special typing form to define literal types (a.k.a. value types).
521
522 This form can be used to indicate to type checkers that the corresponding
523 variable or function parameter has a value equivalent to the provided
524 literal (or one of several literals):
525
526 def validate_simple(data: Any) -> Literal[True]: # always returns True
527 ...
528
529 MODE = Literal['r', 'rb', 'w', 'wb']
530 def open_helper(file: str, mode: MODE) -> str:
531 ...
532
533 open_helper('/some/path', 'r') # Passes type check
534 open_helper('/other/path', 'typo') # Error in type checker
535
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300536 Literal[...] cannot be subclassed. At runtime, an arbitrary value
537 is allowed as type argument to Literal[...], but type checkers may
538 impose restrictions.
539 """
540 # There is no '_type_check' call because arguments to Literal[...] are
541 # values, not types.
Yurii Karabasf03d3182020-11-17 04:23:19 +0200542 if not isinstance(parameters, tuple):
543 parameters = (parameters,)
544
545 parameters = _flatten_literal_params(parameters)
546
547 try:
548 parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
549 except TypeError: # unhashable parameters
550 pass
551
552 return _LiteralGenericAlias(self, parameters)
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100553
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700554
Mikhail Golubev4f3c2502020-10-08 00:44:31 +0300555@_SpecialForm
556def TypeAlias(self, parameters):
557 """Special marker indicating that an assignment should
558 be recognized as a proper type alias definition by type
559 checkers.
560
561 For example::
562
563 Predicate: TypeAlias = Callable[..., bool]
564
565 It's invalid when used anywhere except as in the example above.
566 """
567 raise TypeError(f"{self} is not subscriptable")
568
569
kj73607be2020-12-24 12:33:48 +0800570@_SpecialForm
571def Concatenate(self, parameters):
Ken Jin11276cd2021-01-02 08:45:50 +0800572 """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a
573 higher order function which adds, removes or transforms parameters of a
574 callable.
kj73607be2020-12-24 12:33:48 +0800575
576 For example::
577
578 Callable[Concatenate[int, P], int]
579
580 See PEP 612 for detailed information.
581 """
582 if parameters == ():
583 raise TypeError("Cannot take a Concatenate of no types.")
584 if not isinstance(parameters, tuple):
585 parameters = (parameters,)
586 if not isinstance(parameters[-1], ParamSpec):
587 raise TypeError("The last parameter to Concatenate should be a "
588 "ParamSpec variable.")
589 msg = "Concatenate[arg, ...]: each arg must be a type."
590 parameters = tuple(_type_check(p, msg) for p in parameters)
591 return _ConcatenateGenericAlias(self, parameters)
592
593
Ken Jin05ab4b62021-04-27 22:31:04 +0800594@_SpecialForm
595def TypeGuard(self, parameters):
596 """Special typing form used to annotate the return type of a user-defined
597 type guard function. ``TypeGuard`` only accepts a single type argument.
598 At runtime, functions marked this way should return a boolean.
599
600 ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static
601 type checkers to determine a more precise type of an expression within a
602 program's code flow. Usually type narrowing is done by analyzing
603 conditional code flow and applying the narrowing to a block of code. The
604 conditional expression here is sometimes referred to as a "type guard".
605
606 Sometimes it would be convenient to use a user-defined boolean function
607 as a type guard. Such a function should use ``TypeGuard[...]`` as its
608 return type to alert static type checkers to this intention.
609
610 Using ``-> TypeGuard`` tells the static type checker that for a given
611 function:
612
613 1. The return value is a boolean.
614 2. If the return value is ``True``, the type of its argument
615 is the type inside ``TypeGuard``.
616
617 For example::
618
619 def is_str(val: Union[str, float]):
620 # "isinstance" type guard
621 if isinstance(val, str):
622 # Type of ``val`` is narrowed to ``str``
623 ...
624 else:
625 # Else, type of ``val`` is narrowed to ``float``.
626 ...
627
628 Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower
629 form of ``TypeA`` (it can even be a wider form) and this may lead to
630 type-unsafe results. The main reason is to allow for things like
631 narrowing ``List[object]`` to ``List[str]`` even though the latter is not
632 a subtype of the former, since ``List`` is invariant. The responsibility of
633 writing type-safe type guards is left to the user.
634
635 ``TypeGuard`` also works with type variables. For more information, see
636 PEP 647 (User-Defined Type Guards).
637 """
638 item = _type_check(parameters, f'{self} accepts only single type.')
639 return _GenericAlias(self, (item,))
640
641
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000642class ForwardRef(_Final, _root=True):
Guido van Rossumb24569a2016-11-20 18:01:29 -0800643 """Internal wrapper to hold a forward reference."""
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700644
Guido van Rossum4cefe742016-09-27 15:20:12 -0700645 __slots__ = ('__forward_arg__', '__forward_code__',
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400646 '__forward_evaluated__', '__forward_value__',
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700647 '__forward_is_argument__', '__forward_module__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700648
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700649 def __init__(self, arg, is_argument=True, module=None):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700650 if not isinstance(arg, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000651 raise TypeError(f"Forward reference must be a string -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700652 try:
653 code = compile(arg, '<string>', 'eval')
654 except SyntaxError:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000655 raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700656 self.__forward_arg__ = arg
657 self.__forward_code__ = code
658 self.__forward_evaluated__ = False
659 self.__forward_value__ = None
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400660 self.__forward_is_argument__ = is_argument
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700661 self.__forward_module__ = module
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700662
wyfo653f4202020-07-22 21:47:28 +0200663 def _evaluate(self, globalns, localns, recursive_guard):
664 if self.__forward_arg__ in recursive_guard:
665 return self
Guido van Rossumdad17902016-11-10 08:29:18 -0800666 if not self.__forward_evaluated__ or localns is not globalns:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700667 if globalns is None and localns is None:
668 globalns = localns = {}
669 elif globalns is None:
670 globalns = localns
671 elif localns is None:
672 localns = globalns
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700673 if self.__forward_module__ is not None:
674 globalns = getattr(
675 sys.modules.get(self.__forward_module__, None), '__dict__', globalns
676 )
wyfo653f4202020-07-22 21:47:28 +0200677 type_ =_type_check(
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700678 eval(self.__forward_code__, globalns, localns),
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400679 "Forward references must evaluate to types.",
wyfo653f4202020-07-22 21:47:28 +0200680 is_argument=self.__forward_is_argument__,
681 )
682 self.__forward_value__ = _eval_type(
683 type_, globalns, localns, recursive_guard | {self.__forward_arg__}
684 )
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700685 self.__forward_evaluated__ = True
686 return self.__forward_value__
687
Guido van Rossum4cefe742016-09-27 15:20:12 -0700688 def __eq__(self, other):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000689 if not isinstance(other, ForwardRef):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700690 return NotImplemented
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100691 if self.__forward_evaluated__ and other.__forward_evaluated__:
692 return (self.__forward_arg__ == other.__forward_arg__ and
693 self.__forward_value__ == other.__forward_value__)
694 return self.__forward_arg__ == other.__forward_arg__
Guido van Rossum4cefe742016-09-27 15:20:12 -0700695
696 def __hash__(self):
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100697 return hash(self.__forward_arg__)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700698
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700699 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000700 return f'ForwardRef({self.__forward_arg__!r})'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700701
kj73607be2020-12-24 12:33:48 +0800702class _TypeVarLike:
703 """Mixin for TypeVar-like types (TypeVar and ParamSpec)."""
704 def __init__(self, bound, covariant, contravariant):
705 """Used to setup TypeVars and ParamSpec's bound, covariant and
706 contravariant attributes.
707 """
708 if covariant and contravariant:
709 raise ValueError("Bivariant types are not supported.")
710 self.__covariant__ = bool(covariant)
711 self.__contravariant__ = bool(contravariant)
712 if bound:
713 self.__bound__ = _type_check(bound, "Bound must be a type.")
714 else:
715 self.__bound__ = None
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700716
kj73607be2020-12-24 12:33:48 +0800717 def __or__(self, right):
718 return Union[self, right]
719
Jelle Zijlstra90459192021-04-10 20:00:05 -0700720 def __ror__(self, left):
721 return Union[left, self]
kj73607be2020-12-24 12:33:48 +0800722
723 def __repr__(self):
724 if self.__covariant__:
725 prefix = '+'
726 elif self.__contravariant__:
727 prefix = '-'
728 else:
729 prefix = '~'
730 return prefix + self.__name__
731
732 def __reduce__(self):
733 return self.__name__
734
735
736class TypeVar( _Final, _Immutable, _TypeVarLike, _root=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700737 """Type variable.
738
739 Usage::
740
741 T = TypeVar('T') # Can be anything
742 A = TypeVar('A', str, bytes) # Must be str or bytes
743
744 Type variables exist primarily for the benefit of static type
745 checkers. They serve as the parameters for generic types as well
746 as for generic function definitions. See class Generic for more
747 information on generic types. Generic functions work as follows:
748
Guido van Rossumb24569a2016-11-20 18:01:29 -0800749 def repeat(x: T, n: int) -> List[T]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700750 '''Return a list containing n references to x.'''
751 return [x]*n
752
753 def longest(x: A, y: A) -> A:
754 '''Return the longest of two strings.'''
755 return x if len(x) >= len(y) else y
756
757 The latter example's signature is essentially the overloading
758 of (str, str) -> str and (bytes, bytes) -> bytes. Also note
759 that if the arguments are instances of some subclass of str,
760 the return type is still plain str.
761
Guido van Rossumb24569a2016-11-20 18:01:29 -0800762 At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700763
Guido van Rossumefa798d2016-08-23 11:01:50 -0700764 Type variables defined with covariant=True or contravariant=True
João D. Ferreira86bfed32018-07-07 16:41:20 +0100765 can be used to declare covariant or contravariant generic types.
Guido van Rossumefa798d2016-08-23 11:01:50 -0700766 See PEP 484 for more details. By default generic types are invariant
767 in all type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700768
769 Type variables can be introspected. e.g.:
770
771 T.__name__ == 'T'
772 T.__constraints__ == ()
773 T.__covariant__ == False
774 T.__contravariant__ = False
775 A.__constraints__ == (str, bytes)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100776
777 Note that only type variables defined in global scope can be pickled.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700778 """
779
Guido van Rossum4cefe742016-09-27 15:20:12 -0700780 __slots__ = ('__name__', '__bound__', '__constraints__',
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300781 '__covariant__', '__contravariant__', '__dict__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700782
783 def __init__(self, name, *constraints, bound=None,
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800784 covariant=False, contravariant=False):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700785 self.__name__ = name
kj73607be2020-12-24 12:33:48 +0800786 super().__init__(bound, covariant, contravariant)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700787 if constraints and bound is not None:
788 raise TypeError("Constraints cannot be combined with bound=...")
789 if constraints and len(constraints) == 1:
790 raise TypeError("A single constraint is not allowed")
791 msg = "TypeVar(name, constraint, ...): constraints must be types."
792 self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
HongWeipenga25a04f2020-04-21 04:01:53 +0800793 try:
794 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling
795 except (AttributeError, ValueError):
796 def_mod = None
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300797 if def_mod != 'typing':
798 self.__module__ = def_mod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700799
Maggie Moss1b4552c2020-09-09 13:23:24 -0700800
Jelle Zijlstra52243362021-04-10 19:57:05 -0700801class ParamSpecArgs(_Final, _Immutable, _root=True):
802 """The args for a ParamSpec object.
803
804 Given a ParamSpec object P, P.args is an instance of ParamSpecArgs.
805
806 ParamSpecArgs objects have a reference back to their ParamSpec:
807
808 P.args.__origin__ is P
809
810 This type is meant for runtime introspection and has no special meaning to
811 static type checkers.
812 """
813 def __init__(self, origin):
814 self.__origin__ = origin
815
816 def __repr__(self):
817 return f"{self.__origin__.__name__}.args"
818
819
820class ParamSpecKwargs(_Final, _Immutable, _root=True):
821 """The kwargs for a ParamSpec object.
822
823 Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs.
824
825 ParamSpecKwargs objects have a reference back to their ParamSpec:
826
827 P.kwargs.__origin__ is P
828
829 This type is meant for runtime introspection and has no special meaning to
830 static type checkers.
831 """
832 def __init__(self, origin):
833 self.__origin__ = origin
834
835 def __repr__(self):
836 return f"{self.__origin__.__name__}.kwargs"
837
838
kj73607be2020-12-24 12:33:48 +0800839class ParamSpec(_Final, _Immutable, _TypeVarLike, _root=True):
840 """Parameter specification variable.
Maggie Moss1b4552c2020-09-09 13:23:24 -0700841
kj73607be2020-12-24 12:33:48 +0800842 Usage::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700843
kj73607be2020-12-24 12:33:48 +0800844 P = ParamSpec('P')
845
846 Parameter specification variables exist primarily for the benefit of static
847 type checkers. They are used to forward the parameter types of one
Ken Jin11276cd2021-01-02 08:45:50 +0800848 callable to another callable, a pattern commonly found in higher order
849 functions and decorators. They are only valid when used in ``Concatenate``,
850 or s the first argument to ``Callable``, or as parameters for user-defined
851 Generics. See class Generic for more information on generic types. An
852 example for annotating a decorator::
kj73607be2020-12-24 12:33:48 +0800853
854 T = TypeVar('T')
855 P = ParamSpec('P')
856
857 def add_logging(f: Callable[P, T]) -> Callable[P, T]:
858 '''A type-safe decorator to add logging to a function.'''
859 def inner(*args: P.args, **kwargs: P.kwargs) -> T:
860 logging.info(f'{f.__name__} was called')
861 return f(*args, **kwargs)
862 return inner
863
864 @add_logging
865 def add_two(x: float, y: float) -> float:
866 '''Add two numbers together.'''
867 return x + y
868
869 Parameter specification variables defined with covariant=True or
870 contravariant=True can be used to declare covariant or contravariant
871 generic types. These keyword arguments are valid, but their actual semantics
872 are yet to be decided. See PEP 612 for details.
873
874 Parameter specification variables can be introspected. e.g.:
875
876 P.__name__ == 'T'
877 P.__bound__ == None
878 P.__covariant__ == False
879 P.__contravariant__ == False
880
881 Note that only parameter specification variables defined in global scope can
882 be pickled.
883 """
884
885 __slots__ = ('__name__', '__bound__', '__covariant__', '__contravariant__',
886 '__dict__')
887
Jelle Zijlstra52243362021-04-10 19:57:05 -0700888 @property
889 def args(self):
890 return ParamSpecArgs(self)
891
892 @property
893 def kwargs(self):
894 return ParamSpecKwargs(self)
kj73607be2020-12-24 12:33:48 +0800895
Ken Jinace008c2021-01-11 08:11:41 +0800896 def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
kj73607be2020-12-24 12:33:48 +0800897 self.__name__ = name
898 super().__init__(bound, covariant, contravariant)
899 try:
900 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
901 except (AttributeError, ValueError):
902 def_mod = None
903 if def_mod != 'typing':
904 self.__module__ = def_mod
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100905
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700906
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000907def _is_dunder(attr):
908 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800909
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300910class _BaseGenericAlias(_Final, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000911 """The central part of internal API.
912
913 This represents a generic version of type 'origin' with type arguments 'params'.
914 There are two kind of these aliases: user defined and special. The special ones
915 are wrappers around builtin collections and ABCs in collections.abc. These must
916 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
917 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700918 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300919 def __init__(self, origin, *, inst=True, name=None):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000920 self._inst = inst
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000921 self._name = name
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700922 self.__origin__ = origin
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000923 self.__slots__ = None # This is not documented.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300924
925 def __call__(self, *args, **kwargs):
926 if not self._inst:
927 raise TypeError(f"Type {self._name} cannot be instantiated; "
928 f"use {self.__origin__.__name__}() instead")
929 result = self.__origin__(*args, **kwargs)
930 try:
931 result.__orig_class__ = self
932 except AttributeError:
933 pass
934 return result
935
936 def __mro_entries__(self, bases):
937 res = []
938 if self.__origin__ not in bases:
939 res.append(self.__origin__)
940 i = bases.index(self)
941 for b in bases[i+1:]:
942 if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
943 break
944 else:
945 res.append(Generic)
946 return tuple(res)
947
948 def __getattr__(self, attr):
Miss Islington (bot)c895f2b2021-07-19 10:57:27 -0700949 if attr in {'__name__', '__qualname__'}:
950 return self._name
951
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300952 # We are careful for copy and pickle.
953 # Also for simplicity we just don't relay all dunder names
954 if '__origin__' in self.__dict__ and not _is_dunder(attr):
955 return getattr(self.__origin__, attr)
956 raise AttributeError(attr)
957
958 def __setattr__(self, attr, val):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700959 if _is_dunder(attr) or attr in {'_name', '_inst', '_nparams',
960 '_typevar_types', '_paramspec_tvars'}:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300961 super().__setattr__(attr, val)
962 else:
963 setattr(self.__origin__, attr, val)
964
965 def __instancecheck__(self, obj):
966 return self.__subclasscheck__(type(obj))
967
968 def __subclasscheck__(self, cls):
969 raise TypeError("Subscripted generics cannot be used with"
970 " class and instance checks")
971
972
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300973# Special typing constructs Union, Optional, Generic, Callable and Tuple
974# use three special attributes for internal bookkeeping of generic types:
975# * __parameters__ is a tuple of unique free type parameters of a generic
976# type, for example, Dict[T, T].__parameters__ == (T,);
977# * __origin__ keeps a reference to a type that was subscripted,
978# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
979# the type.
980# * __args__ is a tuple of all arguments used in subscripting,
981# e.g., Dict[T, int].__args__ == (T, int).
982
983
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300984class _GenericAlias(_BaseGenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700985 def __init__(self, origin, params, *, inst=True, name=None,
986 _typevar_types=TypeVar,
987 _paramspec_tvars=False):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300988 super().__init__(origin, inst=inst, name=name)
989 if not isinstance(params, tuple):
990 params = (params,)
991 self.__args__ = tuple(... if a is _TypingEllipsis else
992 () if a is _TypingEmpty else
993 a for a in params)
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700994 self.__parameters__ = _collect_type_vars(params, typevar_types=_typevar_types)
995 self._typevar_types = _typevar_types
996 self._paramspec_tvars = _paramspec_tvars
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300997 if not name:
998 self.__module__ = origin.__module__
999
1000 def __eq__(self, other):
1001 if not isinstance(other, _GenericAlias):
1002 return NotImplemented
1003 return (self.__origin__ == other.__origin__
1004 and self.__args__ == other.__args__)
1005
1006 def __hash__(self):
1007 return hash((self.__origin__, self.__args__))
1008
Maggie Moss1b4552c2020-09-09 13:23:24 -07001009 def __or__(self, right):
1010 return Union[self, right]
1011
Serhiy Storchaka80844d12021-07-16 16:42:04 +03001012 def __ror__(self, left):
1013 return Union[left, self]
Maggie Moss1b4552c2020-09-09 13:23:24 -07001014
Guido van Rossum4cefe742016-09-27 15:20:12 -07001015 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001016 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001017 if self.__origin__ in (Generic, Protocol):
1018 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001019 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001020 if not isinstance(params, tuple):
1021 params = (params,)
kj73607be2020-12-24 12:33:48 +08001022 params = tuple(_type_convert(p) for p in params)
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001023 if self._paramspec_tvars:
1024 if any(isinstance(t, ParamSpec) for t in self.__parameters__):
1025 params = _prepare_paramspec_params(self, params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001026 _check_generic(self, params, len(self.__parameters__))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001027
1028 subst = dict(zip(self.__parameters__, params))
1029 new_args = []
1030 for arg in self.__args__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001031 if isinstance(arg, self._typevar_types):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001032 arg = subst[arg]
Ken Jina2721642021-07-19 22:22:59 +08001033 elif isinstance(arg, (_GenericAlias, GenericAlias, types.Union)):
Serhiy Storchaka0122d482020-05-10 13:39:40 +03001034 subparams = arg.__parameters__
1035 if subparams:
1036 subargs = tuple(subst[x] for x in subparams)
1037 arg = arg[subargs]
kj73607be2020-12-24 12:33:48 +08001038 # Required to flatten out the args for CallableGenericAlias
1039 if self.__origin__ == collections.abc.Callable and isinstance(arg, tuple):
1040 new_args.extend(arg)
1041 else:
1042 new_args.append(arg)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001043 return self.copy_with(tuple(new_args))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001044
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001045 def copy_with(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001046 return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001047
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001048 def __repr__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001049 if self._name:
1050 name = 'typing.' + self._name
1051 else:
1052 name = _type_repr(self.__origin__)
1053 args = ", ".join([_type_repr(a) for a in self.__args__])
1054 return f'{name}[{args}]'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001055
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001056 def __reduce__(self):
1057 if self._name:
1058 origin = globals()[self._name]
1059 else:
1060 origin = self.__origin__
1061 args = tuple(self.__args__)
1062 if len(args) == 1 and not isinstance(args[0], tuple):
1063 args, = args
1064 return operator.getitem, (origin, args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001065
1066 def __mro_entries__(self, bases):
1067 if self._name: # generic version of an ABC or built-in class
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001068 return super().__mro_entries__(bases)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001069 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001070 if Protocol in bases:
1071 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001072 i = bases.index(self)
1073 for b in bases[i+1:]:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001074 if isinstance(b, _BaseGenericAlias) and b is not self:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001075 return ()
1076 return (self.__origin__,)
1077
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001078
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001079# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
1080# 1 for List and 2 for Dict. It may be -1 if variable number of
1081# parameters are accepted (needs custom __getitem__).
1082
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001083class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001084 def __init__(self, origin, nparams, *, inst=True, name=None):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001085 if name is None:
1086 name = origin.__name__
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001087 super().__init__(origin, inst=inst, name=name)
1088 self._nparams = nparams
Serhiy Storchaka2fbc57a2020-05-10 15:14:27 +03001089 if origin.__module__ == 'builtins':
1090 self.__doc__ = f'A generic version of {origin.__qualname__}.'
1091 else:
1092 self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001093
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001094 @_tp_cache
1095 def __getitem__(self, params):
1096 if not isinstance(params, tuple):
1097 params = (params,)
1098 msg = "Parameters to generic types must be types."
1099 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001100 _check_generic(self, params, self._nparams)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001101 return self.copy_with(params)
1102
1103 def copy_with(self, params):
1104 return _GenericAlias(self.__origin__, params,
1105 name=self._name, inst=self._inst)
1106
1107 def __repr__(self):
1108 return 'typing.' + self._name
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001109
1110 def __subclasscheck__(self, cls):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001111 if isinstance(cls, _SpecialGenericAlias):
1112 return issubclass(cls.__origin__, self.__origin__)
1113 if not isinstance(cls, _GenericAlias):
1114 return issubclass(cls, self.__origin__)
1115 return super().__subclasscheck__(cls)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001116
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001117 def __reduce__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001118 return self._name
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001119
Maggie Moss1b4552c2020-09-09 13:23:24 -07001120 def __or__(self, right):
1121 return Union[self, right]
1122
Serhiy Storchaka80844d12021-07-16 16:42:04 +03001123 def __ror__(self, left):
1124 return Union[left, self]
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001125
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001126class _CallableGenericAlias(_GenericAlias, _root=True):
1127 def __repr__(self):
1128 assert self._name == 'Callable'
kj73607be2020-12-24 12:33:48 +08001129 args = self.__args__
1130 if len(args) == 2 and (args[0] is Ellipsis
1131 or isinstance(args[0], (ParamSpec, _ConcatenateGenericAlias))):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001132 return super().__repr__()
1133 return (f'typing.Callable'
kj73607be2020-12-24 12:33:48 +08001134 f'[[{", ".join([_type_repr(a) for a in args[:-1]])}], '
1135 f'{_type_repr(args[-1])}]')
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001136
1137 def __reduce__(self):
1138 args = self.__args__
kj73607be2020-12-24 12:33:48 +08001139 if not (len(args) == 2 and (args[0] is Ellipsis
1140 or isinstance(args[0], (ParamSpec, _ConcatenateGenericAlias)))):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001141 args = list(args[:-1]), args[-1]
1142 return operator.getitem, (Callable, args)
1143
1144
1145class _CallableType(_SpecialGenericAlias, _root=True):
1146 def copy_with(self, params):
1147 return _CallableGenericAlias(self.__origin__, params,
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001148 name=self._name, inst=self._inst,
1149 _typevar_types=(TypeVar, ParamSpec),
1150 _paramspec_tvars=True)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001151
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001152 def __getitem__(self, params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001153 if not isinstance(params, tuple) or len(params) != 2:
1154 raise TypeError("Callable must be used as "
1155 "Callable[[arg, ...], result].")
1156 args, result = params
kj463c7d32020-12-14 02:38:24 +08001157 # This relaxes what args can be on purpose to allow things like
1158 # PEP 612 ParamSpec. Responsibility for whether a user is using
1159 # Callable[...] properly is deferred to static type checkers.
1160 if isinstance(args, list):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001161 params = (tuple(args), result)
kj463c7d32020-12-14 02:38:24 +08001162 else:
1163 params = (args, result)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001164 return self.__getitem_inner__(params)
1165
1166 @_tp_cache
1167 def __getitem_inner__(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001168 args, result = params
1169 msg = "Callable[args, result]: result must be a type."
1170 result = _type_check(result, msg)
1171 if args is Ellipsis:
1172 return self.copy_with((_TypingEllipsis, result))
kj463c7d32020-12-14 02:38:24 +08001173 if not isinstance(args, tuple):
1174 args = (args,)
1175 args = tuple(_type_convert(arg) for arg in args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001176 params = args + (result,)
1177 return self.copy_with(params)
1178
1179
1180class _TupleType(_SpecialGenericAlias, _root=True):
1181 @_tp_cache
1182 def __getitem__(self, params):
1183 if params == ():
1184 return self.copy_with((_TypingEmpty,))
1185 if not isinstance(params, tuple):
1186 params = (params,)
1187 if len(params) == 2 and params[1] is ...:
1188 msg = "Tuple[t, ...]: t must be a type."
1189 p = _type_check(params[0], msg)
1190 return self.copy_with((p, _TypingEllipsis))
1191 msg = "Tuple[t0, t1, ...]: each t must be a type."
1192 params = tuple(_type_check(p, msg) for p in params)
1193 return self.copy_with(params)
1194
1195
1196class _UnionGenericAlias(_GenericAlias, _root=True):
1197 def copy_with(self, params):
1198 return Union[params]
1199
1200 def __eq__(self, other):
Miss Islington (bot)03aad302021-07-17 14:10:21 -07001201 if not isinstance(other, (_UnionGenericAlias, types.Union)):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001202 return NotImplemented
1203 return set(self.__args__) == set(other.__args__)
1204
1205 def __hash__(self):
1206 return hash(frozenset(self.__args__))
1207
1208 def __repr__(self):
1209 args = self.__args__
1210 if len(args) == 2:
1211 if args[0] is type(None):
1212 return f'typing.Optional[{_type_repr(args[1])}]'
1213 elif args[1] is type(None):
1214 return f'typing.Optional[{_type_repr(args[0])}]'
1215 return super().__repr__()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001216
Maggie Moss1b4552c2020-09-09 13:23:24 -07001217 def __instancecheck__(self, obj):
1218 return self.__subclasscheck__(type(obj))
1219
1220 def __subclasscheck__(self, cls):
1221 for arg in self.__args__:
1222 if issubclass(cls, arg):
1223 return True
1224
1225
Yurii Karabasf03d3182020-11-17 04:23:19 +02001226def _value_and_type_iter(parameters):
1227 return ((p, type(p)) for p in parameters)
1228
1229
1230class _LiteralGenericAlias(_GenericAlias, _root=True):
1231
1232 def __eq__(self, other):
1233 if not isinstance(other, _LiteralGenericAlias):
1234 return NotImplemented
1235
1236 return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__))
1237
1238 def __hash__(self):
Yurii Karabas1b540772020-11-19 18:17:38 +02001239 return hash(frozenset(_value_and_type_iter(self.__args__)))
Yurii Karabasf03d3182020-11-17 04:23:19 +02001240
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001241
kj73607be2020-12-24 12:33:48 +08001242class _ConcatenateGenericAlias(_GenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001243 def __init__(self, *args, **kwargs):
1244 super().__init__(*args, **kwargs,
1245 _typevar_types=(TypeVar, ParamSpec),
1246 _paramspec_tvars=True)
kj73607be2020-12-24 12:33:48 +08001247
1248
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001249class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001250 """Abstract base class for generic types.
1251
Guido van Rossumb24569a2016-11-20 18:01:29 -08001252 A generic type is typically declared by inheriting from
1253 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001254 For example, a generic mapping type might be defined as::
1255
1256 class Mapping(Generic[KT, VT]):
1257 def __getitem__(self, key: KT) -> VT:
1258 ...
1259 # Etc.
1260
1261 This class can then be used as follows::
1262
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001263 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001264 try:
1265 return mapping[key]
1266 except KeyError:
1267 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001268 """
Guido van Rossumd70fe632015-08-05 12:11:06 +02001269 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001270 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +02001271
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001272 @_tp_cache
1273 def __class_getitem__(cls, params):
1274 if not isinstance(params, tuple):
1275 params = (params,)
1276 if not params and cls is not Tuple:
1277 raise TypeError(
1278 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
kj73607be2020-12-24 12:33:48 +08001279 params = tuple(_type_convert(p) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001280 if cls in (Generic, Protocol):
1281 # Generic and Protocol can only be subscripted with unique type variables.
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001282 if not all(isinstance(p, (TypeVar, ParamSpec)) for p in params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001283 raise TypeError(
kj73607be2020-12-24 12:33:48 +08001284 f"Parameters to {cls.__name__}[...] must all be type variables "
1285 f"or parameter specification variables.")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001286 if len(set(params)) != len(params):
1287 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001288 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001289 else:
1290 # Subscripting a regular Generic subclass.
kj73607be2020-12-24 12:33:48 +08001291 if any(isinstance(t, ParamSpec) for t in cls.__parameters__):
1292 params = _prepare_paramspec_params(cls, params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001293 _check_generic(cls, params, len(cls.__parameters__))
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001294 return _GenericAlias(cls, params,
1295 _typevar_types=(TypeVar, ParamSpec),
1296 _paramspec_tvars=True)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001297
1298 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +01001299 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001300 tvars = []
1301 if '__orig_bases__' in cls.__dict__:
1302 error = Generic in cls.__orig_bases__
1303 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001304 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001305 if error:
1306 raise TypeError("Cannot inherit from plain Generic")
1307 if '__orig_bases__' in cls.__dict__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001308 tvars = _collect_type_vars(cls.__orig_bases__, (TypeVar, ParamSpec))
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001309 # Look for Generic[T1, ..., Tn].
1310 # If found, tvars must be a subset of it.
1311 # If not found, tvars is it.
1312 # Also check for and reject plain Generic,
1313 # and reject multiple Generic[...].
1314 gvars = None
1315 for base in cls.__orig_bases__:
1316 if (isinstance(base, _GenericAlias) and
1317 base.__origin__ is Generic):
1318 if gvars is not None:
1319 raise TypeError(
1320 "Cannot inherit from Generic[...] multiple types.")
1321 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001322 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001323 tvarset = set(tvars)
1324 gvarset = set(gvars)
1325 if not tvarset <= gvarset:
1326 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
1327 s_args = ', '.join(str(g) for g in gvars)
1328 raise TypeError(f"Some type variables ({s_vars}) are"
1329 f" not listed in Generic[{s_args}]")
1330 tvars = gvars
1331 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001332
1333
1334class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001335 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
1336 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001337 to sneak in where prohibited.
1338 """
1339
1340
1341class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001342 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001343
1344
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001345_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
1346 '_is_protocol', '_is_runtime_protocol']
1347
1348_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
1349 '__init__', '__module__', '__new__', '__slots__',
Guido van Rossum48b069a2020-04-07 09:50:06 -07001350 '__subclasshook__', '__weakref__', '__class_getitem__']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001351
1352# These special attributes will be not collected as protocol members.
1353EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
1354
1355
1356def _get_protocol_attrs(cls):
1357 """Collect protocol members from a protocol class objects.
1358
1359 This includes names actually defined in the class dictionary, as well
1360 as names that appear in annotations. Special names (above) are skipped.
1361 """
1362 attrs = set()
1363 for base in cls.__mro__[:-1]: # without object
1364 if base.__name__ in ('Protocol', 'Generic'):
1365 continue
1366 annotations = getattr(base, '__annotations__', {})
1367 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
1368 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
1369 attrs.add(attr)
1370 return attrs
1371
1372
1373def _is_callable_members_only(cls):
1374 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
1375 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
1376
1377
1378def _no_init(self, *args, **kwargs):
1379 if type(self)._is_protocol:
1380 raise TypeError('Protocols cannot be instantiated')
1381
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001382def _callee(depth=2, default=None):
1383 try:
1384 return sys._getframe(depth).f_globals['__name__']
1385 except (AttributeError, ValueError): # For platforms without _getframe()
1386 return default
1387
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001388
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001389def _allow_reckless_class_checks(depth=3):
Nickolena Fishercfaf4c02020-04-26 12:49:11 -05001390 """Allow instance and class checks for special stdlib modules.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001391
1392 The abc and functools modules indiscriminately call isinstance() and
1393 issubclass() on the whole MRO of a user class, which may contain protocols.
1394 """
1395 try:
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001396 return sys._getframe(depth).f_globals['__name__'] in ['abc', 'functools']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001397 except (AttributeError, ValueError): # For platforms without _getframe().
1398 return True
1399
1400
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001401_PROTO_ALLOWLIST = {
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001402 'collections.abc': [
1403 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
1404 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
1405 ],
1406 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1407}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001408
1409
1410class _ProtocolMeta(ABCMeta):
1411 # This metaclass is really unfortunate and exists only because of
1412 # the lack of __instancehook__.
1413 def __instancecheck__(cls, instance):
1414 # We need this method for situations where attributes are
1415 # assigned in __init__.
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001416 if (
1417 getattr(cls, '_is_protocol', False) and
1418 not getattr(cls, '_is_runtime_protocol', False) and
1419 not _allow_reckless_class_checks(depth=2)
1420 ):
1421 raise TypeError("Instance and class checks can only be used with"
1422 " @runtime_checkable protocols")
1423
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001424 if ((not getattr(cls, '_is_protocol', False) or
1425 _is_callable_members_only(cls)) and
1426 issubclass(instance.__class__, cls)):
1427 return True
1428 if cls._is_protocol:
1429 if all(hasattr(instance, attr) and
1430 # All *methods* can be blocked by setting them to None.
1431 (not callable(getattr(cls, attr, None)) or
1432 getattr(instance, attr) is not None)
1433 for attr in _get_protocol_attrs(cls)):
1434 return True
1435 return super().__instancecheck__(instance)
1436
1437
1438class Protocol(Generic, metaclass=_ProtocolMeta):
1439 """Base class for protocol classes.
1440
1441 Protocol classes are defined as::
1442
1443 class Proto(Protocol):
1444 def meth(self) -> int:
1445 ...
1446
1447 Such classes are primarily used with static type checkers that recognize
1448 structural subtyping (static duck-typing), for example::
1449
1450 class C:
1451 def meth(self) -> int:
1452 return 0
1453
1454 def func(x: Proto) -> int:
1455 return x.meth()
1456
1457 func(C()) # Passes static type check
1458
1459 See PEP 544 for details. Protocol classes decorated with
1460 @typing.runtime_checkable act as simple-minded runtime protocols that check
1461 only the presence of given attributes, ignoring their type signatures.
1462 Protocol classes can be generic, they are defined as::
1463
1464 class GenProto(Protocol[T]):
1465 def meth(self) -> T:
1466 ...
1467 """
1468 __slots__ = ()
1469 _is_protocol = True
1470 _is_runtime_protocol = False
1471
1472 def __init_subclass__(cls, *args, **kwargs):
1473 super().__init_subclass__(*args, **kwargs)
1474
1475 # Determine if this is a protocol or a concrete subclass.
1476 if not cls.__dict__.get('_is_protocol', False):
1477 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1478
1479 # Set (or override) the protocol subclass hook.
1480 def _proto_hook(other):
1481 if not cls.__dict__.get('_is_protocol', False):
1482 return NotImplemented
1483
1484 # First, perform various sanity checks.
1485 if not getattr(cls, '_is_runtime_protocol', False):
Rossc1af1282020-12-29 11:55:28 +00001486 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001487 return NotImplemented
1488 raise TypeError("Instance and class checks can only be used with"
1489 " @runtime_checkable protocols")
1490 if not _is_callable_members_only(cls):
Rossc1af1282020-12-29 11:55:28 +00001491 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001492 return NotImplemented
1493 raise TypeError("Protocols with non-method members"
1494 " don't support issubclass()")
1495 if not isinstance(other, type):
1496 # Same error message as for issubclass(1, int).
1497 raise TypeError('issubclass() arg 1 must be a class')
1498
1499 # Second, perform the actual structural compatibility check.
1500 for attr in _get_protocol_attrs(cls):
1501 for base in other.__mro__:
1502 # Check if the members appears in the class dictionary...
1503 if attr in base.__dict__:
1504 if base.__dict__[attr] is None:
1505 return NotImplemented
1506 break
1507
1508 # ...or in annotations, if it is a sub-protocol.
1509 annotations = getattr(base, '__annotations__', {})
1510 if (isinstance(annotations, collections.abc.Mapping) and
1511 attr in annotations and
1512 issubclass(other, Generic) and other._is_protocol):
1513 break
1514 else:
1515 return NotImplemented
1516 return True
1517
1518 if '__subclasshook__' not in cls.__dict__:
1519 cls.__subclasshook__ = _proto_hook
1520
1521 # We have nothing more to do for non-protocols...
1522 if not cls._is_protocol:
1523 return
1524
1525 # ... otherwise check consistency of bases, and prohibit instantiation.
1526 for base in cls.__bases__:
1527 if not (base in (object, Generic) or
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001528 base.__module__ in _PROTO_ALLOWLIST and
1529 base.__name__ in _PROTO_ALLOWLIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001530 issubclass(base, Generic) and base._is_protocol):
1531 raise TypeError('Protocols can only inherit from other'
1532 ' protocols, got %r' % base)
1533 cls.__init__ = _no_init
1534
1535
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001536class _AnnotatedAlias(_GenericAlias, _root=True):
1537 """Runtime representation of an annotated type.
1538
1539 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1540 with extra annotations. The alias behaves like a normal typing alias,
1541 instantiating is the same as instantiating the underlying type, binding
1542 it to types is also the same.
1543 """
1544 def __init__(self, origin, metadata):
1545 if isinstance(origin, _AnnotatedAlias):
1546 metadata = origin.__metadata__ + metadata
1547 origin = origin.__origin__
1548 super().__init__(origin, origin)
1549 self.__metadata__ = metadata
1550
1551 def copy_with(self, params):
1552 assert len(params) == 1
1553 new_type = params[0]
1554 return _AnnotatedAlias(new_type, self.__metadata__)
1555
1556 def __repr__(self):
1557 return "typing.Annotated[{}, {}]".format(
1558 _type_repr(self.__origin__),
1559 ", ".join(repr(a) for a in self.__metadata__)
1560 )
1561
1562 def __reduce__(self):
1563 return operator.getitem, (
1564 Annotated, (self.__origin__,) + self.__metadata__
1565 )
1566
1567 def __eq__(self, other):
1568 if not isinstance(other, _AnnotatedAlias):
1569 return NotImplemented
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001570 return (self.__origin__ == other.__origin__
1571 and self.__metadata__ == other.__metadata__)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001572
1573 def __hash__(self):
1574 return hash((self.__origin__, self.__metadata__))
1575
1576
1577class Annotated:
1578 """Add context specific metadata to a type.
1579
1580 Example: Annotated[int, runtime_check.Unsigned] indicates to the
1581 hypothetical runtime_check module that this type is an unsigned int.
1582 Every other consumer of this type can ignore this metadata and treat
1583 this type as int.
1584
1585 The first argument to Annotated must be a valid type.
1586
1587 Details:
1588
1589 - It's an error to call `Annotated` with less than two arguments.
1590 - Nested Annotated are flattened::
1591
1592 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1593
1594 - Instantiating an annotated type is equivalent to instantiating the
1595 underlying type::
1596
1597 Annotated[C, Ann1](5) == C(5)
1598
1599 - Annotated can be used as a generic type alias::
1600
1601 Optimized = Annotated[T, runtime.Optimize()]
1602 Optimized[int] == Annotated[int, runtime.Optimize()]
1603
1604 OptimizedList = Annotated[List[T], runtime.Optimize()]
1605 OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1606 """
1607
1608 __slots__ = ()
1609
1610 def __new__(cls, *args, **kwargs):
1611 raise TypeError("Type Annotated cannot be instantiated.")
1612
1613 @_tp_cache
1614 def __class_getitem__(cls, params):
1615 if not isinstance(params, tuple) or len(params) < 2:
1616 raise TypeError("Annotated[...] should be used "
1617 "with at least two arguments (a type and an "
1618 "annotation).")
1619 msg = "Annotated[t, ...]: t must be a type."
1620 origin = _type_check(params[0], msg)
1621 metadata = tuple(params[1:])
1622 return _AnnotatedAlias(origin, metadata)
1623
1624 def __init_subclass__(cls, *args, **kwargs):
1625 raise TypeError(
1626 "Cannot subclass {}.Annotated".format(cls.__module__)
1627 )
1628
1629
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001630def runtime_checkable(cls):
1631 """Mark a protocol class as a runtime protocol.
1632
1633 Such protocol can be used with isinstance() and issubclass().
1634 Raise TypeError if applied to a non-protocol class.
1635 This allows a simple-minded structural check very similar to
1636 one trick ponies in collections.abc such as Iterable.
1637 For example::
1638
1639 @runtime_checkable
1640 class Closable(Protocol):
1641 def close(self): ...
1642
1643 assert isinstance(open('/some/file'), Closable)
1644
1645 Warning: this will check only the presence of the required methods,
1646 not their type signatures!
1647 """
1648 if not issubclass(cls, Generic) or not cls._is_protocol:
1649 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1650 ' got %r' % cls)
1651 cls._is_runtime_protocol = True
1652 return cls
1653
1654
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001655def cast(typ, val):
1656 """Cast a value to a type.
1657
1658 This returns the value unchanged. To the type checker this
1659 signals that the return value has the designated type, but at
1660 runtime we intentionally don't check anything (we want this
1661 to be as fast as possible).
1662 """
1663 return val
1664
1665
1666def _get_defaults(func):
1667 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001668 try:
1669 code = func.__code__
1670 except AttributeError:
1671 # Some built-in functions don't have __code__, __defaults__, etc.
1672 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001673 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001674 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001675 arg_names = arg_names[:pos_count]
1676 defaults = func.__defaults__ or ()
1677 kwdefaults = func.__kwdefaults__
1678 res = dict(kwdefaults) if kwdefaults else {}
1679 pos_offset = pos_count - len(defaults)
1680 for name, value in zip(arg_names[pos_offset:], defaults):
1681 assert name not in res
1682 res[name] = value
1683 return res
1684
1685
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001686_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1687 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001688 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001689
1690
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001691def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001692 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001693
Guido van Rossum991d14f2016-11-09 13:12:51 -08001694 This is often the same as obj.__annotations__, but it handles
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001695 forward references encoded as string literals, adds Optional[t] if a
1696 default value equal to None is set and recursively replaces all
1697 'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001698
Guido van Rossum991d14f2016-11-09 13:12:51 -08001699 The argument may be a module, class, method, or function. The annotations
1700 are returned as a dictionary. For classes, annotations include also
1701 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001702
Guido van Rossum991d14f2016-11-09 13:12:51 -08001703 TypeError is raised if the argument is not of a type that can contain
1704 annotations, and an empty dictionary is returned if no annotations are
1705 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001706
Guido van Rossum991d14f2016-11-09 13:12:51 -08001707 BEWARE -- the behavior of globalns and localns is counterintuitive
1708 (unless you are familiar with how eval() and exec() work). The
1709 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001710
Guido van Rossum991d14f2016-11-09 13:12:51 -08001711 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001712 globals from obj (or the respective module's globals for classes),
1713 and these are also used as the locals. If the object does not appear
Ken Jin1b1f9852021-04-27 01:31:21 +08001714 to have globals, an empty dictionary is used. For classes, the search
1715 order is globals first then locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001716
Guido van Rossum991d14f2016-11-09 13:12:51 -08001717 - If one dict argument is passed, it is used for both globals and
1718 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001719
Guido van Rossum991d14f2016-11-09 13:12:51 -08001720 - If two dict arguments are passed, they specify globals and
1721 locals, respectively.
1722 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001723
Guido van Rossum991d14f2016-11-09 13:12:51 -08001724 if getattr(obj, '__no_type_check__', None):
1725 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001726 # Classes require a special treatment.
1727 if isinstance(obj, type):
1728 hints = {}
1729 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001730 if globalns is None:
Miss Islington (bot)3df23b52021-06-26 16:52:28 -07001731 base_globals = getattr(sys.modules.get(base.__module__, None), '__dict__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001732 else:
1733 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001734 ann = base.__dict__.get('__annotations__', {})
larryhastings2f2b6982021-04-29 20:09:08 -07001735 if isinstance(ann, types.GetSetDescriptorType):
1736 ann = {}
Ken Jin852150d2021-04-13 01:23:12 +08001737 base_locals = dict(vars(base)) if localns is None else localns
Ken Jin1b1f9852021-04-27 01:31:21 +08001738 if localns is None and globalns is None:
1739 # This is surprising, but required. Before Python 3.10,
1740 # get_type_hints only evaluated the globalns of
1741 # a class. To maintain backwards compatibility, we reverse
1742 # the globalns and localns order so that eval() looks into
1743 # *base_globals* first rather than *base_locals*.
1744 # This only affects ForwardRefs.
1745 base_globals, base_locals = base_locals, base_globals
Guido van Rossum991d14f2016-11-09 13:12:51 -08001746 for name, value in ann.items():
1747 if value is None:
1748 value = type(None)
1749 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001750 value = ForwardRef(value, is_argument=False)
Ken Jin852150d2021-04-13 01:23:12 +08001751 value = _eval_type(value, base_globals, base_locals)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001752 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001753 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001754
1755 if globalns is None:
1756 if isinstance(obj, types.ModuleType):
1757 globalns = obj.__dict__
1758 else:
benedwards140aca3a32019-11-21 17:24:58 +00001759 nsobj = obj
1760 # Find globalns for the unwrapped object.
1761 while hasattr(nsobj, '__wrapped__'):
1762 nsobj = nsobj.__wrapped__
1763 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001764 if localns is None:
1765 localns = globalns
1766 elif localns is None:
1767 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001768 hints = getattr(obj, '__annotations__', None)
1769 if hints is None:
1770 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001771 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001772 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001773 else:
1774 raise TypeError('{!r} is not a module, class, method, '
1775 'or function.'.format(obj))
1776 defaults = _get_defaults(obj)
1777 hints = dict(hints)
1778 for name, value in hints.items():
1779 if value is None:
1780 value = type(None)
1781 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001782 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001783 value = _eval_type(value, globalns, localns)
1784 if name in defaults and defaults[name] is None:
1785 value = Optional[value]
1786 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001787 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1788
1789
1790def _strip_annotations(t):
1791 """Strips the annotations from a given type.
1792 """
1793 if isinstance(t, _AnnotatedAlias):
1794 return _strip_annotations(t.__origin__)
1795 if isinstance(t, _GenericAlias):
1796 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1797 if stripped_args == t.__args__:
1798 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001799 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001800 if isinstance(t, GenericAlias):
1801 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1802 if stripped_args == t.__args__:
1803 return t
1804 return GenericAlias(t.__origin__, stripped_args)
Ken Jina2721642021-07-19 22:22:59 +08001805 if isinstance(t, types.Union):
1806 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1807 if stripped_args == t.__args__:
1808 return t
Miss Islington (bot)0aea99e2021-07-24 12:35:33 -07001809 return functools.reduce(operator.or_, stripped_args)
Ken Jina2721642021-07-19 22:22:59 +08001810
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001811 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001812
1813
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001814def get_origin(tp):
1815 """Get the unsubscripted version of a type.
1816
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001817 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1818 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001819
1820 get_origin(Literal[42]) is Literal
1821 get_origin(int) is None
1822 get_origin(ClassVar[int]) is ClassVar
1823 get_origin(Generic) is Generic
1824 get_origin(Generic[T]) is Generic
1825 get_origin(Union[T, int]) is Union
1826 get_origin(List[Tuple[T, T]][int]) == list
Jelle Zijlstra52243362021-04-10 19:57:05 -07001827 get_origin(P.args) is P
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001828 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001829 if isinstance(tp, _AnnotatedAlias):
1830 return Annotated
Jelle Zijlstra52243362021-04-10 19:57:05 -07001831 if isinstance(tp, (_BaseGenericAlias, GenericAlias,
1832 ParamSpecArgs, ParamSpecKwargs)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001833 return tp.__origin__
1834 if tp is Generic:
1835 return Generic
Ken Jinefb1f092020-12-29 10:26:19 +08001836 if isinstance(tp, types.Union):
1837 return types.Union
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001838 return None
1839
1840
1841def get_args(tp):
1842 """Get type arguments with all substitutions performed.
1843
1844 For unions, basic simplifications used by Union constructor are performed.
1845 Examples::
1846 get_args(Dict[str, int]) == (str, int)
1847 get_args(int) == ()
1848 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1849 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1850 get_args(Callable[[], T][int]) == ([], int)
1851 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001852 if isinstance(tp, _AnnotatedAlias):
1853 return (tp.__origin__,) + tp.__metadata__
Ken Jin4140f102020-12-29 04:06:19 +08001854 if isinstance(tp, (_GenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001855 res = tp.__args__
Ken Jinefb1f092020-12-29 10:26:19 +08001856 if (tp.__origin__ is collections.abc.Callable
1857 and not (res[0] is Ellipsis
1858 or isinstance(res[0], (ParamSpec, _ConcatenateGenericAlias)))):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001859 res = (list(res[:-1]), res[-1])
1860 return res
Ken Jinefb1f092020-12-29 10:26:19 +08001861 if isinstance(tp, types.Union):
1862 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001863 return ()
1864
1865
Patrick Reader0705ec82020-09-16 05:58:32 +01001866def is_typeddict(tp):
1867 """Check if an annotation is a TypedDict class
1868
1869 For example::
1870 class Film(TypedDict):
1871 title: str
1872 year: int
1873
1874 is_typeddict(Film) # => True
1875 is_typeddict(Union[list, str]) # => False
1876 """
1877 return isinstance(tp, _TypedDictMeta)
1878
1879
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001880def no_type_check(arg):
1881 """Decorator to indicate that annotations are not type hints.
1882
1883 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001884 applies recursively to all methods and classes defined in that class
1885 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001886
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001887 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001888 """
1889 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001890 arg_attrs = arg.__dict__.copy()
1891 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001892 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001893 arg_attrs.pop(attr)
1894 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001895 if isinstance(obj, types.FunctionType):
1896 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001897 if isinstance(obj, type):
1898 no_type_check(obj)
1899 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001900 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001901 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001902 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001903 return arg
1904
1905
1906def no_type_check_decorator(decorator):
1907 """Decorator to give another decorator the @no_type_check effect.
1908
1909 This wraps the decorator with something that wraps the decorated
1910 function in @no_type_check.
1911 """
1912
1913 @functools.wraps(decorator)
1914 def wrapped_decorator(*args, **kwds):
1915 func = decorator(*args, **kwds)
1916 func = no_type_check(func)
1917 return func
1918
1919 return wrapped_decorator
1920
1921
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001922def _overload_dummy(*args, **kwds):
1923 """Helper for @overload to raise when called."""
1924 raise NotImplementedError(
1925 "You should not call an overloaded function. "
1926 "A series of @overload-decorated functions "
1927 "outside a stub module should always be followed "
1928 "by an implementation that is not @overload-ed.")
1929
1930
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001931def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001932 """Decorator for overloaded functions/methods.
1933
1934 In a stub file, place two or more stub definitions for the same
1935 function in a row, each decorated with @overload. For example:
1936
1937 @overload
1938 def utf8(value: None) -> None: ...
1939 @overload
1940 def utf8(value: bytes) -> bytes: ...
1941 @overload
1942 def utf8(value: str) -> bytes: ...
1943
1944 In a non-stub file (i.e. a regular .py file), do the same but
1945 follow it with an implementation. The implementation should *not*
1946 be decorated with @overload. For example:
1947
1948 @overload
1949 def utf8(value: None) -> None: ...
1950 @overload
1951 def utf8(value: bytes) -> bytes: ...
1952 @overload
1953 def utf8(value: str) -> bytes: ...
1954 def utf8(value):
1955 # implementation goes here
1956 """
1957 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001958
1959
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001960def final(f):
1961 """A decorator to indicate final methods and final classes.
1962
1963 Use this decorator to indicate to type checkers that the decorated
1964 method cannot be overridden, and decorated class cannot be subclassed.
1965 For example:
1966
1967 class Base:
1968 @final
1969 def done(self) -> None:
1970 ...
1971 class Sub(Base):
1972 def done(self) -> None: # Error reported by type checker
1973 ...
1974
1975 @final
1976 class Leaf:
1977 ...
1978 class Other(Leaf): # Error reported by type checker
1979 ...
1980
1981 There is no runtime checking of these properties.
1982 """
1983 return f
1984
1985
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001986# Some unconstrained type variables. These are used by the container types.
1987# (These are not for export.)
1988T = TypeVar('T') # Any type.
1989KT = TypeVar('KT') # Key type.
1990VT = TypeVar('VT') # Value type.
1991T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
1992V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
1993VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
1994T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
1995# Internal type variable used for Type[].
1996CT_co = TypeVar('CT_co', covariant=True, bound=type)
1997
1998# A useful type variable with constraints. This represents string types.
1999# (This one *is* for export!)
2000AnyStr = TypeVar('AnyStr', bytes, str)
2001
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002002
2003# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03002004_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002005
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002006Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
2007Awaitable = _alias(collections.abc.Awaitable, 1)
2008Coroutine = _alias(collections.abc.Coroutine, 3)
2009AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
2010AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
2011Iterable = _alias(collections.abc.Iterable, 1)
2012Iterator = _alias(collections.abc.Iterator, 1)
2013Reversible = _alias(collections.abc.Reversible, 1)
2014Sized = _alias(collections.abc.Sized, 0) # Not generic.
2015Container = _alias(collections.abc.Container, 1)
2016Collection = _alias(collections.abc.Collection, 1)
2017Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002018Callable.__doc__ = \
2019 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002020
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002021 The subscription syntax must always be used with exactly two
2022 values: the argument list and the return type. The argument list
2023 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002024
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002025 There is no syntax to indicate optional or keyword arguments,
2026 such function types are rarely used as callback types.
2027 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002028AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
2029MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002030# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002031Mapping = _alias(collections.abc.Mapping, 2)
2032MutableMapping = _alias(collections.abc.MutableMapping, 2)
2033Sequence = _alias(collections.abc.Sequence, 1)
2034MutableSequence = _alias(collections.abc.MutableSequence, 1)
2035ByteString = _alias(collections.abc.ByteString, 0) # Not generic
2036# Tuple accepts variable number of parameters.
2037Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002038Tuple.__doc__ = \
2039 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002040
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002041 Example: Tuple[T1, T2] is a tuple of two elements corresponding
2042 to type variables T1 and T2. Tuple[int, float, str] is a tuple
2043 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002044
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002045 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
2046 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002047List = _alias(list, 1, inst=False, name='List')
2048Deque = _alias(collections.deque, 1, name='Deque')
2049Set = _alias(set, 1, inst=False, name='Set')
2050FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
2051MappingView = _alias(collections.abc.MappingView, 1)
2052KeysView = _alias(collections.abc.KeysView, 1)
2053ItemsView = _alias(collections.abc.ItemsView, 2)
2054ValuesView = _alias(collections.abc.ValuesView, 1)
2055ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
2056AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
2057Dict = _alias(dict, 2, inst=False, name='Dict')
2058DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
2059OrderedDict = _alias(collections.OrderedDict, 2)
2060Counter = _alias(collections.Counter, 1)
2061ChainMap = _alias(collections.ChainMap, 2)
2062Generator = _alias(collections.abc.Generator, 3)
2063AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
2064Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002065Type.__doc__ = \
2066 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002067
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002068 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002069
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002070 class User: ... # Abstract base for User classes
2071 class BasicUser(User): ...
2072 class ProUser(User): ...
2073 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08002074
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002075 And a function that takes a class argument that's a subclass of
2076 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08002077
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002078 U = TypeVar('U', bound=User)
2079 def new_user(user_class: Type[U]) -> U:
2080 user = user_class()
2081 # (Here we could write the user object to a database)
2082 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08002083
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002084 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08002085
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002086 At this point the type checker knows that joe has type BasicUser.
2087 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002088
2089
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002090@runtime_checkable
2091class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002092 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002093 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002094
2095 @abstractmethod
2096 def __int__(self) -> int:
2097 pass
2098
2099
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002100@runtime_checkable
2101class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002102 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002103 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002104
2105 @abstractmethod
2106 def __float__(self) -> float:
2107 pass
2108
2109
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002110@runtime_checkable
2111class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002112 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002113 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002114
2115 @abstractmethod
2116 def __complex__(self) -> complex:
2117 pass
2118
2119
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002120@runtime_checkable
2121class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002122 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002123 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002124
2125 @abstractmethod
2126 def __bytes__(self) -> bytes:
2127 pass
2128
2129
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002130@runtime_checkable
2131class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002132 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07002133 __slots__ = ()
2134
2135 @abstractmethod
2136 def __index__(self) -> int:
2137 pass
2138
2139
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002140@runtime_checkable
2141class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002142 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002143 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002144
2145 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002146 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002147 pass
2148
2149
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002150@runtime_checkable
2151class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002152 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002153 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002154
2155 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002156 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002157 pass
2158
2159
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002160def _make_nmtuple(name, types, module, defaults = ()):
2161 fields = [n for n, t in types]
2162 types = {n: _type_check(t, f"field {n} annotation must be a type")
2163 for n, t in types}
2164 nm_tpl = collections.namedtuple(name, fields,
2165 defaults=defaults, module=module)
2166 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002167 return nm_tpl
2168
2169
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002170# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002171_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
2172 '_fields', '_field_defaults',
2173 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002174
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002175_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002176
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002177
Guido van Rossum2f841442016-11-15 09:48:06 -08002178class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002179
Guido van Rossum2f841442016-11-15 09:48:06 -08002180 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002181 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08002182 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002183 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08002184 for field_name in types:
2185 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002186 default_names.append(field_name)
2187 elif default_names:
2188 raise TypeError(f"Non-default namedtuple field {field_name} "
2189 f"cannot follow default field"
2190 f"{'s' if len(default_names) > 1 else ''} "
2191 f"{', '.join(default_names)}")
2192 nm_tpl = _make_nmtuple(typename, types.items(),
2193 defaults=[ns[n] for n in default_names],
2194 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08002195 # update from user namespace without overriding special namedtuple attributes
2196 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002197 if key in _prohibited:
2198 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
2199 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08002200 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08002201 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002202
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002203
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002204def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08002205 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002206
Guido van Rossum2f841442016-11-15 09:48:06 -08002207 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002208
Guido van Rossum2f841442016-11-15 09:48:06 -08002209 class Employee(NamedTuple):
2210 name: str
2211 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002212
Guido van Rossum2f841442016-11-15 09:48:06 -08002213 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002214
Guido van Rossum2f841442016-11-15 09:48:06 -08002215 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002216
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07002217 The resulting class has an extra __annotations__ attribute, giving a
2218 dict that maps field names to types. (The field names are also in
2219 the _fields attribute, which is part of the namedtuple API.)
2220 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002221
Guido van Rossum2f841442016-11-15 09:48:06 -08002222 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002223
Guido van Rossum2f841442016-11-15 09:48:06 -08002224 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002225
Guido van Rossum2f841442016-11-15 09:48:06 -08002226 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
2227 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002228 if fields is None:
2229 fields = kwargs.items()
2230 elif kwargs:
2231 raise TypeError("Either list of fields or keywords"
2232 " can be provided to NamedTuple, not both")
2233 try:
2234 module = sys._getframe(1).f_globals.get('__name__', '__main__')
2235 except (AttributeError, ValueError):
2236 module = None
2237 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002238
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002239_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
2240
2241def _namedtuple_mro_entries(bases):
2242 if len(bases) > 1:
2243 raise TypeError("Multiple inheritance with NamedTuple is not supported")
2244 assert bases[0] is NamedTuple
2245 return (_NamedTuple,)
2246
2247NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002248
2249
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002250class _TypedDictMeta(type):
2251 def __new__(cls, name, bases, ns, total=True):
2252 """Create new typed dict class object.
2253
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002254 This method is called when TypedDict is subclassed,
2255 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002256 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002257 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002258 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002259 for base in bases:
2260 if type(base) is not _TypedDictMeta:
2261 raise TypeError('cannot inherit from both a TypedDict type '
2262 'and a non-TypedDict base class')
2263 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002264
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002265 annotations = {}
2266 own_annotations = ns.get('__annotations__', {})
2267 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002268 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002269 own_annotations = {
Miss Islington (bot)480f29f2021-07-17 01:48:17 -07002270 n: _type_check(tp, msg, module=tp_dict.__module__)
2271 for n, tp in own_annotations.items()
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002272 }
2273 required_keys = set()
2274 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002275
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002276 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002277 annotations.update(base.__dict__.get('__annotations__', {}))
2278 required_keys.update(base.__dict__.get('__required_keys__', ()))
2279 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002280
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002281 annotations.update(own_annotations)
2282 if total:
2283 required_keys.update(own_annotation_keys)
2284 else:
2285 optional_keys.update(own_annotation_keys)
2286
2287 tp_dict.__annotations__ = annotations
2288 tp_dict.__required_keys__ = frozenset(required_keys)
2289 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002290 if not hasattr(tp_dict, '__total__'):
2291 tp_dict.__total__ = total
2292 return tp_dict
2293
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002294 __call__ = dict # static method
2295
2296 def __subclasscheck__(cls, other):
2297 # Typed dicts are only for static structural subtyping.
2298 raise TypeError('TypedDict does not support instance and class checks')
2299
2300 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002301
2302
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002303def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002304 """A simple typed namespace. At runtime it is equivalent to a plain dict.
2305
2306 TypedDict creates a dictionary type that expects all of its
2307 instances to have a certain set of keys, where each key is
2308 associated with a value of a consistent type. This expectation
2309 is not checked at runtime but is only enforced by type checkers.
2310 Usage::
2311
2312 class Point2D(TypedDict):
2313 x: int
2314 y: int
2315 label: str
2316
2317 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
2318 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
2319
2320 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
2321
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002322 The type info can be accessed via the Point2D.__annotations__ dict, and
2323 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
2324 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002325
2326 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
2327 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
2328
ananthan-123ab6423f2020-02-19 10:03:05 +05302329 By default, all keys must be present in a TypedDict. It is possible
2330 to override this by specifying totality.
2331 Usage::
2332
2333 class point2D(TypedDict, total=False):
2334 x: int
2335 y: int
2336
2337 This means that a point2D TypedDict can have any of the keys omitted.A type
2338 checker is only expected to support a literal False or True as the value of
2339 the total argument. True is the default, and makes all items defined in the
2340 class body be required.
2341
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002342 The class syntax is only supported in Python 3.6+, while two other
2343 syntax forms work for Python 2.7 and 3.2+
2344 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002345 if fields is None:
2346 fields = kwargs
2347 elif kwargs:
2348 raise TypeError("TypedDict takes either a dict or keyword arguments,"
2349 " but not both")
2350
Alex Grönholm67b769f2020-12-10 23:49:05 +02002351 ns = {'__annotations__': dict(fields)}
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002352 try:
2353 # Setting correct module is necessary to make typed dict classes pickleable.
2354 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
2355 except (AttributeError, ValueError):
2356 pass
2357
Alex Grönholm67b769f2020-12-10 23:49:05 +02002358 return _TypedDictMeta(typename, (), ns, total=total)
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002359
2360_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
2361TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002362
2363
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002364class NewType:
Guido van Rossum91185fe2016-06-08 11:19:11 -07002365 """NewType creates simple unique types with almost zero
2366 runtime overhead. NewType(name, tp) is considered a subtype of tp
2367 by static type checkers. At runtime, NewType(name, tp) returns
2368 a dummy function that simply returns its argument. Usage::
2369
2370 UserId = NewType('UserId', int)
2371
2372 def name_by_id(user_id: UserId) -> str:
2373 ...
2374
2375 UserId('user') # Fails type check
2376
2377 name_by_id(42) # Fails type check
2378 name_by_id(UserId(42)) # OK
2379
2380 num = UserId(5) + 1 # type: int
2381 """
2382
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002383 def __init__(self, name, tp):
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002384 self.__qualname__ = name
Łukasz Langa05f5d8e2021-07-24 12:07:56 +02002385 if '.' in name:
2386 name = name.rpartition('.')[-1]
2387 self.__name__ = name
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002388 self.__module__ = _callee(default='typing')
2389 self.__supertype__ = tp
2390
2391 def __repr__(self):
2392 return f'{self.__module__}.{self.__qualname__}'
2393
2394 def __call__(self, x):
Guido van Rossum91185fe2016-06-08 11:19:11 -07002395 return x
2396
Łukasz Langa05f5d8e2021-07-24 12:07:56 +02002397 def __reduce__(self):
2398 return self.__qualname__
2399
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002400 def __or__(self, other):
2401 return Union[self, other]
2402
2403 def __ror__(self, other):
2404 return Union[other, self]
Guido van Rossum91185fe2016-06-08 11:19:11 -07002405
2406
Guido van Rossum0e0563c2016-04-05 14:54:25 -07002407# Python-version-specific alias (Python 2: unicode; Python 3: str)
2408Text = str
2409
2410
Guido van Rossum91185fe2016-06-08 11:19:11 -07002411# Constant that's True when type checking, but False here.
2412TYPE_CHECKING = False
2413
2414
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002415class IO(Generic[AnyStr]):
2416 """Generic base class for TextIO and BinaryIO.
2417
2418 This is an abstract, generic version of the return of open().
2419
2420 NOTE: This does not distinguish between the different possible
2421 classes (text vs. binary, read vs. write vs. read/write,
2422 append-only, unbuffered). The TextIO and BinaryIO subclasses
2423 below capture the distinctions between text vs. binary, which is
2424 pervasive in the interface; however we currently do not offer a
2425 way to track the other distinctions in the type system.
2426 """
2427
Guido van Rossumd70fe632015-08-05 12:11:06 +02002428 __slots__ = ()
2429
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002430 @property
2431 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002432 def mode(self) -> str:
2433 pass
2434
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002435 @property
2436 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002437 def name(self) -> str:
2438 pass
2439
2440 @abstractmethod
2441 def close(self) -> None:
2442 pass
2443
Shantanu2e6569b2020-01-29 18:52:36 -08002444 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002445 @abstractmethod
2446 def closed(self) -> bool:
2447 pass
2448
2449 @abstractmethod
2450 def fileno(self) -> int:
2451 pass
2452
2453 @abstractmethod
2454 def flush(self) -> None:
2455 pass
2456
2457 @abstractmethod
2458 def isatty(self) -> bool:
2459 pass
2460
2461 @abstractmethod
2462 def read(self, n: int = -1) -> AnyStr:
2463 pass
2464
2465 @abstractmethod
2466 def readable(self) -> bool:
2467 pass
2468
2469 @abstractmethod
2470 def readline(self, limit: int = -1) -> AnyStr:
2471 pass
2472
2473 @abstractmethod
2474 def readlines(self, hint: int = -1) -> List[AnyStr]:
2475 pass
2476
2477 @abstractmethod
2478 def seek(self, offset: int, whence: int = 0) -> int:
2479 pass
2480
2481 @abstractmethod
2482 def seekable(self) -> bool:
2483 pass
2484
2485 @abstractmethod
2486 def tell(self) -> int:
2487 pass
2488
2489 @abstractmethod
2490 def truncate(self, size: int = None) -> int:
2491 pass
2492
2493 @abstractmethod
2494 def writable(self) -> bool:
2495 pass
2496
2497 @abstractmethod
2498 def write(self, s: AnyStr) -> int:
2499 pass
2500
2501 @abstractmethod
2502 def writelines(self, lines: List[AnyStr]) -> None:
2503 pass
2504
2505 @abstractmethod
2506 def __enter__(self) -> 'IO[AnyStr]':
2507 pass
2508
2509 @abstractmethod
2510 def __exit__(self, type, value, traceback) -> None:
2511 pass
2512
2513
2514class BinaryIO(IO[bytes]):
2515 """Typed version of the return of open() in binary mode."""
2516
Guido van Rossumd70fe632015-08-05 12:11:06 +02002517 __slots__ = ()
2518
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002519 @abstractmethod
2520 def write(self, s: Union[bytes, bytearray]) -> int:
2521 pass
2522
2523 @abstractmethod
2524 def __enter__(self) -> 'BinaryIO':
2525 pass
2526
2527
2528class TextIO(IO[str]):
2529 """Typed version of the return of open() in text mode."""
2530
Guido van Rossumd70fe632015-08-05 12:11:06 +02002531 __slots__ = ()
2532
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002533 @property
2534 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002535 def buffer(self) -> BinaryIO:
2536 pass
2537
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002538 @property
2539 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002540 def encoding(self) -> str:
2541 pass
2542
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002543 @property
2544 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002545 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002546 pass
2547
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002548 @property
2549 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002550 def line_buffering(self) -> bool:
2551 pass
2552
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002553 @property
2554 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002555 def newlines(self) -> Any:
2556 pass
2557
2558 @abstractmethod
2559 def __enter__(self) -> 'TextIO':
2560 pass
2561
2562
2563class io:
2564 """Wrapper namespace for IO generic classes."""
2565
2566 __all__ = ['IO', 'TextIO', 'BinaryIO']
2567 IO = IO
2568 TextIO = TextIO
2569 BinaryIO = BinaryIO
2570
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002571
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002572io.__name__ = __name__ + '.io'
2573sys.modules[io.__name__] = io
2574
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002575Pattern = _alias(stdlib_re.Pattern, 1)
2576Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002577
2578class re:
2579 """Wrapper namespace for re type aliases."""
2580
2581 __all__ = ['Pattern', 'Match']
2582 Pattern = Pattern
2583 Match = Match
2584
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002585
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002586re.__name__ = __name__ + '.re'
2587sys.modules[re.__name__] = re