blob: 423329a98005c85f7f9278f042c1afa7cf317a0b [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")
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -0700170 if isinstance(arg, (type, TypeVar, ForwardRef, types.UnionType, 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
Miss Islington (bot)536e35a2021-08-04 13:36:01 -0700177def _is_param_expr(arg):
178 return arg is ... or isinstance(arg,
179 (tuple, list, ParamSpec, _ConcatenateGenericAlias))
180
181
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000182def _type_repr(obj):
183 """Return the repr() of an object, special-casing types (internal helper).
184
185 If obj is a type, we return a shorter version than the default
186 type.__repr__, based on the module and qualified name, which is
187 typically enough to uniquely identify a type. For everything
188 else, we fall back on repr(obj).
189 """
kj1f7dfb22020-11-02 02:13:38 +0800190 if isinstance(obj, types.GenericAlias):
191 return repr(obj)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000192 if isinstance(obj, type):
193 if obj.__module__ == 'builtins':
194 return obj.__qualname__
195 return f'{obj.__module__}.{obj.__qualname__}'
196 if obj is ...:
197 return('...')
198 if isinstance(obj, types.FunctionType):
199 return obj.__name__
200 return repr(obj)
201
202
Ken Jina2721642021-07-19 22:22:59 +0800203def _collect_type_vars(types_, typevar_types=None):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700204 """Collect all type variable contained
kj73607be2020-12-24 12:33:48 +0800205 in types in order of first appearance (lexicographic order). For example::
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000206
207 _collect_type_vars((T, List[S, T])) == (T, S)
208 """
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700209 if typevar_types is None:
210 typevar_types = TypeVar
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000211 tvars = []
Ken Jina2721642021-07-19 22:22:59 +0800212 for t in types_:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700213 if isinstance(t, typevar_types) and t not in tvars:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000214 tvars.append(t)
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -0700215 if isinstance(t, (_GenericAlias, GenericAlias, types.UnionType)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000216 tvars.extend([t for t in t.__parameters__ if t not in tvars])
217 return tuple(tvars)
218
219
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300220def _check_generic(cls, parameters, elen):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000221 """Check correct count for parameters of a generic cls (internal helper).
222 This gives a nice error message in case of count mismatch.
223 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300224 if not elen:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000225 raise TypeError(f"{cls} is not a generic class")
226 alen = len(parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000227 if alen != elen:
Miss Islington (bot)c8db2922021-08-02 00:08:24 -0700228 raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments for {cls};"
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000229 f" actual {alen}, expected {elen}")
230
kj73607be2020-12-24 12:33:48 +0800231def _prepare_paramspec_params(cls, params):
232 """Prepares the parameters for a Generic containing ParamSpec
233 variables (internal helper).
234 """
235 # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612.
Miss Islington (bot)536e35a2021-08-04 13:36:01 -0700236 if (len(cls.__parameters__) == 1
237 and params and not _is_param_expr(params[0])):
238 assert isinstance(cls.__parameters__[0], ParamSpec)
kj73607be2020-12-24 12:33:48 +0800239 return (params,)
240 else:
Miss Islington (bot)c8db2922021-08-02 00:08:24 -0700241 _check_generic(cls, params, len(cls.__parameters__))
kj73607be2020-12-24 12:33:48 +0800242 _params = []
243 # Convert lists to tuples to help other libraries cache the results.
244 for p, tvar in zip(params, cls.__parameters__):
245 if isinstance(tvar, ParamSpec) and isinstance(p, list):
246 p = tuple(p)
247 _params.append(p)
248 return tuple(_params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000249
Yurii Karabasf03d3182020-11-17 04:23:19 +0200250def _deduplicate(params):
251 # Weed out strict duplicates, preserving the first of each occurrence.
252 all_params = set(params)
253 if len(all_params) < len(params):
254 new_params = []
255 for t in params:
256 if t in all_params:
257 new_params.append(t)
258 all_params.remove(t)
259 params = new_params
260 assert not all_params, all_params
261 return params
262
263
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000264def _remove_dups_flatten(parameters):
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700265 """An internal helper for Union creation and substitution: flatten Unions
266 among parameters, then remove duplicates.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000267 """
268 # Flatten out Union[Union[...], ...].
269 params = []
270 for p in parameters:
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -0700271 if isinstance(p, (_UnionGenericAlias, types.UnionType)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000272 params.extend(p.__args__)
273 elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
274 params.extend(p[1:])
275 else:
276 params.append(p)
Yurii Karabasf03d3182020-11-17 04:23:19 +0200277
278 return tuple(_deduplicate(params))
279
280
281def _flatten_literal_params(parameters):
282 """An internal helper for Literal creation: flatten Literals among parameters"""
283 params = []
284 for p in parameters:
285 if isinstance(p, _LiteralGenericAlias):
286 params.extend(p.__args__)
287 else:
288 params.append(p)
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700289 return tuple(params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000290
291
292_cleanups = []
293
294
Yurii Karabasf03d3182020-11-17 04:23:19 +0200295def _tp_cache(func=None, /, *, typed=False):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000296 """Internal wrapper caching __getitem__ of generic types with a fallback to
297 original function for non-hashable arguments.
298 """
Yurii Karabasf03d3182020-11-17 04:23:19 +0200299 def decorator(func):
300 cached = functools.lru_cache(typed=typed)(func)
301 _cleanups.append(cached.cache_clear)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000302
Yurii Karabasf03d3182020-11-17 04:23:19 +0200303 @functools.wraps(func)
304 def inner(*args, **kwds):
305 try:
306 return cached(*args, **kwds)
307 except TypeError:
308 pass # All real errors (not unhashable args) are raised below.
309 return func(*args, **kwds)
310 return inner
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000311
Yurii Karabasf03d3182020-11-17 04:23:19 +0200312 if func is not None:
313 return decorator(func)
314
315 return decorator
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000316
wyfo653f4202020-07-22 21:47:28 +0200317def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
Graham Bleaney84ef33c2020-09-08 18:41:10 -0400318 """Evaluate all forward references in the given type t.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000319 For use of globalns and localns see the docstring for get_type_hints().
wyfo653f4202020-07-22 21:47:28 +0200320 recursive_guard is used to prevent prevent infinite recursion
321 with recursive ForwardRef.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000322 """
323 if isinstance(t, ForwardRef):
wyfo653f4202020-07-22 21:47:28 +0200324 return t._evaluate(globalns, localns, recursive_guard)
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -0700325 if isinstance(t, (_GenericAlias, GenericAlias, types.UnionType)):
wyfo653f4202020-07-22 21:47:28 +0200326 ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000327 if ev_args == t.__args__:
328 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300329 if isinstance(t, GenericAlias):
330 return GenericAlias(t.__origin__, ev_args)
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -0700331 if isinstance(t, types.UnionType):
Miss Islington (bot)0aea99e2021-07-24 12:35:33 -0700332 return functools.reduce(operator.or_, ev_args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300333 else:
334 return t.copy_with(ev_args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000335 return t
336
337
338class _Final:
339 """Mixin to prohibit subclassing"""
Guido van Rossum4cefe742016-09-27 15:20:12 -0700340
Guido van Rossum83ec3022017-01-17 20:43:28 -0800341 __slots__ = ('__weakref__',)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700342
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300343 def __init_subclass__(self, /, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000344 if '_root' not in kwds:
345 raise TypeError("Cannot subclass special typing classes")
346
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100347class _Immutable:
348 """Mixin to indicate that object should not be copied."""
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300349 __slots__ = ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000350
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100351 def __copy__(self):
352 return self
353
354 def __deepcopy__(self, memo):
355 return self
356
357
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300358# Internal indicator of special typing constructs.
359# See __doc__ instance attribute for specific docs.
360class _SpecialForm(_Final, _root=True):
361 __slots__ = ('_name', '__doc__', '_getitem')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000362
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300363 def __init__(self, getitem):
364 self._getitem = getitem
365 self._name = getitem.__name__
366 self.__doc__ = getitem.__doc__
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000367
Miss Islington (bot)c895f2b2021-07-19 10:57:27 -0700368 def __getattr__(self, item):
369 if item in {'__name__', '__qualname__'}:
370 return self._name
371
372 raise AttributeError(item)
373
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300374 def __mro_entries__(self, bases):
375 raise TypeError(f"Cannot subclass {self!r}")
Guido van Rossum4cefe742016-09-27 15:20:12 -0700376
377 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000378 return 'typing.' + self._name
379
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100380 def __reduce__(self):
381 return self._name
Guido van Rossum4cefe742016-09-27 15:20:12 -0700382
383 def __call__(self, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000384 raise TypeError(f"Cannot instantiate {self!r}")
385
Ken Jinca5a4cf2021-07-24 22:49:25 +0800386 def __or__(self, other):
387 return Union[self, other]
388
389 def __ror__(self, other):
390 return Union[other, self]
391
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000392 def __instancecheck__(self, obj):
393 raise TypeError(f"{self} cannot be used with isinstance()")
394
395 def __subclasscheck__(self, cls):
396 raise TypeError(f"{self} cannot be used with issubclass()")
397
398 @_tp_cache
399 def __getitem__(self, parameters):
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300400 return self._getitem(self, parameters)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700401
Yurii Karabasf03d3182020-11-17 04:23:19 +0200402
403class _LiteralSpecialForm(_SpecialForm, _root=True):
404 @_tp_cache(typed=True)
405 def __getitem__(self, parameters):
406 return self._getitem(self, parameters)
407
408
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300409@_SpecialForm
410def Any(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000411 """Special type indicating an unconstrained type.
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700412
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000413 - Any is compatible with every type.
414 - Any assumed to have all methods.
415 - All values assumed to be instances of Any.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700416
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000417 Note that all the above statements are true from the point of view of
418 static type checkers. At runtime, Any should not be used with instance
419 or class checks.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300420 """
421 raise TypeError(f"{self} is not subscriptable")
Guido van Rossumd70fe632015-08-05 12:11:06 +0200422
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300423@_SpecialForm
424def NoReturn(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000425 """Special type indicating functions that never return.
426 Example::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700427
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000428 from typing import NoReturn
429
430 def stop() -> NoReturn:
431 raise Exception('no way')
432
433 This type is invalid in other positions, e.g., ``List[NoReturn]``
434 will fail in static type checkers.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300435 """
436 raise TypeError(f"{self} is not subscriptable")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000437
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300438@_SpecialForm
439def ClassVar(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000440 """Special type construct to mark class variables.
441
442 An annotation wrapped in ClassVar indicates that a given
443 attribute is intended to be used as a class variable and
444 should not be set on instances of that class. Usage::
445
446 class Starship:
447 stats: ClassVar[Dict[str, int]] = {} # class variable
448 damage: int = 10 # instance variable
449
450 ClassVar accepts only types and cannot be further subscribed.
451
452 Note that ClassVar is not a class itself, and should not
453 be used with isinstance() or issubclass().
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300454 """
455 item = _type_check(parameters, f'{self} accepts only single type.')
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700456 return _GenericAlias(self, (item,))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000457
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300458@_SpecialForm
459def Final(self, parameters):
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100460 """Special typing construct to indicate final names to type checkers.
461
462 A final name cannot be re-assigned or overridden in a subclass.
463 For example:
464
465 MAX_SIZE: Final = 9000
466 MAX_SIZE += 1 # Error reported by type checker
467
468 class Connection:
469 TIMEOUT: Final[int] = 10
470
471 class FastConnector(Connection):
472 TIMEOUT = 1 # Error reported by type checker
473
474 There is no runtime checking of these properties.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300475 """
476 item = _type_check(parameters, f'{self} accepts only single type.')
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700477 return _GenericAlias(self, (item,))
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100478
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300479@_SpecialForm
480def Union(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000481 """Union type; Union[X, Y] means either X or Y.
482
483 To define a union, use e.g. Union[int, str]. Details:
484 - The arguments must be types and there must be at least one.
485 - None as an argument is a special case and is replaced by
486 type(None).
487 - Unions of unions are flattened, e.g.::
488
489 Union[Union[int, str], float] == Union[int, str, float]
490
491 - Unions of a single argument vanish, e.g.::
492
493 Union[int] == int # The constructor actually returns int
494
495 - Redundant arguments are skipped, e.g.::
496
497 Union[int, str, int] == Union[int, str]
498
499 - When comparing unions, the argument order is ignored, e.g.::
500
501 Union[int, str] == Union[str, int]
502
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000503 - You cannot subclass or instantiate a union.
504 - You can use Optional[X] as a shorthand for Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300505 """
506 if parameters == ():
507 raise TypeError("Cannot take a Union of no types.")
508 if not isinstance(parameters, tuple):
509 parameters = (parameters,)
510 msg = "Union[arg, ...]: each arg must be a type."
511 parameters = tuple(_type_check(p, msg) for p in parameters)
512 parameters = _remove_dups_flatten(parameters)
513 if len(parameters) == 1:
514 return parameters[0]
Miss Islington (bot)36a24972021-08-06 10:08:27 -0700515 if len(parameters) == 2 and type(None) in parameters:
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700516 return _UnionGenericAlias(self, parameters, name="Optional")
517 return _UnionGenericAlias(self, parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000518
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300519@_SpecialForm
520def Optional(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000521 """Optional type.
522
523 Optional[X] is equivalent to Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300524 """
525 arg = _type_check(parameters, f"{self} requires a single type.")
526 return Union[arg, type(None)]
Guido van Rossumb7dedc82016-10-29 12:44:29 -0700527
Yurii Karabasf03d3182020-11-17 04:23:19 +0200528@_LiteralSpecialForm
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300529def Literal(self, parameters):
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100530 """Special typing form to define literal types (a.k.a. value types).
531
532 This form can be used to indicate to type checkers that the corresponding
533 variable or function parameter has a value equivalent to the provided
534 literal (or one of several literals):
535
536 def validate_simple(data: Any) -> Literal[True]: # always returns True
537 ...
538
539 MODE = Literal['r', 'rb', 'w', 'wb']
540 def open_helper(file: str, mode: MODE) -> str:
541 ...
542
543 open_helper('/some/path', 'r') # Passes type check
544 open_helper('/other/path', 'typo') # Error in type checker
545
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300546 Literal[...] cannot be subclassed. At runtime, an arbitrary value
547 is allowed as type argument to Literal[...], but type checkers may
548 impose restrictions.
549 """
550 # There is no '_type_check' call because arguments to Literal[...] are
551 # values, not types.
Yurii Karabasf03d3182020-11-17 04:23:19 +0200552 if not isinstance(parameters, tuple):
553 parameters = (parameters,)
554
555 parameters = _flatten_literal_params(parameters)
556
557 try:
558 parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
559 except TypeError: # unhashable parameters
560 pass
561
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700562 return _LiteralGenericAlias(self, parameters)
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100563
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700564
Mikhail Golubev4f3c2502020-10-08 00:44:31 +0300565@_SpecialForm
566def TypeAlias(self, parameters):
567 """Special marker indicating that an assignment should
568 be recognized as a proper type alias definition by type
569 checkers.
570
571 For example::
572
573 Predicate: TypeAlias = Callable[..., bool]
574
575 It's invalid when used anywhere except as in the example above.
576 """
577 raise TypeError(f"{self} is not subscriptable")
578
579
kj73607be2020-12-24 12:33:48 +0800580@_SpecialForm
581def Concatenate(self, parameters):
Ken Jin11276cd2021-01-02 08:45:50 +0800582 """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a
583 higher order function which adds, removes or transforms parameters of a
584 callable.
kj73607be2020-12-24 12:33:48 +0800585
586 For example::
587
588 Callable[Concatenate[int, P], int]
589
590 See PEP 612 for detailed information.
591 """
592 if parameters == ():
593 raise TypeError("Cannot take a Concatenate of no types.")
594 if not isinstance(parameters, tuple):
595 parameters = (parameters,)
596 if not isinstance(parameters[-1], ParamSpec):
597 raise TypeError("The last parameter to Concatenate should be a "
598 "ParamSpec variable.")
599 msg = "Concatenate[arg, ...]: each arg must be a type."
600 parameters = tuple(_type_check(p, msg) for p in parameters)
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700601 return _ConcatenateGenericAlias(self, parameters)
kj73607be2020-12-24 12:33:48 +0800602
603
Ken Jin05ab4b62021-04-27 22:31:04 +0800604@_SpecialForm
605def TypeGuard(self, parameters):
606 """Special typing form used to annotate the return type of a user-defined
607 type guard function. ``TypeGuard`` only accepts a single type argument.
608 At runtime, functions marked this way should return a boolean.
609
610 ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static
611 type checkers to determine a more precise type of an expression within a
612 program's code flow. Usually type narrowing is done by analyzing
613 conditional code flow and applying the narrowing to a block of code. The
614 conditional expression here is sometimes referred to as a "type guard".
615
616 Sometimes it would be convenient to use a user-defined boolean function
617 as a type guard. Such a function should use ``TypeGuard[...]`` as its
618 return type to alert static type checkers to this intention.
619
620 Using ``-> TypeGuard`` tells the static type checker that for a given
621 function:
622
623 1. The return value is a boolean.
624 2. If the return value is ``True``, the type of its argument
625 is the type inside ``TypeGuard``.
626
627 For example::
628
629 def is_str(val: Union[str, float]):
630 # "isinstance" type guard
631 if isinstance(val, str):
632 # Type of ``val`` is narrowed to ``str``
633 ...
634 else:
635 # Else, type of ``val`` is narrowed to ``float``.
636 ...
637
638 Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower
639 form of ``TypeA`` (it can even be a wider form) and this may lead to
640 type-unsafe results. The main reason is to allow for things like
641 narrowing ``List[object]`` to ``List[str]`` even though the latter is not
642 a subtype of the former, since ``List`` is invariant. The responsibility of
643 writing type-safe type guards is left to the user.
644
645 ``TypeGuard`` also works with type variables. For more information, see
646 PEP 647 (User-Defined Type Guards).
647 """
648 item = _type_check(parameters, f'{self} accepts only single type.')
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700649 return _GenericAlias(self, (item,))
Ken Jin05ab4b62021-04-27 22:31:04 +0800650
651
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000652class ForwardRef(_Final, _root=True):
Guido van Rossumb24569a2016-11-20 18:01:29 -0800653 """Internal wrapper to hold a forward reference."""
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700654
Guido van Rossum4cefe742016-09-27 15:20:12 -0700655 __slots__ = ('__forward_arg__', '__forward_code__',
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400656 '__forward_evaluated__', '__forward_value__',
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700657 '__forward_is_argument__', '__forward_module__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700658
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700659 def __init__(self, arg, is_argument=True, module=None):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700660 if not isinstance(arg, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000661 raise TypeError(f"Forward reference must be a string -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700662 try:
663 code = compile(arg, '<string>', 'eval')
664 except SyntaxError:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000665 raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700666 self.__forward_arg__ = arg
667 self.__forward_code__ = code
668 self.__forward_evaluated__ = False
669 self.__forward_value__ = None
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400670 self.__forward_is_argument__ = is_argument
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700671 self.__forward_module__ = module
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700672
wyfo653f4202020-07-22 21:47:28 +0200673 def _evaluate(self, globalns, localns, recursive_guard):
674 if self.__forward_arg__ in recursive_guard:
675 return self
Guido van Rossumdad17902016-11-10 08:29:18 -0800676 if not self.__forward_evaluated__ or localns is not globalns:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700677 if globalns is None and localns is None:
678 globalns = localns = {}
679 elif globalns is None:
680 globalns = localns
681 elif localns is None:
682 localns = globalns
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700683 if self.__forward_module__ is not None:
684 globalns = getattr(
685 sys.modules.get(self.__forward_module__, None), '__dict__', globalns
686 )
wyfo653f4202020-07-22 21:47:28 +0200687 type_ =_type_check(
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700688 eval(self.__forward_code__, globalns, localns),
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400689 "Forward references must evaluate to types.",
wyfo653f4202020-07-22 21:47:28 +0200690 is_argument=self.__forward_is_argument__,
691 )
692 self.__forward_value__ = _eval_type(
693 type_, globalns, localns, recursive_guard | {self.__forward_arg__}
694 )
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700695 self.__forward_evaluated__ = True
696 return self.__forward_value__
697
Guido van Rossum4cefe742016-09-27 15:20:12 -0700698 def __eq__(self, other):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000699 if not isinstance(other, ForwardRef):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700700 return NotImplemented
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100701 if self.__forward_evaluated__ and other.__forward_evaluated__:
702 return (self.__forward_arg__ == other.__forward_arg__ and
703 self.__forward_value__ == other.__forward_value__)
704 return self.__forward_arg__ == other.__forward_arg__
Guido van Rossum4cefe742016-09-27 15:20:12 -0700705
706 def __hash__(self):
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100707 return hash(self.__forward_arg__)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700708
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700709 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000710 return f'ForwardRef({self.__forward_arg__!r})'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700711
kj73607be2020-12-24 12:33:48 +0800712class _TypeVarLike:
713 """Mixin for TypeVar-like types (TypeVar and ParamSpec)."""
714 def __init__(self, bound, covariant, contravariant):
715 """Used to setup TypeVars and ParamSpec's bound, covariant and
716 contravariant attributes.
717 """
718 if covariant and contravariant:
719 raise ValueError("Bivariant types are not supported.")
720 self.__covariant__ = bool(covariant)
721 self.__contravariant__ = bool(contravariant)
722 if bound:
723 self.__bound__ = _type_check(bound, "Bound must be a type.")
724 else:
725 self.__bound__ = None
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700726
kj73607be2020-12-24 12:33:48 +0800727 def __or__(self, right):
728 return Union[self, right]
729
Jelle Zijlstra90459192021-04-10 20:00:05 -0700730 def __ror__(self, left):
731 return Union[left, self]
kj73607be2020-12-24 12:33:48 +0800732
733 def __repr__(self):
734 if self.__covariant__:
735 prefix = '+'
736 elif self.__contravariant__:
737 prefix = '-'
738 else:
739 prefix = '~'
740 return prefix + self.__name__
741
742 def __reduce__(self):
743 return self.__name__
744
745
746class TypeVar( _Final, _Immutable, _TypeVarLike, _root=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700747 """Type variable.
748
749 Usage::
750
751 T = TypeVar('T') # Can be anything
752 A = TypeVar('A', str, bytes) # Must be str or bytes
753
754 Type variables exist primarily for the benefit of static type
755 checkers. They serve as the parameters for generic types as well
756 as for generic function definitions. See class Generic for more
757 information on generic types. Generic functions work as follows:
758
Guido van Rossumb24569a2016-11-20 18:01:29 -0800759 def repeat(x: T, n: int) -> List[T]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700760 '''Return a list containing n references to x.'''
761 return [x]*n
762
763 def longest(x: A, y: A) -> A:
764 '''Return the longest of two strings.'''
765 return x if len(x) >= len(y) else y
766
767 The latter example's signature is essentially the overloading
768 of (str, str) -> str and (bytes, bytes) -> bytes. Also note
769 that if the arguments are instances of some subclass of str,
770 the return type is still plain str.
771
Guido van Rossumb24569a2016-11-20 18:01:29 -0800772 At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700773
Guido van Rossumefa798d2016-08-23 11:01:50 -0700774 Type variables defined with covariant=True or contravariant=True
João D. Ferreira86bfed32018-07-07 16:41:20 +0100775 can be used to declare covariant or contravariant generic types.
Guido van Rossumefa798d2016-08-23 11:01:50 -0700776 See PEP 484 for more details. By default generic types are invariant
777 in all type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700778
779 Type variables can be introspected. e.g.:
780
781 T.__name__ == 'T'
782 T.__constraints__ == ()
783 T.__covariant__ == False
784 T.__contravariant__ = False
785 A.__constraints__ == (str, bytes)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100786
787 Note that only type variables defined in global scope can be pickled.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700788 """
789
Guido van Rossum4cefe742016-09-27 15:20:12 -0700790 __slots__ = ('__name__', '__bound__', '__constraints__',
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300791 '__covariant__', '__contravariant__', '__dict__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700792
793 def __init__(self, name, *constraints, bound=None,
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800794 covariant=False, contravariant=False):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700795 self.__name__ = name
kj73607be2020-12-24 12:33:48 +0800796 super().__init__(bound, covariant, contravariant)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700797 if constraints and bound is not None:
798 raise TypeError("Constraints cannot be combined with bound=...")
799 if constraints and len(constraints) == 1:
800 raise TypeError("A single constraint is not allowed")
801 msg = "TypeVar(name, constraint, ...): constraints must be types."
802 self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
HongWeipenga25a04f2020-04-21 04:01:53 +0800803 try:
804 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling
805 except (AttributeError, ValueError):
806 def_mod = None
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300807 if def_mod != 'typing':
808 self.__module__ = def_mod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700809
Maggie Moss1b4552c2020-09-09 13:23:24 -0700810
Jelle Zijlstra52243362021-04-10 19:57:05 -0700811class ParamSpecArgs(_Final, _Immutable, _root=True):
812 """The args for a ParamSpec object.
813
814 Given a ParamSpec object P, P.args is an instance of ParamSpecArgs.
815
816 ParamSpecArgs objects have a reference back to their ParamSpec:
817
818 P.args.__origin__ is P
819
820 This type is meant for runtime introspection and has no special meaning to
821 static type checkers.
822 """
823 def __init__(self, origin):
824 self.__origin__ = origin
825
826 def __repr__(self):
827 return f"{self.__origin__.__name__}.args"
828
829
830class ParamSpecKwargs(_Final, _Immutable, _root=True):
831 """The kwargs for a ParamSpec object.
832
833 Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs.
834
835 ParamSpecKwargs objects have a reference back to their ParamSpec:
836
837 P.kwargs.__origin__ is P
838
839 This type is meant for runtime introspection and has no special meaning to
840 static type checkers.
841 """
842 def __init__(self, origin):
843 self.__origin__ = origin
844
845 def __repr__(self):
846 return f"{self.__origin__.__name__}.kwargs"
847
848
kj73607be2020-12-24 12:33:48 +0800849class ParamSpec(_Final, _Immutable, _TypeVarLike, _root=True):
850 """Parameter specification variable.
Maggie Moss1b4552c2020-09-09 13:23:24 -0700851
kj73607be2020-12-24 12:33:48 +0800852 Usage::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700853
kj73607be2020-12-24 12:33:48 +0800854 P = ParamSpec('P')
855
856 Parameter specification variables exist primarily for the benefit of static
857 type checkers. They are used to forward the parameter types of one
Ken Jin11276cd2021-01-02 08:45:50 +0800858 callable to another callable, a pattern commonly found in higher order
859 functions and decorators. They are only valid when used in ``Concatenate``,
860 or s the first argument to ``Callable``, or as parameters for user-defined
861 Generics. See class Generic for more information on generic types. An
862 example for annotating a decorator::
kj73607be2020-12-24 12:33:48 +0800863
864 T = TypeVar('T')
865 P = ParamSpec('P')
866
867 def add_logging(f: Callable[P, T]) -> Callable[P, T]:
868 '''A type-safe decorator to add logging to a function.'''
869 def inner(*args: P.args, **kwargs: P.kwargs) -> T:
870 logging.info(f'{f.__name__} was called')
871 return f(*args, **kwargs)
872 return inner
873
874 @add_logging
875 def add_two(x: float, y: float) -> float:
876 '''Add two numbers together.'''
877 return x + y
878
879 Parameter specification variables defined with covariant=True or
880 contravariant=True can be used to declare covariant or contravariant
881 generic types. These keyword arguments are valid, but their actual semantics
882 are yet to be decided. See PEP 612 for details.
883
884 Parameter specification variables can be introspected. e.g.:
885
886 P.__name__ == 'T'
887 P.__bound__ == None
888 P.__covariant__ == False
889 P.__contravariant__ == False
890
891 Note that only parameter specification variables defined in global scope can
892 be pickled.
893 """
894
895 __slots__ = ('__name__', '__bound__', '__covariant__', '__contravariant__',
896 '__dict__')
897
Jelle Zijlstra52243362021-04-10 19:57:05 -0700898 @property
899 def args(self):
900 return ParamSpecArgs(self)
901
902 @property
903 def kwargs(self):
904 return ParamSpecKwargs(self)
kj73607be2020-12-24 12:33:48 +0800905
Ken Jinace008c2021-01-11 08:11:41 +0800906 def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
kj73607be2020-12-24 12:33:48 +0800907 self.__name__ = name
908 super().__init__(bound, covariant, contravariant)
909 try:
910 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
911 except (AttributeError, ValueError):
912 def_mod = None
913 if def_mod != 'typing':
914 self.__module__ = def_mod
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100915
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700916
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000917def _is_dunder(attr):
918 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800919
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300920class _BaseGenericAlias(_Final, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000921 """The central part of internal API.
922
923 This represents a generic version of type 'origin' with type arguments 'params'.
924 There are two kind of these aliases: user defined and special. The special ones
925 are wrappers around builtin collections and ABCs in collections.abc. These must
926 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
927 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700928 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300929 def __init__(self, origin, *, inst=True, name=None):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000930 self._inst = inst
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000931 self._name = name
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700932 self.__origin__ = origin
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000933 self.__slots__ = None # This is not documented.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300934
935 def __call__(self, *args, **kwargs):
936 if not self._inst:
937 raise TypeError(f"Type {self._name} cannot be instantiated; "
938 f"use {self.__origin__.__name__}() instead")
939 result = self.__origin__(*args, **kwargs)
940 try:
941 result.__orig_class__ = self
942 except AttributeError:
943 pass
944 return result
945
946 def __mro_entries__(self, bases):
947 res = []
948 if self.__origin__ not in bases:
949 res.append(self.__origin__)
950 i = bases.index(self)
951 for b in bases[i+1:]:
952 if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
953 break
954 else:
955 res.append(Generic)
956 return tuple(res)
957
958 def __getattr__(self, attr):
Miss Islington (bot)c895f2b2021-07-19 10:57:27 -0700959 if attr in {'__name__', '__qualname__'}:
Miss Islington (bot)5bd27c32021-08-21 02:33:14 -0700960 return self._name or self.__origin__.__name__
Miss Islington (bot)c895f2b2021-07-19 10:57:27 -0700961
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300962 # We are careful for copy and pickle.
963 # Also for simplicity we just don't relay all dunder names
964 if '__origin__' in self.__dict__ and not _is_dunder(attr):
965 return getattr(self.__origin__, attr)
966 raise AttributeError(attr)
967
968 def __setattr__(self, attr, val):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700969 if _is_dunder(attr) or attr in {'_name', '_inst', '_nparams',
970 '_typevar_types', '_paramspec_tvars'}:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300971 super().__setattr__(attr, val)
972 else:
973 setattr(self.__origin__, attr, val)
974
975 def __instancecheck__(self, obj):
976 return self.__subclasscheck__(type(obj))
977
978 def __subclasscheck__(self, cls):
979 raise TypeError("Subscripted generics cannot be used with"
980 " class and instance checks")
981
982
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300983# Special typing constructs Union, Optional, Generic, Callable and Tuple
984# use three special attributes for internal bookkeeping of generic types:
985# * __parameters__ is a tuple of unique free type parameters of a generic
986# type, for example, Dict[T, T].__parameters__ == (T,);
987# * __origin__ keeps a reference to a type that was subscripted,
988# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
989# the type.
990# * __args__ is a tuple of all arguments used in subscripting,
991# e.g., Dict[T, int].__args__ == (T, int).
992
993
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300994class _GenericAlias(_BaseGenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700995 def __init__(self, origin, params, *, inst=True, name=None,
996 _typevar_types=TypeVar,
997 _paramspec_tvars=False):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300998 super().__init__(origin, inst=inst, name=name)
999 if not isinstance(params, tuple):
1000 params = (params,)
1001 self.__args__ = tuple(... if a is _TypingEllipsis else
1002 () if a is _TypingEmpty else
1003 a for a in params)
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001004 self.__parameters__ = _collect_type_vars(params, typevar_types=_typevar_types)
1005 self._typevar_types = _typevar_types
1006 self._paramspec_tvars = _paramspec_tvars
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001007 if not name:
1008 self.__module__ = origin.__module__
1009
1010 def __eq__(self, other):
1011 if not isinstance(other, _GenericAlias):
1012 return NotImplemented
1013 return (self.__origin__ == other.__origin__
1014 and self.__args__ == other.__args__)
1015
1016 def __hash__(self):
1017 return hash((self.__origin__, self.__args__))
1018
Maggie Moss1b4552c2020-09-09 13:23:24 -07001019 def __or__(self, right):
1020 return Union[self, right]
1021
Serhiy Storchaka80844d12021-07-16 16:42:04 +03001022 def __ror__(self, left):
1023 return Union[left, self]
Maggie Moss1b4552c2020-09-09 13:23:24 -07001024
Guido van Rossum4cefe742016-09-27 15:20:12 -07001025 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001026 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001027 if self.__origin__ in (Generic, Protocol):
1028 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001029 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001030 if not isinstance(params, tuple):
1031 params = (params,)
kj73607be2020-12-24 12:33:48 +08001032 params = tuple(_type_convert(p) for p in params)
Miss Islington (bot)c8db2922021-08-02 00:08:24 -07001033 if (self._paramspec_tvars
1034 and any(isinstance(t, ParamSpec) for t in self.__parameters__)):
1035 params = _prepare_paramspec_params(self, params)
1036 else:
1037 _check_generic(self, params, len(self.__parameters__))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001038
1039 subst = dict(zip(self.__parameters__, params))
1040 new_args = []
1041 for arg in self.__args__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001042 if isinstance(arg, self._typevar_types):
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001043 if isinstance(arg, ParamSpec):
1044 arg = subst[arg]
1045 if not _is_param_expr(arg):
1046 raise TypeError(f"Expected a list of types, an ellipsis, "
1047 f"ParamSpec, or Concatenate. Got {arg}")
1048 else:
1049 arg = subst[arg]
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001050 elif isinstance(arg, (_GenericAlias, GenericAlias, types.UnionType)):
Serhiy Storchaka0122d482020-05-10 13:39:40 +03001051 subparams = arg.__parameters__
1052 if subparams:
1053 subargs = tuple(subst[x] for x in subparams)
1054 arg = arg[subargs]
kj73607be2020-12-24 12:33:48 +08001055 # Required to flatten out the args for CallableGenericAlias
1056 if self.__origin__ == collections.abc.Callable and isinstance(arg, tuple):
1057 new_args.extend(arg)
1058 else:
1059 new_args.append(arg)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001060 return self.copy_with(tuple(new_args))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001061
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001062 def copy_with(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001063 return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001064
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001065 def __repr__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001066 if self._name:
1067 name = 'typing.' + self._name
1068 else:
1069 name = _type_repr(self.__origin__)
1070 args = ", ".join([_type_repr(a) for a in self.__args__])
1071 return f'{name}[{args}]'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001072
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001073 def __reduce__(self):
1074 if self._name:
1075 origin = globals()[self._name]
1076 else:
1077 origin = self.__origin__
1078 args = tuple(self.__args__)
1079 if len(args) == 1 and not isinstance(args[0], tuple):
1080 args, = args
1081 return operator.getitem, (origin, args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001082
1083 def __mro_entries__(self, bases):
1084 if self._name: # generic version of an ABC or built-in class
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001085 return super().__mro_entries__(bases)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001086 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001087 if Protocol in bases:
1088 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001089 i = bases.index(self)
1090 for b in bases[i+1:]:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001091 if isinstance(b, _BaseGenericAlias) and b is not self:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001092 return ()
1093 return (self.__origin__,)
1094
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001095
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001096# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
1097# 1 for List and 2 for Dict. It may be -1 if variable number of
1098# parameters are accepted (needs custom __getitem__).
1099
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001100class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001101 def __init__(self, origin, nparams, *, inst=True, name=None):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001102 if name is None:
1103 name = origin.__name__
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001104 super().__init__(origin, inst=inst, name=name)
1105 self._nparams = nparams
Serhiy Storchaka2fbc57a2020-05-10 15:14:27 +03001106 if origin.__module__ == 'builtins':
1107 self.__doc__ = f'A generic version of {origin.__qualname__}.'
1108 else:
1109 self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001110
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001111 @_tp_cache
1112 def __getitem__(self, params):
1113 if not isinstance(params, tuple):
1114 params = (params,)
1115 msg = "Parameters to generic types must be types."
1116 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001117 _check_generic(self, params, self._nparams)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001118 return self.copy_with(params)
1119
1120 def copy_with(self, params):
1121 return _GenericAlias(self.__origin__, params,
1122 name=self._name, inst=self._inst)
1123
1124 def __repr__(self):
1125 return 'typing.' + self._name
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001126
1127 def __subclasscheck__(self, cls):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001128 if isinstance(cls, _SpecialGenericAlias):
1129 return issubclass(cls.__origin__, self.__origin__)
1130 if not isinstance(cls, _GenericAlias):
1131 return issubclass(cls, self.__origin__)
1132 return super().__subclasscheck__(cls)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001133
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001134 def __reduce__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001135 return self._name
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001136
Maggie Moss1b4552c2020-09-09 13:23:24 -07001137 def __or__(self, right):
1138 return Union[self, right]
1139
Serhiy Storchaka80844d12021-07-16 16:42:04 +03001140 def __ror__(self, left):
1141 return Union[left, self]
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001142
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001143class _CallableGenericAlias(_GenericAlias, _root=True):
1144 def __repr__(self):
1145 assert self._name == 'Callable'
kj73607be2020-12-24 12:33:48 +08001146 args = self.__args__
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001147 if len(args) == 2 and _is_param_expr(args[0]):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001148 return super().__repr__()
1149 return (f'typing.Callable'
kj73607be2020-12-24 12:33:48 +08001150 f'[[{", ".join([_type_repr(a) for a in args[:-1]])}], '
1151 f'{_type_repr(args[-1])}]')
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001152
1153 def __reduce__(self):
1154 args = self.__args__
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001155 if not (len(args) == 2 and _is_param_expr(args[0])):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001156 args = list(args[:-1]), args[-1]
1157 return operator.getitem, (Callable, args)
1158
1159
1160class _CallableType(_SpecialGenericAlias, _root=True):
1161 def copy_with(self, params):
1162 return _CallableGenericAlias(self.__origin__, params,
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001163 name=self._name, inst=self._inst,
1164 _typevar_types=(TypeVar, ParamSpec),
1165 _paramspec_tvars=True)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001166
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001167 def __getitem__(self, params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001168 if not isinstance(params, tuple) or len(params) != 2:
1169 raise TypeError("Callable must be used as "
1170 "Callable[[arg, ...], result].")
1171 args, result = params
kj463c7d32020-12-14 02:38:24 +08001172 # This relaxes what args can be on purpose to allow things like
1173 # PEP 612 ParamSpec. Responsibility for whether a user is using
1174 # Callable[...] properly is deferred to static type checkers.
1175 if isinstance(args, list):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001176 params = (tuple(args), result)
kj463c7d32020-12-14 02:38:24 +08001177 else:
1178 params = (args, result)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001179 return self.__getitem_inner__(params)
1180
1181 @_tp_cache
1182 def __getitem_inner__(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001183 args, result = params
1184 msg = "Callable[args, result]: result must be a type."
1185 result = _type_check(result, msg)
1186 if args is Ellipsis:
1187 return self.copy_with((_TypingEllipsis, result))
kj463c7d32020-12-14 02:38:24 +08001188 if not isinstance(args, tuple):
1189 args = (args,)
1190 args = tuple(_type_convert(arg) for arg in args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001191 params = args + (result,)
1192 return self.copy_with(params)
1193
1194
1195class _TupleType(_SpecialGenericAlias, _root=True):
1196 @_tp_cache
1197 def __getitem__(self, params):
1198 if params == ():
1199 return self.copy_with((_TypingEmpty,))
1200 if not isinstance(params, tuple):
1201 params = (params,)
1202 if len(params) == 2 and params[1] is ...:
1203 msg = "Tuple[t, ...]: t must be a type."
1204 p = _type_check(params[0], msg)
1205 return self.copy_with((p, _TypingEllipsis))
1206 msg = "Tuple[t0, t1, ...]: each t must be a type."
1207 params = tuple(_type_check(p, msg) for p in params)
1208 return self.copy_with(params)
1209
1210
1211class _UnionGenericAlias(_GenericAlias, _root=True):
1212 def copy_with(self, params):
1213 return Union[params]
1214
1215 def __eq__(self, other):
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001216 if not isinstance(other, (_UnionGenericAlias, types.UnionType)):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001217 return NotImplemented
1218 return set(self.__args__) == set(other.__args__)
1219
1220 def __hash__(self):
1221 return hash(frozenset(self.__args__))
1222
1223 def __repr__(self):
1224 args = self.__args__
1225 if len(args) == 2:
1226 if args[0] is type(None):
1227 return f'typing.Optional[{_type_repr(args[1])}]'
1228 elif args[1] is type(None):
1229 return f'typing.Optional[{_type_repr(args[0])}]'
1230 return super().__repr__()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001231
Maggie Moss1b4552c2020-09-09 13:23:24 -07001232 def __instancecheck__(self, obj):
1233 return self.__subclasscheck__(type(obj))
1234
1235 def __subclasscheck__(self, cls):
1236 for arg in self.__args__:
1237 if issubclass(cls, arg):
1238 return True
1239
Miss Islington (bot)36a24972021-08-06 10:08:27 -07001240 def __reduce__(self):
1241 func, (origin, args) = super().__reduce__()
1242 return func, (Union, args)
1243
Maggie Moss1b4552c2020-09-09 13:23:24 -07001244
Yurii Karabasf03d3182020-11-17 04:23:19 +02001245def _value_and_type_iter(parameters):
1246 return ((p, type(p)) for p in parameters)
1247
1248
1249class _LiteralGenericAlias(_GenericAlias, _root=True):
1250
1251 def __eq__(self, other):
1252 if not isinstance(other, _LiteralGenericAlias):
1253 return NotImplemented
1254
1255 return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__))
1256
1257 def __hash__(self):
Yurii Karabas1b540772020-11-19 18:17:38 +02001258 return hash(frozenset(_value_and_type_iter(self.__args__)))
Yurii Karabasf03d3182020-11-17 04:23:19 +02001259
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001260
kj73607be2020-12-24 12:33:48 +08001261class _ConcatenateGenericAlias(_GenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001262 def __init__(self, *args, **kwargs):
1263 super().__init__(*args, **kwargs,
1264 _typevar_types=(TypeVar, ParamSpec),
1265 _paramspec_tvars=True)
kj73607be2020-12-24 12:33:48 +08001266
1267
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001268class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001269 """Abstract base class for generic types.
1270
Guido van Rossumb24569a2016-11-20 18:01:29 -08001271 A generic type is typically declared by inheriting from
1272 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001273 For example, a generic mapping type might be defined as::
1274
1275 class Mapping(Generic[KT, VT]):
1276 def __getitem__(self, key: KT) -> VT:
1277 ...
1278 # Etc.
1279
1280 This class can then be used as follows::
1281
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001282 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001283 try:
1284 return mapping[key]
1285 except KeyError:
1286 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001287 """
Guido van Rossumd70fe632015-08-05 12:11:06 +02001288 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001289 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +02001290
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001291 @_tp_cache
1292 def __class_getitem__(cls, params):
1293 if not isinstance(params, tuple):
1294 params = (params,)
1295 if not params and cls is not Tuple:
1296 raise TypeError(
1297 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
kj73607be2020-12-24 12:33:48 +08001298 params = tuple(_type_convert(p) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001299 if cls in (Generic, Protocol):
1300 # Generic and Protocol can only be subscripted with unique type variables.
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001301 if not all(isinstance(p, (TypeVar, ParamSpec)) for p in params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001302 raise TypeError(
kj73607be2020-12-24 12:33:48 +08001303 f"Parameters to {cls.__name__}[...] must all be type variables "
1304 f"or parameter specification variables.")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001305 if len(set(params)) != len(params):
1306 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001307 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001308 else:
1309 # Subscripting a regular Generic subclass.
kj73607be2020-12-24 12:33:48 +08001310 if any(isinstance(t, ParamSpec) for t in cls.__parameters__):
1311 params = _prepare_paramspec_params(cls, params)
Miss Islington (bot)c8db2922021-08-02 00:08:24 -07001312 else:
1313 _check_generic(cls, params, len(cls.__parameters__))
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001314 return _GenericAlias(cls, params,
1315 _typevar_types=(TypeVar, ParamSpec),
1316 _paramspec_tvars=True)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001317
1318 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +01001319 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001320 tvars = []
1321 if '__orig_bases__' in cls.__dict__:
1322 error = Generic in cls.__orig_bases__
1323 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001324 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001325 if error:
1326 raise TypeError("Cannot inherit from plain Generic")
1327 if '__orig_bases__' in cls.__dict__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001328 tvars = _collect_type_vars(cls.__orig_bases__, (TypeVar, ParamSpec))
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001329 # Look for Generic[T1, ..., Tn].
1330 # If found, tvars must be a subset of it.
1331 # If not found, tvars is it.
1332 # Also check for and reject plain Generic,
1333 # and reject multiple Generic[...].
1334 gvars = None
1335 for base in cls.__orig_bases__:
1336 if (isinstance(base, _GenericAlias) and
1337 base.__origin__ is Generic):
1338 if gvars is not None:
1339 raise TypeError(
1340 "Cannot inherit from Generic[...] multiple types.")
1341 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001342 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001343 tvarset = set(tvars)
1344 gvarset = set(gvars)
1345 if not tvarset <= gvarset:
1346 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
1347 s_args = ', '.join(str(g) for g in gvars)
1348 raise TypeError(f"Some type variables ({s_vars}) are"
1349 f" not listed in Generic[{s_args}]")
1350 tvars = gvars
1351 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001352
1353
1354class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001355 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
1356 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001357 to sneak in where prohibited.
1358 """
1359
1360
1361class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001362 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001363
1364
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001365_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
1366 '_is_protocol', '_is_runtime_protocol']
1367
1368_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
1369 '__init__', '__module__', '__new__', '__slots__',
Guido van Rossum48b069a2020-04-07 09:50:06 -07001370 '__subclasshook__', '__weakref__', '__class_getitem__']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001371
1372# These special attributes will be not collected as protocol members.
1373EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
1374
1375
1376def _get_protocol_attrs(cls):
1377 """Collect protocol members from a protocol class objects.
1378
1379 This includes names actually defined in the class dictionary, as well
1380 as names that appear in annotations. Special names (above) are skipped.
1381 """
1382 attrs = set()
1383 for base in cls.__mro__[:-1]: # without object
1384 if base.__name__ in ('Protocol', 'Generic'):
1385 continue
1386 annotations = getattr(base, '__annotations__', {})
1387 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
1388 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
1389 attrs.add(attr)
1390 return attrs
1391
1392
1393def _is_callable_members_only(cls):
1394 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
1395 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
1396
1397
1398def _no_init(self, *args, **kwargs):
Miss Islington (bot)2cc19a52021-08-02 10:08:59 -07001399 raise TypeError('Protocols cannot be instantiated')
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001400
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001401def _caller(depth=1, default='__main__'):
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001402 try:
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001403 return sys._getframe(depth + 1).f_globals.get('__name__', default)
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001404 except (AttributeError, ValueError): # For platforms without _getframe()
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001405 return None
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001406
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001407
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001408def _allow_reckless_class_checks(depth=3):
Nickolena Fishercfaf4c02020-04-26 12:49:11 -05001409 """Allow instance and class checks for special stdlib modules.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001410
1411 The abc and functools modules indiscriminately call isinstance() and
1412 issubclass() on the whole MRO of a user class, which may contain protocols.
1413 """
1414 try:
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001415 return sys._getframe(depth).f_globals['__name__'] in ['abc', 'functools']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001416 except (AttributeError, ValueError): # For platforms without _getframe().
1417 return True
1418
1419
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001420_PROTO_ALLOWLIST = {
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001421 'collections.abc': [
1422 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
1423 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
1424 ],
1425 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1426}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001427
1428
1429class _ProtocolMeta(ABCMeta):
1430 # This metaclass is really unfortunate and exists only because of
1431 # the lack of __instancehook__.
1432 def __instancecheck__(cls, instance):
1433 # We need this method for situations where attributes are
1434 # assigned in __init__.
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001435 if (
1436 getattr(cls, '_is_protocol', False) and
1437 not getattr(cls, '_is_runtime_protocol', False) and
1438 not _allow_reckless_class_checks(depth=2)
1439 ):
1440 raise TypeError("Instance and class checks can only be used with"
1441 " @runtime_checkable protocols")
1442
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001443 if ((not getattr(cls, '_is_protocol', False) or
1444 _is_callable_members_only(cls)) and
1445 issubclass(instance.__class__, cls)):
1446 return True
1447 if cls._is_protocol:
1448 if all(hasattr(instance, attr) and
1449 # All *methods* can be blocked by setting them to None.
1450 (not callable(getattr(cls, attr, None)) or
1451 getattr(instance, attr) is not None)
1452 for attr in _get_protocol_attrs(cls)):
1453 return True
1454 return super().__instancecheck__(instance)
1455
1456
1457class Protocol(Generic, metaclass=_ProtocolMeta):
1458 """Base class for protocol classes.
1459
1460 Protocol classes are defined as::
1461
1462 class Proto(Protocol):
1463 def meth(self) -> int:
1464 ...
1465
1466 Such classes are primarily used with static type checkers that recognize
1467 structural subtyping (static duck-typing), for example::
1468
1469 class C:
1470 def meth(self) -> int:
1471 return 0
1472
1473 def func(x: Proto) -> int:
1474 return x.meth()
1475
1476 func(C()) # Passes static type check
1477
1478 See PEP 544 for details. Protocol classes decorated with
1479 @typing.runtime_checkable act as simple-minded runtime protocols that check
1480 only the presence of given attributes, ignoring their type signatures.
1481 Protocol classes can be generic, they are defined as::
1482
1483 class GenProto(Protocol[T]):
1484 def meth(self) -> T:
1485 ...
1486 """
1487 __slots__ = ()
1488 _is_protocol = True
1489 _is_runtime_protocol = False
1490
1491 def __init_subclass__(cls, *args, **kwargs):
1492 super().__init_subclass__(*args, **kwargs)
1493
1494 # Determine if this is a protocol or a concrete subclass.
1495 if not cls.__dict__.get('_is_protocol', False):
1496 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1497
1498 # Set (or override) the protocol subclass hook.
1499 def _proto_hook(other):
1500 if not cls.__dict__.get('_is_protocol', False):
1501 return NotImplemented
1502
1503 # First, perform various sanity checks.
1504 if not getattr(cls, '_is_runtime_protocol', False):
Rossc1af1282020-12-29 11:55:28 +00001505 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001506 return NotImplemented
1507 raise TypeError("Instance and class checks can only be used with"
1508 " @runtime_checkable protocols")
1509 if not _is_callable_members_only(cls):
Rossc1af1282020-12-29 11:55:28 +00001510 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001511 return NotImplemented
1512 raise TypeError("Protocols with non-method members"
1513 " don't support issubclass()")
1514 if not isinstance(other, type):
1515 # Same error message as for issubclass(1, int).
1516 raise TypeError('issubclass() arg 1 must be a class')
1517
1518 # Second, perform the actual structural compatibility check.
1519 for attr in _get_protocol_attrs(cls):
1520 for base in other.__mro__:
1521 # Check if the members appears in the class dictionary...
1522 if attr in base.__dict__:
1523 if base.__dict__[attr] is None:
1524 return NotImplemented
1525 break
1526
1527 # ...or in annotations, if it is a sub-protocol.
1528 annotations = getattr(base, '__annotations__', {})
1529 if (isinstance(annotations, collections.abc.Mapping) and
1530 attr in annotations and
1531 issubclass(other, Generic) and other._is_protocol):
1532 break
1533 else:
1534 return NotImplemented
1535 return True
1536
1537 if '__subclasshook__' not in cls.__dict__:
1538 cls.__subclasshook__ = _proto_hook
1539
1540 # We have nothing more to do for non-protocols...
1541 if not cls._is_protocol:
Miss Islington (bot)2cc19a52021-08-02 10:08:59 -07001542 if cls.__init__ == _no_init:
1543 for base in cls.__mro__:
1544 init = base.__dict__.get('__init__', _no_init)
1545 if init != _no_init:
1546 cls.__init__ = init
1547 break
1548 else:
1549 # should not happen
1550 cls.__init__ = object.__init__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001551 return
1552
1553 # ... otherwise check consistency of bases, and prohibit instantiation.
1554 for base in cls.__bases__:
1555 if not (base in (object, Generic) or
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001556 base.__module__ in _PROTO_ALLOWLIST and
1557 base.__name__ in _PROTO_ALLOWLIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001558 issubclass(base, Generic) and base._is_protocol):
1559 raise TypeError('Protocols can only inherit from other'
1560 ' protocols, got %r' % base)
1561 cls.__init__ = _no_init
1562
1563
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001564class _AnnotatedAlias(_GenericAlias, _root=True):
1565 """Runtime representation of an annotated type.
1566
1567 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1568 with extra annotations. The alias behaves like a normal typing alias,
1569 instantiating is the same as instantiating the underlying type, binding
1570 it to types is also the same.
1571 """
1572 def __init__(self, origin, metadata):
1573 if isinstance(origin, _AnnotatedAlias):
1574 metadata = origin.__metadata__ + metadata
1575 origin = origin.__origin__
Miss Islington (bot)06e9a352021-08-25 11:36:47 -07001576 super().__init__(origin, origin)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001577 self.__metadata__ = metadata
1578
1579 def copy_with(self, params):
1580 assert len(params) == 1
1581 new_type = params[0]
1582 return _AnnotatedAlias(new_type, self.__metadata__)
1583
1584 def __repr__(self):
1585 return "typing.Annotated[{}, {}]".format(
1586 _type_repr(self.__origin__),
1587 ", ".join(repr(a) for a in self.__metadata__)
1588 )
1589
1590 def __reduce__(self):
1591 return operator.getitem, (
1592 Annotated, (self.__origin__,) + self.__metadata__
1593 )
1594
1595 def __eq__(self, other):
1596 if not isinstance(other, _AnnotatedAlias):
1597 return NotImplemented
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001598 return (self.__origin__ == other.__origin__
1599 and self.__metadata__ == other.__metadata__)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001600
1601 def __hash__(self):
1602 return hash((self.__origin__, self.__metadata__))
1603
Miss Islington (bot)06e9a352021-08-25 11:36:47 -07001604 def __getattr__(self, attr):
1605 if attr in {'__name__', '__qualname__'}:
1606 return 'Annotated'
1607 return super().__getattr__(attr)
1608
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001609
1610class Annotated:
1611 """Add context specific metadata to a type.
1612
1613 Example: Annotated[int, runtime_check.Unsigned] indicates to the
1614 hypothetical runtime_check module that this type is an unsigned int.
1615 Every other consumer of this type can ignore this metadata and treat
1616 this type as int.
1617
1618 The first argument to Annotated must be a valid type.
1619
1620 Details:
1621
1622 - It's an error to call `Annotated` with less than two arguments.
1623 - Nested Annotated are flattened::
1624
1625 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1626
1627 - Instantiating an annotated type is equivalent to instantiating the
1628 underlying type::
1629
1630 Annotated[C, Ann1](5) == C(5)
1631
1632 - Annotated can be used as a generic type alias::
1633
1634 Optimized = Annotated[T, runtime.Optimize()]
1635 Optimized[int] == Annotated[int, runtime.Optimize()]
1636
1637 OptimizedList = Annotated[List[T], runtime.Optimize()]
1638 OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1639 """
1640
1641 __slots__ = ()
1642
1643 def __new__(cls, *args, **kwargs):
1644 raise TypeError("Type Annotated cannot be instantiated.")
1645
1646 @_tp_cache
1647 def __class_getitem__(cls, params):
1648 if not isinstance(params, tuple) or len(params) < 2:
1649 raise TypeError("Annotated[...] should be used "
1650 "with at least two arguments (a type and an "
1651 "annotation).")
1652 msg = "Annotated[t, ...]: t must be a type."
1653 origin = _type_check(params[0], msg)
1654 metadata = tuple(params[1:])
1655 return _AnnotatedAlias(origin, metadata)
1656
1657 def __init_subclass__(cls, *args, **kwargs):
1658 raise TypeError(
1659 "Cannot subclass {}.Annotated".format(cls.__module__)
1660 )
1661
1662
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001663def runtime_checkable(cls):
1664 """Mark a protocol class as a runtime protocol.
1665
1666 Such protocol can be used with isinstance() and issubclass().
1667 Raise TypeError if applied to a non-protocol class.
1668 This allows a simple-minded structural check very similar to
1669 one trick ponies in collections.abc such as Iterable.
1670 For example::
1671
1672 @runtime_checkable
1673 class Closable(Protocol):
1674 def close(self): ...
1675
1676 assert isinstance(open('/some/file'), Closable)
1677
1678 Warning: this will check only the presence of the required methods,
1679 not their type signatures!
1680 """
1681 if not issubclass(cls, Generic) or not cls._is_protocol:
1682 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1683 ' got %r' % cls)
1684 cls._is_runtime_protocol = True
1685 return cls
1686
1687
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001688def cast(typ, val):
1689 """Cast a value to a type.
1690
1691 This returns the value unchanged. To the type checker this
1692 signals that the return value has the designated type, but at
1693 runtime we intentionally don't check anything (we want this
1694 to be as fast as possible).
1695 """
1696 return val
1697
1698
1699def _get_defaults(func):
1700 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001701 try:
1702 code = func.__code__
1703 except AttributeError:
1704 # Some built-in functions don't have __code__, __defaults__, etc.
1705 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001706 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001707 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001708 arg_names = arg_names[:pos_count]
1709 defaults = func.__defaults__ or ()
1710 kwdefaults = func.__kwdefaults__
1711 res = dict(kwdefaults) if kwdefaults else {}
1712 pos_offset = pos_count - len(defaults)
1713 for name, value in zip(arg_names[pos_offset:], defaults):
1714 assert name not in res
1715 res[name] = value
1716 return res
1717
1718
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001719_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1720 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001721 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001722
1723
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001724def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001725 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001726
Guido van Rossum991d14f2016-11-09 13:12:51 -08001727 This is often the same as obj.__annotations__, but it handles
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001728 forward references encoded as string literals, adds Optional[t] if a
1729 default value equal to None is set and recursively replaces all
1730 'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001731
Guido van Rossum991d14f2016-11-09 13:12:51 -08001732 The argument may be a module, class, method, or function. The annotations
1733 are returned as a dictionary. For classes, annotations include also
1734 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001735
Guido van Rossum991d14f2016-11-09 13:12:51 -08001736 TypeError is raised if the argument is not of a type that can contain
1737 annotations, and an empty dictionary is returned if no annotations are
1738 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001739
Guido van Rossum991d14f2016-11-09 13:12:51 -08001740 BEWARE -- the behavior of globalns and localns is counterintuitive
1741 (unless you are familiar with how eval() and exec() work). The
1742 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001743
Guido van Rossum991d14f2016-11-09 13:12:51 -08001744 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001745 globals from obj (or the respective module's globals for classes),
1746 and these are also used as the locals. If the object does not appear
Ken Jin1b1f9852021-04-27 01:31:21 +08001747 to have globals, an empty dictionary is used. For classes, the search
1748 order is globals first then locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001749
Guido van Rossum991d14f2016-11-09 13:12:51 -08001750 - If one dict argument is passed, it is used for both globals and
1751 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001752
Guido van Rossum991d14f2016-11-09 13:12:51 -08001753 - If two dict arguments are passed, they specify globals and
1754 locals, respectively.
1755 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001756
Guido van Rossum991d14f2016-11-09 13:12:51 -08001757 if getattr(obj, '__no_type_check__', None):
1758 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001759 # Classes require a special treatment.
1760 if isinstance(obj, type):
1761 hints = {}
1762 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001763 if globalns is None:
Miss Islington (bot)3df23b52021-06-26 16:52:28 -07001764 base_globals = getattr(sys.modules.get(base.__module__, None), '__dict__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001765 else:
1766 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001767 ann = base.__dict__.get('__annotations__', {})
larryhastings2f2b6982021-04-29 20:09:08 -07001768 if isinstance(ann, types.GetSetDescriptorType):
1769 ann = {}
Ken Jin852150d2021-04-13 01:23:12 +08001770 base_locals = dict(vars(base)) if localns is None else localns
Ken Jin1b1f9852021-04-27 01:31:21 +08001771 if localns is None and globalns is None:
1772 # This is surprising, but required. Before Python 3.10,
1773 # get_type_hints only evaluated the globalns of
1774 # a class. To maintain backwards compatibility, we reverse
1775 # the globalns and localns order so that eval() looks into
1776 # *base_globals* first rather than *base_locals*.
1777 # This only affects ForwardRefs.
1778 base_globals, base_locals = base_locals, base_globals
Guido van Rossum991d14f2016-11-09 13:12:51 -08001779 for name, value in ann.items():
1780 if value is None:
1781 value = type(None)
1782 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001783 value = ForwardRef(value, is_argument=False)
Ken Jin852150d2021-04-13 01:23:12 +08001784 value = _eval_type(value, base_globals, base_locals)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001785 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001786 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001787
1788 if globalns is None:
1789 if isinstance(obj, types.ModuleType):
1790 globalns = obj.__dict__
1791 else:
benedwards140aca3a32019-11-21 17:24:58 +00001792 nsobj = obj
1793 # Find globalns for the unwrapped object.
1794 while hasattr(nsobj, '__wrapped__'):
1795 nsobj = nsobj.__wrapped__
1796 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001797 if localns is None:
1798 localns = globalns
1799 elif localns is None:
1800 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001801 hints = getattr(obj, '__annotations__', None)
1802 if hints is None:
1803 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001804 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001805 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001806 else:
1807 raise TypeError('{!r} is not a module, class, method, '
1808 'or function.'.format(obj))
1809 defaults = _get_defaults(obj)
1810 hints = dict(hints)
1811 for name, value in hints.items():
1812 if value is None:
1813 value = type(None)
1814 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001815 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001816 value = _eval_type(value, globalns, localns)
1817 if name in defaults and defaults[name] is None:
1818 value = Optional[value]
1819 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001820 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1821
1822
1823def _strip_annotations(t):
1824 """Strips the annotations from a given type.
1825 """
1826 if isinstance(t, _AnnotatedAlias):
1827 return _strip_annotations(t.__origin__)
1828 if isinstance(t, _GenericAlias):
1829 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1830 if stripped_args == t.__args__:
1831 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001832 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001833 if isinstance(t, GenericAlias):
1834 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1835 if stripped_args == t.__args__:
1836 return t
1837 return GenericAlias(t.__origin__, stripped_args)
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001838 if isinstance(t, types.UnionType):
Ken Jina2721642021-07-19 22:22:59 +08001839 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1840 if stripped_args == t.__args__:
1841 return t
Miss Islington (bot)0aea99e2021-07-24 12:35:33 -07001842 return functools.reduce(operator.or_, stripped_args)
Ken Jina2721642021-07-19 22:22:59 +08001843
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001844 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001845
1846
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001847def get_origin(tp):
1848 """Get the unsubscripted version of a type.
1849
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001850 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1851 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001852
1853 get_origin(Literal[42]) is Literal
1854 get_origin(int) is None
1855 get_origin(ClassVar[int]) is ClassVar
1856 get_origin(Generic) is Generic
1857 get_origin(Generic[T]) is Generic
1858 get_origin(Union[T, int]) is Union
1859 get_origin(List[Tuple[T, T]][int]) == list
Jelle Zijlstra52243362021-04-10 19:57:05 -07001860 get_origin(P.args) is P
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001861 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001862 if isinstance(tp, _AnnotatedAlias):
1863 return Annotated
Jelle Zijlstra52243362021-04-10 19:57:05 -07001864 if isinstance(tp, (_BaseGenericAlias, GenericAlias,
1865 ParamSpecArgs, ParamSpecKwargs)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001866 return tp.__origin__
1867 if tp is Generic:
1868 return Generic
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001869 if isinstance(tp, types.UnionType):
1870 return types.UnionType
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001871 return None
1872
1873
1874def get_args(tp):
1875 """Get type arguments with all substitutions performed.
1876
1877 For unions, basic simplifications used by Union constructor are performed.
1878 Examples::
1879 get_args(Dict[str, int]) == (str, int)
1880 get_args(int) == ()
1881 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1882 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1883 get_args(Callable[[], T][int]) == ([], int)
1884 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001885 if isinstance(tp, _AnnotatedAlias):
1886 return (tp.__origin__,) + tp.__metadata__
Ken Jin4140f102020-12-29 04:06:19 +08001887 if isinstance(tp, (_GenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001888 res = tp.__args__
Ken Jinefb1f092020-12-29 10:26:19 +08001889 if (tp.__origin__ is collections.abc.Callable
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001890 and not (len(res) == 2 and _is_param_expr(res[0]))):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001891 res = (list(res[:-1]), res[-1])
1892 return res
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001893 if isinstance(tp, types.UnionType):
Ken Jinefb1f092020-12-29 10:26:19 +08001894 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001895 return ()
1896
1897
Patrick Reader0705ec82020-09-16 05:58:32 +01001898def is_typeddict(tp):
1899 """Check if an annotation is a TypedDict class
1900
1901 For example::
1902 class Film(TypedDict):
1903 title: str
1904 year: int
1905
1906 is_typeddict(Film) # => True
1907 is_typeddict(Union[list, str]) # => False
1908 """
1909 return isinstance(tp, _TypedDictMeta)
1910
1911
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001912def no_type_check(arg):
1913 """Decorator to indicate that annotations are not type hints.
1914
1915 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001916 applies recursively to all methods and classes defined in that class
1917 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001918
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001919 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001920 """
1921 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001922 arg_attrs = arg.__dict__.copy()
1923 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001924 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001925 arg_attrs.pop(attr)
1926 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001927 if isinstance(obj, types.FunctionType):
1928 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001929 if isinstance(obj, type):
1930 no_type_check(obj)
1931 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001932 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001933 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001934 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001935 return arg
1936
1937
1938def no_type_check_decorator(decorator):
1939 """Decorator to give another decorator the @no_type_check effect.
1940
1941 This wraps the decorator with something that wraps the decorated
1942 function in @no_type_check.
1943 """
1944
1945 @functools.wraps(decorator)
1946 def wrapped_decorator(*args, **kwds):
1947 func = decorator(*args, **kwds)
1948 func = no_type_check(func)
1949 return func
1950
1951 return wrapped_decorator
1952
1953
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001954def _overload_dummy(*args, **kwds):
1955 """Helper for @overload to raise when called."""
1956 raise NotImplementedError(
1957 "You should not call an overloaded function. "
1958 "A series of @overload-decorated functions "
1959 "outside a stub module should always be followed "
1960 "by an implementation that is not @overload-ed.")
1961
1962
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001963def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001964 """Decorator for overloaded functions/methods.
1965
1966 In a stub file, place two or more stub definitions for the same
1967 function in a row, each decorated with @overload. For example:
1968
1969 @overload
1970 def utf8(value: None) -> None: ...
1971 @overload
1972 def utf8(value: bytes) -> bytes: ...
1973 @overload
1974 def utf8(value: str) -> bytes: ...
1975
1976 In a non-stub file (i.e. a regular .py file), do the same but
1977 follow it with an implementation. The implementation should *not*
1978 be decorated with @overload. For example:
1979
1980 @overload
1981 def utf8(value: None) -> None: ...
1982 @overload
1983 def utf8(value: bytes) -> bytes: ...
1984 @overload
1985 def utf8(value: str) -> bytes: ...
1986 def utf8(value):
1987 # implementation goes here
1988 """
1989 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001990
1991
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001992def final(f):
1993 """A decorator to indicate final methods and final classes.
1994
1995 Use this decorator to indicate to type checkers that the decorated
1996 method cannot be overridden, and decorated class cannot be subclassed.
1997 For example:
1998
1999 class Base:
2000 @final
2001 def done(self) -> None:
2002 ...
2003 class Sub(Base):
2004 def done(self) -> None: # Error reported by type checker
2005 ...
2006
2007 @final
2008 class Leaf:
2009 ...
2010 class Other(Leaf): # Error reported by type checker
2011 ...
2012
2013 There is no runtime checking of these properties.
2014 """
2015 return f
2016
2017
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002018# Some unconstrained type variables. These are used by the container types.
2019# (These are not for export.)
2020T = TypeVar('T') # Any type.
2021KT = TypeVar('KT') # Key type.
2022VT = TypeVar('VT') # Value type.
2023T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
2024V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
2025VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
2026T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
2027# Internal type variable used for Type[].
2028CT_co = TypeVar('CT_co', covariant=True, bound=type)
2029
2030# A useful type variable with constraints. This represents string types.
2031# (This one *is* for export!)
2032AnyStr = TypeVar('AnyStr', bytes, str)
2033
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002034
2035# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03002036_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002037
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002038Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
2039Awaitable = _alias(collections.abc.Awaitable, 1)
2040Coroutine = _alias(collections.abc.Coroutine, 3)
2041AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
2042AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
2043Iterable = _alias(collections.abc.Iterable, 1)
2044Iterator = _alias(collections.abc.Iterator, 1)
2045Reversible = _alias(collections.abc.Reversible, 1)
2046Sized = _alias(collections.abc.Sized, 0) # Not generic.
2047Container = _alias(collections.abc.Container, 1)
2048Collection = _alias(collections.abc.Collection, 1)
2049Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002050Callable.__doc__ = \
2051 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002052
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002053 The subscription syntax must always be used with exactly two
2054 values: the argument list and the return type. The argument list
2055 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002056
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002057 There is no syntax to indicate optional or keyword arguments,
2058 such function types are rarely used as callback types.
2059 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002060AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
2061MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002062# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002063Mapping = _alias(collections.abc.Mapping, 2)
2064MutableMapping = _alias(collections.abc.MutableMapping, 2)
2065Sequence = _alias(collections.abc.Sequence, 1)
2066MutableSequence = _alias(collections.abc.MutableSequence, 1)
2067ByteString = _alias(collections.abc.ByteString, 0) # Not generic
2068# Tuple accepts variable number of parameters.
2069Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002070Tuple.__doc__ = \
2071 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002072
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002073 Example: Tuple[T1, T2] is a tuple of two elements corresponding
2074 to type variables T1 and T2. Tuple[int, float, str] is a tuple
2075 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002076
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002077 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
2078 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002079List = _alias(list, 1, inst=False, name='List')
2080Deque = _alias(collections.deque, 1, name='Deque')
2081Set = _alias(set, 1, inst=False, name='Set')
2082FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
2083MappingView = _alias(collections.abc.MappingView, 1)
2084KeysView = _alias(collections.abc.KeysView, 1)
2085ItemsView = _alias(collections.abc.ItemsView, 2)
2086ValuesView = _alias(collections.abc.ValuesView, 1)
2087ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
2088AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
2089Dict = _alias(dict, 2, inst=False, name='Dict')
2090DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
2091OrderedDict = _alias(collections.OrderedDict, 2)
2092Counter = _alias(collections.Counter, 1)
2093ChainMap = _alias(collections.ChainMap, 2)
2094Generator = _alias(collections.abc.Generator, 3)
2095AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
2096Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002097Type.__doc__ = \
2098 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002099
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002100 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002101
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002102 class User: ... # Abstract base for User classes
2103 class BasicUser(User): ...
2104 class ProUser(User): ...
2105 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08002106
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002107 And a function that takes a class argument that's a subclass of
2108 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08002109
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002110 U = TypeVar('U', bound=User)
2111 def new_user(user_class: Type[U]) -> U:
2112 user = user_class()
2113 # (Here we could write the user object to a database)
2114 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08002115
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002116 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08002117
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002118 At this point the type checker knows that joe has type BasicUser.
2119 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002120
2121
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002122@runtime_checkable
2123class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002124 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002125 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002126
2127 @abstractmethod
2128 def __int__(self) -> int:
2129 pass
2130
2131
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002132@runtime_checkable
2133class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002134 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002135 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002136
2137 @abstractmethod
2138 def __float__(self) -> float:
2139 pass
2140
2141
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002142@runtime_checkable
2143class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002144 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002145 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002146
2147 @abstractmethod
2148 def __complex__(self) -> complex:
2149 pass
2150
2151
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002152@runtime_checkable
2153class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002154 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002155 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002156
2157 @abstractmethod
2158 def __bytes__(self) -> bytes:
2159 pass
2160
2161
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002162@runtime_checkable
2163class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002164 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07002165 __slots__ = ()
2166
2167 @abstractmethod
2168 def __index__(self) -> int:
2169 pass
2170
2171
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002172@runtime_checkable
2173class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002174 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002175 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002176
2177 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002178 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002179 pass
2180
2181
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002182@runtime_checkable
2183class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002184 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002185 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002186
2187 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002188 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002189 pass
2190
2191
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002192def _make_nmtuple(name, types, module, defaults = ()):
2193 fields = [n for n, t in types]
2194 types = {n: _type_check(t, f"field {n} annotation must be a type")
2195 for n, t in types}
2196 nm_tpl = collections.namedtuple(name, fields,
2197 defaults=defaults, module=module)
2198 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002199 return nm_tpl
2200
2201
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002202# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002203_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
2204 '_fields', '_field_defaults',
2205 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002206
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002207_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002208
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002209
Guido van Rossum2f841442016-11-15 09:48:06 -08002210class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002211
Guido van Rossum2f841442016-11-15 09:48:06 -08002212 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002213 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08002214 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002215 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08002216 for field_name in types:
2217 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002218 default_names.append(field_name)
2219 elif default_names:
2220 raise TypeError(f"Non-default namedtuple field {field_name} "
2221 f"cannot follow default field"
2222 f"{'s' if len(default_names) > 1 else ''} "
2223 f"{', '.join(default_names)}")
2224 nm_tpl = _make_nmtuple(typename, types.items(),
2225 defaults=[ns[n] for n in default_names],
2226 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08002227 # update from user namespace without overriding special namedtuple attributes
2228 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002229 if key in _prohibited:
2230 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
2231 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08002232 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08002233 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002234
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002235
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002236def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08002237 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002238
Guido van Rossum2f841442016-11-15 09:48:06 -08002239 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002240
Guido van Rossum2f841442016-11-15 09:48:06 -08002241 class Employee(NamedTuple):
2242 name: str
2243 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002244
Guido van Rossum2f841442016-11-15 09:48:06 -08002245 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002246
Guido van Rossum2f841442016-11-15 09:48:06 -08002247 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002248
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07002249 The resulting class has an extra __annotations__ attribute, giving a
2250 dict that maps field names to types. (The field names are also in
2251 the _fields attribute, which is part of the namedtuple API.)
2252 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002253
Guido van Rossum2f841442016-11-15 09:48:06 -08002254 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002255
Guido van Rossum2f841442016-11-15 09:48:06 -08002256 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002257
Guido van Rossum2f841442016-11-15 09:48:06 -08002258 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
2259 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002260 if fields is None:
2261 fields = kwargs.items()
2262 elif kwargs:
2263 raise TypeError("Either list of fields or keywords"
2264 " can be provided to NamedTuple, not both")
2265 try:
2266 module = sys._getframe(1).f_globals.get('__name__', '__main__')
2267 except (AttributeError, ValueError):
2268 module = None
2269 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002270
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002271_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
2272
2273def _namedtuple_mro_entries(bases):
2274 if len(bases) > 1:
2275 raise TypeError("Multiple inheritance with NamedTuple is not supported")
2276 assert bases[0] is NamedTuple
2277 return (_NamedTuple,)
2278
2279NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002280
2281
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002282class _TypedDictMeta(type):
2283 def __new__(cls, name, bases, ns, total=True):
2284 """Create new typed dict class object.
2285
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002286 This method is called when TypedDict is subclassed,
2287 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002288 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002289 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002290 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002291 for base in bases:
2292 if type(base) is not _TypedDictMeta:
2293 raise TypeError('cannot inherit from both a TypedDict type '
2294 'and a non-TypedDict base class')
2295 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002296
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002297 annotations = {}
2298 own_annotations = ns.get('__annotations__', {})
2299 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002300 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002301 own_annotations = {
Miss Islington (bot)480f29f2021-07-17 01:48:17 -07002302 n: _type_check(tp, msg, module=tp_dict.__module__)
2303 for n, tp in own_annotations.items()
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002304 }
2305 required_keys = set()
2306 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002307
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002308 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002309 annotations.update(base.__dict__.get('__annotations__', {}))
2310 required_keys.update(base.__dict__.get('__required_keys__', ()))
2311 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002312
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002313 annotations.update(own_annotations)
2314 if total:
2315 required_keys.update(own_annotation_keys)
2316 else:
2317 optional_keys.update(own_annotation_keys)
2318
2319 tp_dict.__annotations__ = annotations
2320 tp_dict.__required_keys__ = frozenset(required_keys)
2321 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002322 if not hasattr(tp_dict, '__total__'):
2323 tp_dict.__total__ = total
2324 return tp_dict
2325
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002326 __call__ = dict # static method
2327
2328 def __subclasscheck__(cls, other):
2329 # Typed dicts are only for static structural subtyping.
2330 raise TypeError('TypedDict does not support instance and class checks')
2331
2332 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002333
2334
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002335def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002336 """A simple typed namespace. At runtime it is equivalent to a plain dict.
2337
2338 TypedDict creates a dictionary type that expects all of its
2339 instances to have a certain set of keys, where each key is
2340 associated with a value of a consistent type. This expectation
2341 is not checked at runtime but is only enforced by type checkers.
2342 Usage::
2343
2344 class Point2D(TypedDict):
2345 x: int
2346 y: int
2347 label: str
2348
2349 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
2350 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
2351
2352 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
2353
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002354 The type info can be accessed via the Point2D.__annotations__ dict, and
2355 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
2356 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002357
2358 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
2359 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
2360
ananthan-123ab6423f2020-02-19 10:03:05 +05302361 By default, all keys must be present in a TypedDict. It is possible
2362 to override this by specifying totality.
2363 Usage::
2364
2365 class point2D(TypedDict, total=False):
2366 x: int
2367 y: int
2368
2369 This means that a point2D TypedDict can have any of the keys omitted.A type
2370 checker is only expected to support a literal False or True as the value of
2371 the total argument. True is the default, and makes all items defined in the
2372 class body be required.
2373
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002374 The class syntax is only supported in Python 3.6+, while two other
2375 syntax forms work for Python 2.7 and 3.2+
2376 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002377 if fields is None:
2378 fields = kwargs
2379 elif kwargs:
2380 raise TypeError("TypedDict takes either a dict or keyword arguments,"
2381 " but not both")
2382
Alex Grönholm67b769f2020-12-10 23:49:05 +02002383 ns = {'__annotations__': dict(fields)}
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002384 try:
2385 # Setting correct module is necessary to make typed dict classes pickleable.
2386 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
2387 except (AttributeError, ValueError):
2388 pass
2389
Alex Grönholm67b769f2020-12-10 23:49:05 +02002390 return _TypedDictMeta(typename, (), ns, total=total)
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002391
2392_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
2393TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002394
2395
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002396class NewType:
Guido van Rossum91185fe2016-06-08 11:19:11 -07002397 """NewType creates simple unique types with almost zero
2398 runtime overhead. NewType(name, tp) is considered a subtype of tp
2399 by static type checkers. At runtime, NewType(name, tp) returns
2400 a dummy function that simply returns its argument. Usage::
2401
2402 UserId = NewType('UserId', int)
2403
2404 def name_by_id(user_id: UserId) -> str:
2405 ...
2406
2407 UserId('user') # Fails type check
2408
2409 name_by_id(42) # Fails type check
2410 name_by_id(UserId(42)) # OK
2411
2412 num = UserId(5) + 1 # type: int
2413 """
2414
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002415 def __init__(self, name, tp):
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002416 self.__qualname__ = name
Łukasz Langa05f5d8e2021-07-24 12:07:56 +02002417 if '.' in name:
2418 name = name.rpartition('.')[-1]
2419 self.__name__ = name
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002420 self.__supertype__ = tp
Miss Islington (bot)56122b02021-07-30 06:48:01 -07002421 def_mod = _caller()
2422 if def_mod != 'typing':
2423 self.__module__ = def_mod
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002424
2425 def __repr__(self):
2426 return f'{self.__module__}.{self.__qualname__}'
2427
2428 def __call__(self, x):
Guido van Rossum91185fe2016-06-08 11:19:11 -07002429 return x
2430
Łukasz Langa05f5d8e2021-07-24 12:07:56 +02002431 def __reduce__(self):
2432 return self.__qualname__
2433
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002434 def __or__(self, other):
2435 return Union[self, other]
2436
2437 def __ror__(self, other):
2438 return Union[other, self]
Guido van Rossum91185fe2016-06-08 11:19:11 -07002439
2440
Guido van Rossum0e0563c2016-04-05 14:54:25 -07002441# Python-version-specific alias (Python 2: unicode; Python 3: str)
2442Text = str
2443
2444
Guido van Rossum91185fe2016-06-08 11:19:11 -07002445# Constant that's True when type checking, but False here.
2446TYPE_CHECKING = False
2447
2448
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002449class IO(Generic[AnyStr]):
2450 """Generic base class for TextIO and BinaryIO.
2451
2452 This is an abstract, generic version of the return of open().
2453
2454 NOTE: This does not distinguish between the different possible
2455 classes (text vs. binary, read vs. write vs. read/write,
2456 append-only, unbuffered). The TextIO and BinaryIO subclasses
2457 below capture the distinctions between text vs. binary, which is
2458 pervasive in the interface; however we currently do not offer a
2459 way to track the other distinctions in the type system.
2460 """
2461
Guido van Rossumd70fe632015-08-05 12:11:06 +02002462 __slots__ = ()
2463
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002464 @property
2465 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002466 def mode(self) -> str:
2467 pass
2468
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002469 @property
2470 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002471 def name(self) -> str:
2472 pass
2473
2474 @abstractmethod
2475 def close(self) -> None:
2476 pass
2477
Shantanu2e6569b2020-01-29 18:52:36 -08002478 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002479 @abstractmethod
2480 def closed(self) -> bool:
2481 pass
2482
2483 @abstractmethod
2484 def fileno(self) -> int:
2485 pass
2486
2487 @abstractmethod
2488 def flush(self) -> None:
2489 pass
2490
2491 @abstractmethod
2492 def isatty(self) -> bool:
2493 pass
2494
2495 @abstractmethod
2496 def read(self, n: int = -1) -> AnyStr:
2497 pass
2498
2499 @abstractmethod
2500 def readable(self) -> bool:
2501 pass
2502
2503 @abstractmethod
2504 def readline(self, limit: int = -1) -> AnyStr:
2505 pass
2506
2507 @abstractmethod
2508 def readlines(self, hint: int = -1) -> List[AnyStr]:
2509 pass
2510
2511 @abstractmethod
2512 def seek(self, offset: int, whence: int = 0) -> int:
2513 pass
2514
2515 @abstractmethod
2516 def seekable(self) -> bool:
2517 pass
2518
2519 @abstractmethod
2520 def tell(self) -> int:
2521 pass
2522
2523 @abstractmethod
2524 def truncate(self, size: int = None) -> int:
2525 pass
2526
2527 @abstractmethod
2528 def writable(self) -> bool:
2529 pass
2530
2531 @abstractmethod
2532 def write(self, s: AnyStr) -> int:
2533 pass
2534
2535 @abstractmethod
2536 def writelines(self, lines: List[AnyStr]) -> None:
2537 pass
2538
2539 @abstractmethod
2540 def __enter__(self) -> 'IO[AnyStr]':
2541 pass
2542
2543 @abstractmethod
2544 def __exit__(self, type, value, traceback) -> None:
2545 pass
2546
2547
2548class BinaryIO(IO[bytes]):
2549 """Typed version of the return of open() in binary mode."""
2550
Guido van Rossumd70fe632015-08-05 12:11:06 +02002551 __slots__ = ()
2552
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002553 @abstractmethod
2554 def write(self, s: Union[bytes, bytearray]) -> int:
2555 pass
2556
2557 @abstractmethod
2558 def __enter__(self) -> 'BinaryIO':
2559 pass
2560
2561
2562class TextIO(IO[str]):
2563 """Typed version of the return of open() in text mode."""
2564
Guido van Rossumd70fe632015-08-05 12:11:06 +02002565 __slots__ = ()
2566
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002567 @property
2568 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002569 def buffer(self) -> BinaryIO:
2570 pass
2571
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002572 @property
2573 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002574 def encoding(self) -> str:
2575 pass
2576
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002577 @property
2578 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002579 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002580 pass
2581
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002582 @property
2583 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002584 def line_buffering(self) -> bool:
2585 pass
2586
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002587 @property
2588 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002589 def newlines(self) -> Any:
2590 pass
2591
2592 @abstractmethod
2593 def __enter__(self) -> 'TextIO':
2594 pass
2595
2596
2597class io:
2598 """Wrapper namespace for IO generic classes."""
2599
2600 __all__ = ['IO', 'TextIO', 'BinaryIO']
2601 IO = IO
2602 TextIO = TextIO
2603 BinaryIO = BinaryIO
2604
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002605
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002606io.__name__ = __name__ + '.io'
2607sys.modules[io.__name__] = io
2608
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002609Pattern = _alias(stdlib_re.Pattern, 1)
2610Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002611
2612class re:
2613 """Wrapper namespace for re type aliases."""
2614
2615 __all__ = ['Pattern', 'Match']
2616 Pattern = Pattern
2617 Match = Match
2618
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002619
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002620re.__name__ = __name__ + '.re'
2621sys.modules[re.__name__] = re