blob: 6d7ba330acabe079739853d8e8c8d08aeef29b34 [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)36a24972021-08-06 10:08:27 -0700456 return _GenericAlias(self, (item,), name="ClassVar")
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)36a24972021-08-06 10:08:27 -0700477 return _GenericAlias(self, (item,), name="Final")
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
516 if len(parameters) == 2 and type(None) in parameters:
517 name = "Optional"
518 else:
519 name = "Union"
520 return _UnionGenericAlias(self, parameters, name=name)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000521
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300522@_SpecialForm
523def Optional(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000524 """Optional type.
525
526 Optional[X] is equivalent to Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300527 """
528 arg = _type_check(parameters, f"{self} requires a single type.")
529 return Union[arg, type(None)]
Guido van Rossumb7dedc82016-10-29 12:44:29 -0700530
Yurii Karabasf03d3182020-11-17 04:23:19 +0200531@_LiteralSpecialForm
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300532def Literal(self, parameters):
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100533 """Special typing form to define literal types (a.k.a. value types).
534
535 This form can be used to indicate to type checkers that the corresponding
536 variable or function parameter has a value equivalent to the provided
537 literal (or one of several literals):
538
539 def validate_simple(data: Any) -> Literal[True]: # always returns True
540 ...
541
542 MODE = Literal['r', 'rb', 'w', 'wb']
543 def open_helper(file: str, mode: MODE) -> str:
544 ...
545
546 open_helper('/some/path', 'r') # Passes type check
547 open_helper('/other/path', 'typo') # Error in type checker
548
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300549 Literal[...] cannot be subclassed. At runtime, an arbitrary value
550 is allowed as type argument to Literal[...], but type checkers may
551 impose restrictions.
552 """
553 # There is no '_type_check' call because arguments to Literal[...] are
554 # values, not types.
Yurii Karabasf03d3182020-11-17 04:23:19 +0200555 if not isinstance(parameters, tuple):
556 parameters = (parameters,)
557
558 parameters = _flatten_literal_params(parameters)
559
560 try:
561 parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
562 except TypeError: # unhashable parameters
563 pass
564
Miss Islington (bot)36a24972021-08-06 10:08:27 -0700565 return _LiteralGenericAlias(self, parameters, name="Literal")
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100566
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700567
Mikhail Golubev4f3c2502020-10-08 00:44:31 +0300568@_SpecialForm
569def TypeAlias(self, parameters):
570 """Special marker indicating that an assignment should
571 be recognized as a proper type alias definition by type
572 checkers.
573
574 For example::
575
576 Predicate: TypeAlias = Callable[..., bool]
577
578 It's invalid when used anywhere except as in the example above.
579 """
580 raise TypeError(f"{self} is not subscriptable")
581
582
kj73607be2020-12-24 12:33:48 +0800583@_SpecialForm
584def Concatenate(self, parameters):
Ken Jin11276cd2021-01-02 08:45:50 +0800585 """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a
586 higher order function which adds, removes or transforms parameters of a
587 callable.
kj73607be2020-12-24 12:33:48 +0800588
589 For example::
590
591 Callable[Concatenate[int, P], int]
592
593 See PEP 612 for detailed information.
594 """
595 if parameters == ():
596 raise TypeError("Cannot take a Concatenate of no types.")
597 if not isinstance(parameters, tuple):
598 parameters = (parameters,)
599 if not isinstance(parameters[-1], ParamSpec):
600 raise TypeError("The last parameter to Concatenate should be a "
601 "ParamSpec variable.")
602 msg = "Concatenate[arg, ...]: each arg must be a type."
603 parameters = tuple(_type_check(p, msg) for p in parameters)
Miss Islington (bot)36a24972021-08-06 10:08:27 -0700604 return _ConcatenateGenericAlias(self, parameters, name="Concatenate")
kj73607be2020-12-24 12:33:48 +0800605
606
Ken Jin05ab4b62021-04-27 22:31:04 +0800607@_SpecialForm
608def TypeGuard(self, parameters):
609 """Special typing form used to annotate the return type of a user-defined
610 type guard function. ``TypeGuard`` only accepts a single type argument.
611 At runtime, functions marked this way should return a boolean.
612
613 ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static
614 type checkers to determine a more precise type of an expression within a
615 program's code flow. Usually type narrowing is done by analyzing
616 conditional code flow and applying the narrowing to a block of code. The
617 conditional expression here is sometimes referred to as a "type guard".
618
619 Sometimes it would be convenient to use a user-defined boolean function
620 as a type guard. Such a function should use ``TypeGuard[...]`` as its
621 return type to alert static type checkers to this intention.
622
623 Using ``-> TypeGuard`` tells the static type checker that for a given
624 function:
625
626 1. The return value is a boolean.
627 2. If the return value is ``True``, the type of its argument
628 is the type inside ``TypeGuard``.
629
630 For example::
631
632 def is_str(val: Union[str, float]):
633 # "isinstance" type guard
634 if isinstance(val, str):
635 # Type of ``val`` is narrowed to ``str``
636 ...
637 else:
638 # Else, type of ``val`` is narrowed to ``float``.
639 ...
640
641 Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower
642 form of ``TypeA`` (it can even be a wider form) and this may lead to
643 type-unsafe results. The main reason is to allow for things like
644 narrowing ``List[object]`` to ``List[str]`` even though the latter is not
645 a subtype of the former, since ``List`` is invariant. The responsibility of
646 writing type-safe type guards is left to the user.
647
648 ``TypeGuard`` also works with type variables. For more information, see
649 PEP 647 (User-Defined Type Guards).
650 """
651 item = _type_check(parameters, f'{self} accepts only single type.')
Miss Islington (bot)36a24972021-08-06 10:08:27 -0700652 return _GenericAlias(self, (item,), name="TypeGuard")
Ken Jin05ab4b62021-04-27 22:31:04 +0800653
654
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000655class ForwardRef(_Final, _root=True):
Guido van Rossumb24569a2016-11-20 18:01:29 -0800656 """Internal wrapper to hold a forward reference."""
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700657
Guido van Rossum4cefe742016-09-27 15:20:12 -0700658 __slots__ = ('__forward_arg__', '__forward_code__',
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400659 '__forward_evaluated__', '__forward_value__',
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700660 '__forward_is_argument__', '__forward_module__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700661
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700662 def __init__(self, arg, is_argument=True, module=None):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700663 if not isinstance(arg, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000664 raise TypeError(f"Forward reference must be a string -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700665 try:
666 code = compile(arg, '<string>', 'eval')
667 except SyntaxError:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000668 raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700669 self.__forward_arg__ = arg
670 self.__forward_code__ = code
671 self.__forward_evaluated__ = False
672 self.__forward_value__ = None
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400673 self.__forward_is_argument__ = is_argument
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700674 self.__forward_module__ = module
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700675
wyfo653f4202020-07-22 21:47:28 +0200676 def _evaluate(self, globalns, localns, recursive_guard):
677 if self.__forward_arg__ in recursive_guard:
678 return self
Guido van Rossumdad17902016-11-10 08:29:18 -0800679 if not self.__forward_evaluated__ or localns is not globalns:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700680 if globalns is None and localns is None:
681 globalns = localns = {}
682 elif globalns is None:
683 globalns = localns
684 elif localns is None:
685 localns = globalns
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700686 if self.__forward_module__ is not None:
687 globalns = getattr(
688 sys.modules.get(self.__forward_module__, None), '__dict__', globalns
689 )
wyfo653f4202020-07-22 21:47:28 +0200690 type_ =_type_check(
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700691 eval(self.__forward_code__, globalns, localns),
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400692 "Forward references must evaluate to types.",
wyfo653f4202020-07-22 21:47:28 +0200693 is_argument=self.__forward_is_argument__,
694 )
695 self.__forward_value__ = _eval_type(
696 type_, globalns, localns, recursive_guard | {self.__forward_arg__}
697 )
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700698 self.__forward_evaluated__ = True
699 return self.__forward_value__
700
Guido van Rossum4cefe742016-09-27 15:20:12 -0700701 def __eq__(self, other):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000702 if not isinstance(other, ForwardRef):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700703 return NotImplemented
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100704 if self.__forward_evaluated__ and other.__forward_evaluated__:
705 return (self.__forward_arg__ == other.__forward_arg__ and
706 self.__forward_value__ == other.__forward_value__)
707 return self.__forward_arg__ == other.__forward_arg__
Guido van Rossum4cefe742016-09-27 15:20:12 -0700708
709 def __hash__(self):
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100710 return hash(self.__forward_arg__)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700711
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700712 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000713 return f'ForwardRef({self.__forward_arg__!r})'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700714
kj73607be2020-12-24 12:33:48 +0800715class _TypeVarLike:
716 """Mixin for TypeVar-like types (TypeVar and ParamSpec)."""
717 def __init__(self, bound, covariant, contravariant):
718 """Used to setup TypeVars and ParamSpec's bound, covariant and
719 contravariant attributes.
720 """
721 if covariant and contravariant:
722 raise ValueError("Bivariant types are not supported.")
723 self.__covariant__ = bool(covariant)
724 self.__contravariant__ = bool(contravariant)
725 if bound:
726 self.__bound__ = _type_check(bound, "Bound must be a type.")
727 else:
728 self.__bound__ = None
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700729
kj73607be2020-12-24 12:33:48 +0800730 def __or__(self, right):
731 return Union[self, right]
732
Jelle Zijlstra90459192021-04-10 20:00:05 -0700733 def __ror__(self, left):
734 return Union[left, self]
kj73607be2020-12-24 12:33:48 +0800735
736 def __repr__(self):
737 if self.__covariant__:
738 prefix = '+'
739 elif self.__contravariant__:
740 prefix = '-'
741 else:
742 prefix = '~'
743 return prefix + self.__name__
744
745 def __reduce__(self):
746 return self.__name__
747
748
749class TypeVar( _Final, _Immutable, _TypeVarLike, _root=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700750 """Type variable.
751
752 Usage::
753
754 T = TypeVar('T') # Can be anything
755 A = TypeVar('A', str, bytes) # Must be str or bytes
756
757 Type variables exist primarily for the benefit of static type
758 checkers. They serve as the parameters for generic types as well
759 as for generic function definitions. See class Generic for more
760 information on generic types. Generic functions work as follows:
761
Guido van Rossumb24569a2016-11-20 18:01:29 -0800762 def repeat(x: T, n: int) -> List[T]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700763 '''Return a list containing n references to x.'''
764 return [x]*n
765
766 def longest(x: A, y: A) -> A:
767 '''Return the longest of two strings.'''
768 return x if len(x) >= len(y) else y
769
770 The latter example's signature is essentially the overloading
771 of (str, str) -> str and (bytes, bytes) -> bytes. Also note
772 that if the arguments are instances of some subclass of str,
773 the return type is still plain str.
774
Guido van Rossumb24569a2016-11-20 18:01:29 -0800775 At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700776
Guido van Rossumefa798d2016-08-23 11:01:50 -0700777 Type variables defined with covariant=True or contravariant=True
João D. Ferreira86bfed32018-07-07 16:41:20 +0100778 can be used to declare covariant or contravariant generic types.
Guido van Rossumefa798d2016-08-23 11:01:50 -0700779 See PEP 484 for more details. By default generic types are invariant
780 in all type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700781
782 Type variables can be introspected. e.g.:
783
784 T.__name__ == 'T'
785 T.__constraints__ == ()
786 T.__covariant__ == False
787 T.__contravariant__ = False
788 A.__constraints__ == (str, bytes)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100789
790 Note that only type variables defined in global scope can be pickled.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700791 """
792
Guido van Rossum4cefe742016-09-27 15:20:12 -0700793 __slots__ = ('__name__', '__bound__', '__constraints__',
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300794 '__covariant__', '__contravariant__', '__dict__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700795
796 def __init__(self, name, *constraints, bound=None,
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800797 covariant=False, contravariant=False):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700798 self.__name__ = name
kj73607be2020-12-24 12:33:48 +0800799 super().__init__(bound, covariant, contravariant)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700800 if constraints and bound is not None:
801 raise TypeError("Constraints cannot be combined with bound=...")
802 if constraints and len(constraints) == 1:
803 raise TypeError("A single constraint is not allowed")
804 msg = "TypeVar(name, constraint, ...): constraints must be types."
805 self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
HongWeipenga25a04f2020-04-21 04:01:53 +0800806 try:
807 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling
808 except (AttributeError, ValueError):
809 def_mod = None
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300810 if def_mod != 'typing':
811 self.__module__ = def_mod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700812
Maggie Moss1b4552c2020-09-09 13:23:24 -0700813
Jelle Zijlstra52243362021-04-10 19:57:05 -0700814class ParamSpecArgs(_Final, _Immutable, _root=True):
815 """The args for a ParamSpec object.
816
817 Given a ParamSpec object P, P.args is an instance of ParamSpecArgs.
818
819 ParamSpecArgs objects have a reference back to their ParamSpec:
820
821 P.args.__origin__ is P
822
823 This type is meant for runtime introspection and has no special meaning to
824 static type checkers.
825 """
826 def __init__(self, origin):
827 self.__origin__ = origin
828
829 def __repr__(self):
830 return f"{self.__origin__.__name__}.args"
831
832
833class ParamSpecKwargs(_Final, _Immutable, _root=True):
834 """The kwargs for a ParamSpec object.
835
836 Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs.
837
838 ParamSpecKwargs objects have a reference back to their ParamSpec:
839
840 P.kwargs.__origin__ is P
841
842 This type is meant for runtime introspection and has no special meaning to
843 static type checkers.
844 """
845 def __init__(self, origin):
846 self.__origin__ = origin
847
848 def __repr__(self):
849 return f"{self.__origin__.__name__}.kwargs"
850
851
kj73607be2020-12-24 12:33:48 +0800852class ParamSpec(_Final, _Immutable, _TypeVarLike, _root=True):
853 """Parameter specification variable.
Maggie Moss1b4552c2020-09-09 13:23:24 -0700854
kj73607be2020-12-24 12:33:48 +0800855 Usage::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700856
kj73607be2020-12-24 12:33:48 +0800857 P = ParamSpec('P')
858
859 Parameter specification variables exist primarily for the benefit of static
860 type checkers. They are used to forward the parameter types of one
Ken Jin11276cd2021-01-02 08:45:50 +0800861 callable to another callable, a pattern commonly found in higher order
862 functions and decorators. They are only valid when used in ``Concatenate``,
863 or s the first argument to ``Callable``, or as parameters for user-defined
864 Generics. See class Generic for more information on generic types. An
865 example for annotating a decorator::
kj73607be2020-12-24 12:33:48 +0800866
867 T = TypeVar('T')
868 P = ParamSpec('P')
869
870 def add_logging(f: Callable[P, T]) -> Callable[P, T]:
871 '''A type-safe decorator to add logging to a function.'''
872 def inner(*args: P.args, **kwargs: P.kwargs) -> T:
873 logging.info(f'{f.__name__} was called')
874 return f(*args, **kwargs)
875 return inner
876
877 @add_logging
878 def add_two(x: float, y: float) -> float:
879 '''Add two numbers together.'''
880 return x + y
881
882 Parameter specification variables defined with covariant=True or
883 contravariant=True can be used to declare covariant or contravariant
884 generic types. These keyword arguments are valid, but their actual semantics
885 are yet to be decided. See PEP 612 for details.
886
887 Parameter specification variables can be introspected. e.g.:
888
889 P.__name__ == 'T'
890 P.__bound__ == None
891 P.__covariant__ == False
892 P.__contravariant__ == False
893
894 Note that only parameter specification variables defined in global scope can
895 be pickled.
896 """
897
898 __slots__ = ('__name__', '__bound__', '__covariant__', '__contravariant__',
899 '__dict__')
900
Jelle Zijlstra52243362021-04-10 19:57:05 -0700901 @property
902 def args(self):
903 return ParamSpecArgs(self)
904
905 @property
906 def kwargs(self):
907 return ParamSpecKwargs(self)
kj73607be2020-12-24 12:33:48 +0800908
Ken Jinace008c2021-01-11 08:11:41 +0800909 def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
kj73607be2020-12-24 12:33:48 +0800910 self.__name__ = name
911 super().__init__(bound, covariant, contravariant)
912 try:
913 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
914 except (AttributeError, ValueError):
915 def_mod = None
916 if def_mod != 'typing':
917 self.__module__ = def_mod
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100918
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700919
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000920def _is_dunder(attr):
921 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800922
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300923class _BaseGenericAlias(_Final, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000924 """The central part of internal API.
925
926 This represents a generic version of type 'origin' with type arguments 'params'.
927 There are two kind of these aliases: user defined and special. The special ones
928 are wrappers around builtin collections and ABCs in collections.abc. These must
929 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
930 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700931 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300932 def __init__(self, origin, *, inst=True, name=None):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000933 self._inst = inst
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000934 self._name = name
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700935 self.__origin__ = origin
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000936 self.__slots__ = None # This is not documented.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300937
938 def __call__(self, *args, **kwargs):
939 if not self._inst:
940 raise TypeError(f"Type {self._name} cannot be instantiated; "
941 f"use {self.__origin__.__name__}() instead")
942 result = self.__origin__(*args, **kwargs)
943 try:
944 result.__orig_class__ = self
945 except AttributeError:
946 pass
947 return result
948
949 def __mro_entries__(self, bases):
950 res = []
951 if self.__origin__ not in bases:
952 res.append(self.__origin__)
953 i = bases.index(self)
954 for b in bases[i+1:]:
955 if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
956 break
957 else:
958 res.append(Generic)
959 return tuple(res)
960
961 def __getattr__(self, attr):
Miss Islington (bot)c895f2b2021-07-19 10:57:27 -0700962 if attr in {'__name__', '__qualname__'}:
963 return self._name
964
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300965 # We are careful for copy and pickle.
966 # Also for simplicity we just don't relay all dunder names
967 if '__origin__' in self.__dict__ and not _is_dunder(attr):
968 return getattr(self.__origin__, attr)
969 raise AttributeError(attr)
970
971 def __setattr__(self, attr, val):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700972 if _is_dunder(attr) or attr in {'_name', '_inst', '_nparams',
973 '_typevar_types', '_paramspec_tvars'}:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300974 super().__setattr__(attr, val)
975 else:
976 setattr(self.__origin__, attr, val)
977
978 def __instancecheck__(self, obj):
979 return self.__subclasscheck__(type(obj))
980
981 def __subclasscheck__(self, cls):
982 raise TypeError("Subscripted generics cannot be used with"
983 " class and instance checks")
984
985
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300986# Special typing constructs Union, Optional, Generic, Callable and Tuple
987# use three special attributes for internal bookkeeping of generic types:
988# * __parameters__ is a tuple of unique free type parameters of a generic
989# type, for example, Dict[T, T].__parameters__ == (T,);
990# * __origin__ keeps a reference to a type that was subscripted,
991# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
992# the type.
993# * __args__ is a tuple of all arguments used in subscripting,
994# e.g., Dict[T, int].__args__ == (T, int).
995
996
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300997class _GenericAlias(_BaseGenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700998 def __init__(self, origin, params, *, inst=True, name=None,
999 _typevar_types=TypeVar,
1000 _paramspec_tvars=False):
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001001 super().__init__(origin, inst=inst, name=name)
1002 if not isinstance(params, tuple):
1003 params = (params,)
1004 self.__args__ = tuple(... if a is _TypingEllipsis else
1005 () if a is _TypingEmpty else
1006 a for a in params)
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001007 self.__parameters__ = _collect_type_vars(params, typevar_types=_typevar_types)
1008 self._typevar_types = _typevar_types
1009 self._paramspec_tvars = _paramspec_tvars
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001010 if not name:
1011 self.__module__ = origin.__module__
1012
1013 def __eq__(self, other):
1014 if not isinstance(other, _GenericAlias):
1015 return NotImplemented
1016 return (self.__origin__ == other.__origin__
1017 and self.__args__ == other.__args__)
1018
1019 def __hash__(self):
1020 return hash((self.__origin__, self.__args__))
1021
Maggie Moss1b4552c2020-09-09 13:23:24 -07001022 def __or__(self, right):
1023 return Union[self, right]
1024
Serhiy Storchaka80844d12021-07-16 16:42:04 +03001025 def __ror__(self, left):
1026 return Union[left, self]
Maggie Moss1b4552c2020-09-09 13:23:24 -07001027
Guido van Rossum4cefe742016-09-27 15:20:12 -07001028 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001029 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001030 if self.__origin__ in (Generic, Protocol):
1031 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001032 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001033 if not isinstance(params, tuple):
1034 params = (params,)
kj73607be2020-12-24 12:33:48 +08001035 params = tuple(_type_convert(p) for p in params)
Miss Islington (bot)c8db2922021-08-02 00:08:24 -07001036 if (self._paramspec_tvars
1037 and any(isinstance(t, ParamSpec) for t in self.__parameters__)):
1038 params = _prepare_paramspec_params(self, params)
1039 else:
1040 _check_generic(self, params, len(self.__parameters__))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001041
1042 subst = dict(zip(self.__parameters__, params))
1043 new_args = []
1044 for arg in self.__args__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001045 if isinstance(arg, self._typevar_types):
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001046 if isinstance(arg, ParamSpec):
1047 arg = subst[arg]
1048 if not _is_param_expr(arg):
1049 raise TypeError(f"Expected a list of types, an ellipsis, "
1050 f"ParamSpec, or Concatenate. Got {arg}")
1051 else:
1052 arg = subst[arg]
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001053 elif isinstance(arg, (_GenericAlias, GenericAlias, types.UnionType)):
Serhiy Storchaka0122d482020-05-10 13:39:40 +03001054 subparams = arg.__parameters__
1055 if subparams:
1056 subargs = tuple(subst[x] for x in subparams)
1057 arg = arg[subargs]
kj73607be2020-12-24 12:33:48 +08001058 # Required to flatten out the args for CallableGenericAlias
1059 if self.__origin__ == collections.abc.Callable and isinstance(arg, tuple):
1060 new_args.extend(arg)
1061 else:
1062 new_args.append(arg)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001063 return self.copy_with(tuple(new_args))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001064
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001065 def copy_with(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001066 return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001067
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001068 def __repr__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001069 if self._name:
1070 name = 'typing.' + self._name
1071 else:
1072 name = _type_repr(self.__origin__)
1073 args = ", ".join([_type_repr(a) for a in self.__args__])
1074 return f'{name}[{args}]'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001075
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001076 def __reduce__(self):
1077 if self._name:
1078 origin = globals()[self._name]
1079 else:
1080 origin = self.__origin__
1081 args = tuple(self.__args__)
1082 if len(args) == 1 and not isinstance(args[0], tuple):
1083 args, = args
1084 return operator.getitem, (origin, args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001085
1086 def __mro_entries__(self, bases):
1087 if self._name: # generic version of an ABC or built-in class
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001088 return super().__mro_entries__(bases)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001089 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001090 if Protocol in bases:
1091 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001092 i = bases.index(self)
1093 for b in bases[i+1:]:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001094 if isinstance(b, _BaseGenericAlias) and b is not self:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001095 return ()
1096 return (self.__origin__,)
1097
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001098
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001099# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
1100# 1 for List and 2 for Dict. It may be -1 if variable number of
1101# parameters are accepted (needs custom __getitem__).
1102
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001103class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001104 def __init__(self, origin, nparams, *, inst=True, name=None):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001105 if name is None:
1106 name = origin.__name__
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001107 super().__init__(origin, inst=inst, name=name)
1108 self._nparams = nparams
Serhiy Storchaka2fbc57a2020-05-10 15:14:27 +03001109 if origin.__module__ == 'builtins':
1110 self.__doc__ = f'A generic version of {origin.__qualname__}.'
1111 else:
1112 self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001113
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001114 @_tp_cache
1115 def __getitem__(self, params):
1116 if not isinstance(params, tuple):
1117 params = (params,)
1118 msg = "Parameters to generic types must be types."
1119 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001120 _check_generic(self, params, self._nparams)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001121 return self.copy_with(params)
1122
1123 def copy_with(self, params):
1124 return _GenericAlias(self.__origin__, params,
1125 name=self._name, inst=self._inst)
1126
1127 def __repr__(self):
1128 return 'typing.' + self._name
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001129
1130 def __subclasscheck__(self, cls):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001131 if isinstance(cls, _SpecialGenericAlias):
1132 return issubclass(cls.__origin__, self.__origin__)
1133 if not isinstance(cls, _GenericAlias):
1134 return issubclass(cls, self.__origin__)
1135 return super().__subclasscheck__(cls)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001136
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001137 def __reduce__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001138 return self._name
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001139
Maggie Moss1b4552c2020-09-09 13:23:24 -07001140 def __or__(self, right):
1141 return Union[self, right]
1142
Serhiy Storchaka80844d12021-07-16 16:42:04 +03001143 def __ror__(self, left):
1144 return Union[left, self]
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001145
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001146class _CallableGenericAlias(_GenericAlias, _root=True):
1147 def __repr__(self):
1148 assert self._name == 'Callable'
kj73607be2020-12-24 12:33:48 +08001149 args = self.__args__
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001150 if len(args) == 2 and _is_param_expr(args[0]):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001151 return super().__repr__()
1152 return (f'typing.Callable'
kj73607be2020-12-24 12:33:48 +08001153 f'[[{", ".join([_type_repr(a) for a in args[:-1]])}], '
1154 f'{_type_repr(args[-1])}]')
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001155
1156 def __reduce__(self):
1157 args = self.__args__
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001158 if not (len(args) == 2 and _is_param_expr(args[0])):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001159 args = list(args[:-1]), args[-1]
1160 return operator.getitem, (Callable, args)
1161
1162
1163class _CallableType(_SpecialGenericAlias, _root=True):
1164 def copy_with(self, params):
1165 return _CallableGenericAlias(self.__origin__, params,
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001166 name=self._name, inst=self._inst,
1167 _typevar_types=(TypeVar, ParamSpec),
1168 _paramspec_tvars=True)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001169
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001170 def __getitem__(self, params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001171 if not isinstance(params, tuple) or len(params) != 2:
1172 raise TypeError("Callable must be used as "
1173 "Callable[[arg, ...], result].")
1174 args, result = params
kj463c7d32020-12-14 02:38:24 +08001175 # This relaxes what args can be on purpose to allow things like
1176 # PEP 612 ParamSpec. Responsibility for whether a user is using
1177 # Callable[...] properly is deferred to static type checkers.
1178 if isinstance(args, list):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001179 params = (tuple(args), result)
kj463c7d32020-12-14 02:38:24 +08001180 else:
1181 params = (args, result)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001182 return self.__getitem_inner__(params)
1183
1184 @_tp_cache
1185 def __getitem_inner__(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001186 args, result = params
1187 msg = "Callable[args, result]: result must be a type."
1188 result = _type_check(result, msg)
1189 if args is Ellipsis:
1190 return self.copy_with((_TypingEllipsis, result))
kj463c7d32020-12-14 02:38:24 +08001191 if not isinstance(args, tuple):
1192 args = (args,)
1193 args = tuple(_type_convert(arg) for arg in args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001194 params = args + (result,)
1195 return self.copy_with(params)
1196
1197
1198class _TupleType(_SpecialGenericAlias, _root=True):
1199 @_tp_cache
1200 def __getitem__(self, params):
1201 if params == ():
1202 return self.copy_with((_TypingEmpty,))
1203 if not isinstance(params, tuple):
1204 params = (params,)
1205 if len(params) == 2 and params[1] is ...:
1206 msg = "Tuple[t, ...]: t must be a type."
1207 p = _type_check(params[0], msg)
1208 return self.copy_with((p, _TypingEllipsis))
1209 msg = "Tuple[t0, t1, ...]: each t must be a type."
1210 params = tuple(_type_check(p, msg) for p in params)
1211 return self.copy_with(params)
1212
1213
1214class _UnionGenericAlias(_GenericAlias, _root=True):
1215 def copy_with(self, params):
1216 return Union[params]
1217
1218 def __eq__(self, other):
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001219 if not isinstance(other, (_UnionGenericAlias, types.UnionType)):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001220 return NotImplemented
1221 return set(self.__args__) == set(other.__args__)
1222
1223 def __hash__(self):
1224 return hash(frozenset(self.__args__))
1225
1226 def __repr__(self):
1227 args = self.__args__
1228 if len(args) == 2:
1229 if args[0] is type(None):
1230 return f'typing.Optional[{_type_repr(args[1])}]'
1231 elif args[1] is type(None):
1232 return f'typing.Optional[{_type_repr(args[0])}]'
1233 return super().__repr__()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001234
Maggie Moss1b4552c2020-09-09 13:23:24 -07001235 def __instancecheck__(self, obj):
1236 return self.__subclasscheck__(type(obj))
1237
1238 def __subclasscheck__(self, cls):
1239 for arg in self.__args__:
1240 if issubclass(cls, arg):
1241 return True
1242
Miss Islington (bot)36a24972021-08-06 10:08:27 -07001243 def __reduce__(self):
1244 func, (origin, args) = super().__reduce__()
1245 return func, (Union, args)
1246
Maggie Moss1b4552c2020-09-09 13:23:24 -07001247
Yurii Karabasf03d3182020-11-17 04:23:19 +02001248def _value_and_type_iter(parameters):
1249 return ((p, type(p)) for p in parameters)
1250
1251
1252class _LiteralGenericAlias(_GenericAlias, _root=True):
1253
1254 def __eq__(self, other):
1255 if not isinstance(other, _LiteralGenericAlias):
1256 return NotImplemented
1257
1258 return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__))
1259
1260 def __hash__(self):
Yurii Karabas1b540772020-11-19 18:17:38 +02001261 return hash(frozenset(_value_and_type_iter(self.__args__)))
Yurii Karabasf03d3182020-11-17 04:23:19 +02001262
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001263
kj73607be2020-12-24 12:33:48 +08001264class _ConcatenateGenericAlias(_GenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001265 def __init__(self, *args, **kwargs):
1266 super().__init__(*args, **kwargs,
1267 _typevar_types=(TypeVar, ParamSpec),
1268 _paramspec_tvars=True)
kj73607be2020-12-24 12:33:48 +08001269
1270
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001271class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001272 """Abstract base class for generic types.
1273
Guido van Rossumb24569a2016-11-20 18:01:29 -08001274 A generic type is typically declared by inheriting from
1275 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001276 For example, a generic mapping type might be defined as::
1277
1278 class Mapping(Generic[KT, VT]):
1279 def __getitem__(self, key: KT) -> VT:
1280 ...
1281 # Etc.
1282
1283 This class can then be used as follows::
1284
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001285 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001286 try:
1287 return mapping[key]
1288 except KeyError:
1289 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001290 """
Guido van Rossumd70fe632015-08-05 12:11:06 +02001291 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001292 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +02001293
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001294 @_tp_cache
1295 def __class_getitem__(cls, params):
1296 if not isinstance(params, tuple):
1297 params = (params,)
1298 if not params and cls is not Tuple:
1299 raise TypeError(
1300 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
kj73607be2020-12-24 12:33:48 +08001301 params = tuple(_type_convert(p) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001302 if cls in (Generic, Protocol):
1303 # Generic and Protocol can only be subscripted with unique type variables.
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001304 if not all(isinstance(p, (TypeVar, ParamSpec)) for p in params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001305 raise TypeError(
kj73607be2020-12-24 12:33:48 +08001306 f"Parameters to {cls.__name__}[...] must all be type variables "
1307 f"or parameter specification variables.")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001308 if len(set(params)) != len(params):
1309 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001310 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001311 else:
1312 # Subscripting a regular Generic subclass.
kj73607be2020-12-24 12:33:48 +08001313 if any(isinstance(t, ParamSpec) for t in cls.__parameters__):
1314 params = _prepare_paramspec_params(cls, params)
Miss Islington (bot)c8db2922021-08-02 00:08:24 -07001315 else:
1316 _check_generic(cls, params, len(cls.__parameters__))
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001317 return _GenericAlias(cls, params,
1318 _typevar_types=(TypeVar, ParamSpec),
1319 _paramspec_tvars=True)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001320
1321 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +01001322 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001323 tvars = []
1324 if '__orig_bases__' in cls.__dict__:
1325 error = Generic in cls.__orig_bases__
1326 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001327 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001328 if error:
1329 raise TypeError("Cannot inherit from plain Generic")
1330 if '__orig_bases__' in cls.__dict__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001331 tvars = _collect_type_vars(cls.__orig_bases__, (TypeVar, ParamSpec))
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001332 # Look for Generic[T1, ..., Tn].
1333 # If found, tvars must be a subset of it.
1334 # If not found, tvars is it.
1335 # Also check for and reject plain Generic,
1336 # and reject multiple Generic[...].
1337 gvars = None
1338 for base in cls.__orig_bases__:
1339 if (isinstance(base, _GenericAlias) and
1340 base.__origin__ is Generic):
1341 if gvars is not None:
1342 raise TypeError(
1343 "Cannot inherit from Generic[...] multiple types.")
1344 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001345 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001346 tvarset = set(tvars)
1347 gvarset = set(gvars)
1348 if not tvarset <= gvarset:
1349 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
1350 s_args = ', '.join(str(g) for g in gvars)
1351 raise TypeError(f"Some type variables ({s_vars}) are"
1352 f" not listed in Generic[{s_args}]")
1353 tvars = gvars
1354 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001355
1356
1357class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001358 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
1359 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001360 to sneak in where prohibited.
1361 """
1362
1363
1364class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001365 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001366
1367
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001368_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
1369 '_is_protocol', '_is_runtime_protocol']
1370
1371_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
1372 '__init__', '__module__', '__new__', '__slots__',
Guido van Rossum48b069a2020-04-07 09:50:06 -07001373 '__subclasshook__', '__weakref__', '__class_getitem__']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001374
1375# These special attributes will be not collected as protocol members.
1376EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
1377
1378
1379def _get_protocol_attrs(cls):
1380 """Collect protocol members from a protocol class objects.
1381
1382 This includes names actually defined in the class dictionary, as well
1383 as names that appear in annotations. Special names (above) are skipped.
1384 """
1385 attrs = set()
1386 for base in cls.__mro__[:-1]: # without object
1387 if base.__name__ in ('Protocol', 'Generic'):
1388 continue
1389 annotations = getattr(base, '__annotations__', {})
1390 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
1391 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
1392 attrs.add(attr)
1393 return attrs
1394
1395
1396def _is_callable_members_only(cls):
1397 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
1398 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
1399
1400
1401def _no_init(self, *args, **kwargs):
Miss Islington (bot)2cc19a52021-08-02 10:08:59 -07001402 raise TypeError('Protocols cannot be instantiated')
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001403
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001404def _caller(depth=1, default='__main__'):
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001405 try:
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001406 return sys._getframe(depth + 1).f_globals.get('__name__', default)
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001407 except (AttributeError, ValueError): # For platforms without _getframe()
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001408 return None
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001409
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001410
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001411def _allow_reckless_class_checks(depth=3):
Nickolena Fishercfaf4c02020-04-26 12:49:11 -05001412 """Allow instance and class checks for special stdlib modules.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001413
1414 The abc and functools modules indiscriminately call isinstance() and
1415 issubclass() on the whole MRO of a user class, which may contain protocols.
1416 """
1417 try:
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001418 return sys._getframe(depth).f_globals['__name__'] in ['abc', 'functools']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001419 except (AttributeError, ValueError): # For platforms without _getframe().
1420 return True
1421
1422
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001423_PROTO_ALLOWLIST = {
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001424 'collections.abc': [
1425 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
1426 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
1427 ],
1428 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1429}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001430
1431
1432class _ProtocolMeta(ABCMeta):
1433 # This metaclass is really unfortunate and exists only because of
1434 # the lack of __instancehook__.
1435 def __instancecheck__(cls, instance):
1436 # We need this method for situations where attributes are
1437 # assigned in __init__.
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001438 if (
1439 getattr(cls, '_is_protocol', False) and
1440 not getattr(cls, '_is_runtime_protocol', False) and
1441 not _allow_reckless_class_checks(depth=2)
1442 ):
1443 raise TypeError("Instance and class checks can only be used with"
1444 " @runtime_checkable protocols")
1445
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001446 if ((not getattr(cls, '_is_protocol', False) or
1447 _is_callable_members_only(cls)) and
1448 issubclass(instance.__class__, cls)):
1449 return True
1450 if cls._is_protocol:
1451 if all(hasattr(instance, attr) and
1452 # All *methods* can be blocked by setting them to None.
1453 (not callable(getattr(cls, attr, None)) or
1454 getattr(instance, attr) is not None)
1455 for attr in _get_protocol_attrs(cls)):
1456 return True
1457 return super().__instancecheck__(instance)
1458
1459
1460class Protocol(Generic, metaclass=_ProtocolMeta):
1461 """Base class for protocol classes.
1462
1463 Protocol classes are defined as::
1464
1465 class Proto(Protocol):
1466 def meth(self) -> int:
1467 ...
1468
1469 Such classes are primarily used with static type checkers that recognize
1470 structural subtyping (static duck-typing), for example::
1471
1472 class C:
1473 def meth(self) -> int:
1474 return 0
1475
1476 def func(x: Proto) -> int:
1477 return x.meth()
1478
1479 func(C()) # Passes static type check
1480
1481 See PEP 544 for details. Protocol classes decorated with
1482 @typing.runtime_checkable act as simple-minded runtime protocols that check
1483 only the presence of given attributes, ignoring their type signatures.
1484 Protocol classes can be generic, they are defined as::
1485
1486 class GenProto(Protocol[T]):
1487 def meth(self) -> T:
1488 ...
1489 """
1490 __slots__ = ()
1491 _is_protocol = True
1492 _is_runtime_protocol = False
1493
1494 def __init_subclass__(cls, *args, **kwargs):
1495 super().__init_subclass__(*args, **kwargs)
1496
1497 # Determine if this is a protocol or a concrete subclass.
1498 if not cls.__dict__.get('_is_protocol', False):
1499 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1500
1501 # Set (or override) the protocol subclass hook.
1502 def _proto_hook(other):
1503 if not cls.__dict__.get('_is_protocol', False):
1504 return NotImplemented
1505
1506 # First, perform various sanity checks.
1507 if not getattr(cls, '_is_runtime_protocol', False):
Rossc1af1282020-12-29 11:55:28 +00001508 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001509 return NotImplemented
1510 raise TypeError("Instance and class checks can only be used with"
1511 " @runtime_checkable protocols")
1512 if not _is_callable_members_only(cls):
Rossc1af1282020-12-29 11:55:28 +00001513 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001514 return NotImplemented
1515 raise TypeError("Protocols with non-method members"
1516 " don't support issubclass()")
1517 if not isinstance(other, type):
1518 # Same error message as for issubclass(1, int).
1519 raise TypeError('issubclass() arg 1 must be a class')
1520
1521 # Second, perform the actual structural compatibility check.
1522 for attr in _get_protocol_attrs(cls):
1523 for base in other.__mro__:
1524 # Check if the members appears in the class dictionary...
1525 if attr in base.__dict__:
1526 if base.__dict__[attr] is None:
1527 return NotImplemented
1528 break
1529
1530 # ...or in annotations, if it is a sub-protocol.
1531 annotations = getattr(base, '__annotations__', {})
1532 if (isinstance(annotations, collections.abc.Mapping) and
1533 attr in annotations and
1534 issubclass(other, Generic) and other._is_protocol):
1535 break
1536 else:
1537 return NotImplemented
1538 return True
1539
1540 if '__subclasshook__' not in cls.__dict__:
1541 cls.__subclasshook__ = _proto_hook
1542
1543 # We have nothing more to do for non-protocols...
1544 if not cls._is_protocol:
Miss Islington (bot)2cc19a52021-08-02 10:08:59 -07001545 if cls.__init__ == _no_init:
1546 for base in cls.__mro__:
1547 init = base.__dict__.get('__init__', _no_init)
1548 if init != _no_init:
1549 cls.__init__ = init
1550 break
1551 else:
1552 # should not happen
1553 cls.__init__ = object.__init__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001554 return
1555
1556 # ... otherwise check consistency of bases, and prohibit instantiation.
1557 for base in cls.__bases__:
1558 if not (base in (object, Generic) or
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001559 base.__module__ in _PROTO_ALLOWLIST and
1560 base.__name__ in _PROTO_ALLOWLIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001561 issubclass(base, Generic) and base._is_protocol):
1562 raise TypeError('Protocols can only inherit from other'
1563 ' protocols, got %r' % base)
1564 cls.__init__ = _no_init
1565
1566
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001567class _AnnotatedAlias(_GenericAlias, _root=True):
1568 """Runtime representation of an annotated type.
1569
1570 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1571 with extra annotations. The alias behaves like a normal typing alias,
1572 instantiating is the same as instantiating the underlying type, binding
1573 it to types is also the same.
1574 """
1575 def __init__(self, origin, metadata):
1576 if isinstance(origin, _AnnotatedAlias):
1577 metadata = origin.__metadata__ + metadata
1578 origin = origin.__origin__
Miss Islington (bot)36a24972021-08-06 10:08:27 -07001579 super().__init__(origin, origin, name="Annotated")
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001580 self.__metadata__ = metadata
1581
1582 def copy_with(self, params):
1583 assert len(params) == 1
1584 new_type = params[0]
1585 return _AnnotatedAlias(new_type, self.__metadata__)
1586
1587 def __repr__(self):
1588 return "typing.Annotated[{}, {}]".format(
1589 _type_repr(self.__origin__),
1590 ", ".join(repr(a) for a in self.__metadata__)
1591 )
1592
1593 def __reduce__(self):
1594 return operator.getitem, (
1595 Annotated, (self.__origin__,) + self.__metadata__
1596 )
1597
1598 def __eq__(self, other):
1599 if not isinstance(other, _AnnotatedAlias):
1600 return NotImplemented
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001601 return (self.__origin__ == other.__origin__
1602 and self.__metadata__ == other.__metadata__)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001603
1604 def __hash__(self):
1605 return hash((self.__origin__, self.__metadata__))
1606
1607
1608class Annotated:
1609 """Add context specific metadata to a type.
1610
1611 Example: Annotated[int, runtime_check.Unsigned] indicates to the
1612 hypothetical runtime_check module that this type is an unsigned int.
1613 Every other consumer of this type can ignore this metadata and treat
1614 this type as int.
1615
1616 The first argument to Annotated must be a valid type.
1617
1618 Details:
1619
1620 - It's an error to call `Annotated` with less than two arguments.
1621 - Nested Annotated are flattened::
1622
1623 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1624
1625 - Instantiating an annotated type is equivalent to instantiating the
1626 underlying type::
1627
1628 Annotated[C, Ann1](5) == C(5)
1629
1630 - Annotated can be used as a generic type alias::
1631
1632 Optimized = Annotated[T, runtime.Optimize()]
1633 Optimized[int] == Annotated[int, runtime.Optimize()]
1634
1635 OptimizedList = Annotated[List[T], runtime.Optimize()]
1636 OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1637 """
1638
1639 __slots__ = ()
1640
1641 def __new__(cls, *args, **kwargs):
1642 raise TypeError("Type Annotated cannot be instantiated.")
1643
1644 @_tp_cache
1645 def __class_getitem__(cls, params):
1646 if not isinstance(params, tuple) or len(params) < 2:
1647 raise TypeError("Annotated[...] should be used "
1648 "with at least two arguments (a type and an "
1649 "annotation).")
1650 msg = "Annotated[t, ...]: t must be a type."
1651 origin = _type_check(params[0], msg)
1652 metadata = tuple(params[1:])
1653 return _AnnotatedAlias(origin, metadata)
1654
1655 def __init_subclass__(cls, *args, **kwargs):
1656 raise TypeError(
1657 "Cannot subclass {}.Annotated".format(cls.__module__)
1658 )
1659
1660
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001661def runtime_checkable(cls):
1662 """Mark a protocol class as a runtime protocol.
1663
1664 Such protocol can be used with isinstance() and issubclass().
1665 Raise TypeError if applied to a non-protocol class.
1666 This allows a simple-minded structural check very similar to
1667 one trick ponies in collections.abc such as Iterable.
1668 For example::
1669
1670 @runtime_checkable
1671 class Closable(Protocol):
1672 def close(self): ...
1673
1674 assert isinstance(open('/some/file'), Closable)
1675
1676 Warning: this will check only the presence of the required methods,
1677 not their type signatures!
1678 """
1679 if not issubclass(cls, Generic) or not cls._is_protocol:
1680 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1681 ' got %r' % cls)
1682 cls._is_runtime_protocol = True
1683 return cls
1684
1685
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001686def cast(typ, val):
1687 """Cast a value to a type.
1688
1689 This returns the value unchanged. To the type checker this
1690 signals that the return value has the designated type, but at
1691 runtime we intentionally don't check anything (we want this
1692 to be as fast as possible).
1693 """
1694 return val
1695
1696
1697def _get_defaults(func):
1698 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001699 try:
1700 code = func.__code__
1701 except AttributeError:
1702 # Some built-in functions don't have __code__, __defaults__, etc.
1703 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001704 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001705 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001706 arg_names = arg_names[:pos_count]
1707 defaults = func.__defaults__ or ()
1708 kwdefaults = func.__kwdefaults__
1709 res = dict(kwdefaults) if kwdefaults else {}
1710 pos_offset = pos_count - len(defaults)
1711 for name, value in zip(arg_names[pos_offset:], defaults):
1712 assert name not in res
1713 res[name] = value
1714 return res
1715
1716
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001717_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1718 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001719 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001720
1721
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001722def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001723 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001724
Guido van Rossum991d14f2016-11-09 13:12:51 -08001725 This is often the same as obj.__annotations__, but it handles
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001726 forward references encoded as string literals, adds Optional[t] if a
1727 default value equal to None is set and recursively replaces all
1728 'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001729
Guido van Rossum991d14f2016-11-09 13:12:51 -08001730 The argument may be a module, class, method, or function. The annotations
1731 are returned as a dictionary. For classes, annotations include also
1732 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001733
Guido van Rossum991d14f2016-11-09 13:12:51 -08001734 TypeError is raised if the argument is not of a type that can contain
1735 annotations, and an empty dictionary is returned if no annotations are
1736 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001737
Guido van Rossum991d14f2016-11-09 13:12:51 -08001738 BEWARE -- the behavior of globalns and localns is counterintuitive
1739 (unless you are familiar with how eval() and exec() work). The
1740 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001741
Guido van Rossum991d14f2016-11-09 13:12:51 -08001742 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001743 globals from obj (or the respective module's globals for classes),
1744 and these are also used as the locals. If the object does not appear
Ken Jin1b1f9852021-04-27 01:31:21 +08001745 to have globals, an empty dictionary is used. For classes, the search
1746 order is globals first then locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001747
Guido van Rossum991d14f2016-11-09 13:12:51 -08001748 - If one dict argument is passed, it is used for both globals and
1749 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001750
Guido van Rossum991d14f2016-11-09 13:12:51 -08001751 - If two dict arguments are passed, they specify globals and
1752 locals, respectively.
1753 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001754
Guido van Rossum991d14f2016-11-09 13:12:51 -08001755 if getattr(obj, '__no_type_check__', None):
1756 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001757 # Classes require a special treatment.
1758 if isinstance(obj, type):
1759 hints = {}
1760 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001761 if globalns is None:
Miss Islington (bot)3df23b52021-06-26 16:52:28 -07001762 base_globals = getattr(sys.modules.get(base.__module__, None), '__dict__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001763 else:
1764 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001765 ann = base.__dict__.get('__annotations__', {})
larryhastings2f2b6982021-04-29 20:09:08 -07001766 if isinstance(ann, types.GetSetDescriptorType):
1767 ann = {}
Ken Jin852150d2021-04-13 01:23:12 +08001768 base_locals = dict(vars(base)) if localns is None else localns
Ken Jin1b1f9852021-04-27 01:31:21 +08001769 if localns is None and globalns is None:
1770 # This is surprising, but required. Before Python 3.10,
1771 # get_type_hints only evaluated the globalns of
1772 # a class. To maintain backwards compatibility, we reverse
1773 # the globalns and localns order so that eval() looks into
1774 # *base_globals* first rather than *base_locals*.
1775 # This only affects ForwardRefs.
1776 base_globals, base_locals = base_locals, base_globals
Guido van Rossum991d14f2016-11-09 13:12:51 -08001777 for name, value in ann.items():
1778 if value is None:
1779 value = type(None)
1780 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001781 value = ForwardRef(value, is_argument=False)
Ken Jin852150d2021-04-13 01:23:12 +08001782 value = _eval_type(value, base_globals, base_locals)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001783 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001784 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001785
1786 if globalns is None:
1787 if isinstance(obj, types.ModuleType):
1788 globalns = obj.__dict__
1789 else:
benedwards140aca3a32019-11-21 17:24:58 +00001790 nsobj = obj
1791 # Find globalns for the unwrapped object.
1792 while hasattr(nsobj, '__wrapped__'):
1793 nsobj = nsobj.__wrapped__
1794 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001795 if localns is None:
1796 localns = globalns
1797 elif localns is None:
1798 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001799 hints = getattr(obj, '__annotations__', None)
1800 if hints is None:
1801 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001802 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001803 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001804 else:
1805 raise TypeError('{!r} is not a module, class, method, '
1806 'or function.'.format(obj))
1807 defaults = _get_defaults(obj)
1808 hints = dict(hints)
1809 for name, value in hints.items():
1810 if value is None:
1811 value = type(None)
1812 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001813 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001814 value = _eval_type(value, globalns, localns)
1815 if name in defaults and defaults[name] is None:
1816 value = Optional[value]
1817 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001818 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1819
1820
1821def _strip_annotations(t):
1822 """Strips the annotations from a given type.
1823 """
1824 if isinstance(t, _AnnotatedAlias):
1825 return _strip_annotations(t.__origin__)
1826 if isinstance(t, _GenericAlias):
1827 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1828 if stripped_args == t.__args__:
1829 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001830 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001831 if isinstance(t, GenericAlias):
1832 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1833 if stripped_args == t.__args__:
1834 return t
1835 return GenericAlias(t.__origin__, stripped_args)
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001836 if isinstance(t, types.UnionType):
Ken Jina2721642021-07-19 22:22:59 +08001837 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1838 if stripped_args == t.__args__:
1839 return t
Miss Islington (bot)0aea99e2021-07-24 12:35:33 -07001840 return functools.reduce(operator.or_, stripped_args)
Ken Jina2721642021-07-19 22:22:59 +08001841
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001842 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001843
1844
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001845def get_origin(tp):
1846 """Get the unsubscripted version of a type.
1847
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001848 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1849 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001850
1851 get_origin(Literal[42]) is Literal
1852 get_origin(int) is None
1853 get_origin(ClassVar[int]) is ClassVar
1854 get_origin(Generic) is Generic
1855 get_origin(Generic[T]) is Generic
1856 get_origin(Union[T, int]) is Union
1857 get_origin(List[Tuple[T, T]][int]) == list
Jelle Zijlstra52243362021-04-10 19:57:05 -07001858 get_origin(P.args) is P
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001859 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001860 if isinstance(tp, _AnnotatedAlias):
1861 return Annotated
Jelle Zijlstra52243362021-04-10 19:57:05 -07001862 if isinstance(tp, (_BaseGenericAlias, GenericAlias,
1863 ParamSpecArgs, ParamSpecKwargs)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001864 return tp.__origin__
1865 if tp is Generic:
1866 return Generic
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001867 if isinstance(tp, types.UnionType):
1868 return types.UnionType
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001869 return None
1870
1871
1872def get_args(tp):
1873 """Get type arguments with all substitutions performed.
1874
1875 For unions, basic simplifications used by Union constructor are performed.
1876 Examples::
1877 get_args(Dict[str, int]) == (str, int)
1878 get_args(int) == ()
1879 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1880 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1881 get_args(Callable[[], T][int]) == ([], int)
1882 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001883 if isinstance(tp, _AnnotatedAlias):
1884 return (tp.__origin__,) + tp.__metadata__
Ken Jin4140f102020-12-29 04:06:19 +08001885 if isinstance(tp, (_GenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001886 res = tp.__args__
Ken Jinefb1f092020-12-29 10:26:19 +08001887 if (tp.__origin__ is collections.abc.Callable
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001888 and not (len(res) == 2 and _is_param_expr(res[0]))):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001889 res = (list(res[:-1]), res[-1])
1890 return res
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001891 if isinstance(tp, types.UnionType):
Ken Jinefb1f092020-12-29 10:26:19 +08001892 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001893 return ()
1894
1895
Patrick Reader0705ec82020-09-16 05:58:32 +01001896def is_typeddict(tp):
1897 """Check if an annotation is a TypedDict class
1898
1899 For example::
1900 class Film(TypedDict):
1901 title: str
1902 year: int
1903
1904 is_typeddict(Film) # => True
1905 is_typeddict(Union[list, str]) # => False
1906 """
1907 return isinstance(tp, _TypedDictMeta)
1908
1909
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001910def no_type_check(arg):
1911 """Decorator to indicate that annotations are not type hints.
1912
1913 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001914 applies recursively to all methods and classes defined in that class
1915 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001916
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001917 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001918 """
1919 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001920 arg_attrs = arg.__dict__.copy()
1921 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001922 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001923 arg_attrs.pop(attr)
1924 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001925 if isinstance(obj, types.FunctionType):
1926 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001927 if isinstance(obj, type):
1928 no_type_check(obj)
1929 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001930 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001931 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001932 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001933 return arg
1934
1935
1936def no_type_check_decorator(decorator):
1937 """Decorator to give another decorator the @no_type_check effect.
1938
1939 This wraps the decorator with something that wraps the decorated
1940 function in @no_type_check.
1941 """
1942
1943 @functools.wraps(decorator)
1944 def wrapped_decorator(*args, **kwds):
1945 func = decorator(*args, **kwds)
1946 func = no_type_check(func)
1947 return func
1948
1949 return wrapped_decorator
1950
1951
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001952def _overload_dummy(*args, **kwds):
1953 """Helper for @overload to raise when called."""
1954 raise NotImplementedError(
1955 "You should not call an overloaded function. "
1956 "A series of @overload-decorated functions "
1957 "outside a stub module should always be followed "
1958 "by an implementation that is not @overload-ed.")
1959
1960
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001961def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001962 """Decorator for overloaded functions/methods.
1963
1964 In a stub file, place two or more stub definitions for the same
1965 function in a row, each decorated with @overload. For example:
1966
1967 @overload
1968 def utf8(value: None) -> None: ...
1969 @overload
1970 def utf8(value: bytes) -> bytes: ...
1971 @overload
1972 def utf8(value: str) -> bytes: ...
1973
1974 In a non-stub file (i.e. a regular .py file), do the same but
1975 follow it with an implementation. The implementation should *not*
1976 be decorated with @overload. For example:
1977
1978 @overload
1979 def utf8(value: None) -> None: ...
1980 @overload
1981 def utf8(value: bytes) -> bytes: ...
1982 @overload
1983 def utf8(value: str) -> bytes: ...
1984 def utf8(value):
1985 # implementation goes here
1986 """
1987 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001988
1989
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001990def final(f):
1991 """A decorator to indicate final methods and final classes.
1992
1993 Use this decorator to indicate to type checkers that the decorated
1994 method cannot be overridden, and decorated class cannot be subclassed.
1995 For example:
1996
1997 class Base:
1998 @final
1999 def done(self) -> None:
2000 ...
2001 class Sub(Base):
2002 def done(self) -> None: # Error reported by type checker
2003 ...
2004
2005 @final
2006 class Leaf:
2007 ...
2008 class Other(Leaf): # Error reported by type checker
2009 ...
2010
2011 There is no runtime checking of these properties.
2012 """
2013 return f
2014
2015
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002016# Some unconstrained type variables. These are used by the container types.
2017# (These are not for export.)
2018T = TypeVar('T') # Any type.
2019KT = TypeVar('KT') # Key type.
2020VT = TypeVar('VT') # Value type.
2021T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
2022V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
2023VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
2024T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
2025# Internal type variable used for Type[].
2026CT_co = TypeVar('CT_co', covariant=True, bound=type)
2027
2028# A useful type variable with constraints. This represents string types.
2029# (This one *is* for export!)
2030AnyStr = TypeVar('AnyStr', bytes, str)
2031
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002032
2033# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03002034_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002035
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002036Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
2037Awaitable = _alias(collections.abc.Awaitable, 1)
2038Coroutine = _alias(collections.abc.Coroutine, 3)
2039AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
2040AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
2041Iterable = _alias(collections.abc.Iterable, 1)
2042Iterator = _alias(collections.abc.Iterator, 1)
2043Reversible = _alias(collections.abc.Reversible, 1)
2044Sized = _alias(collections.abc.Sized, 0) # Not generic.
2045Container = _alias(collections.abc.Container, 1)
2046Collection = _alias(collections.abc.Collection, 1)
2047Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002048Callable.__doc__ = \
2049 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002050
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002051 The subscription syntax must always be used with exactly two
2052 values: the argument list and the return type. The argument list
2053 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002054
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002055 There is no syntax to indicate optional or keyword arguments,
2056 such function types are rarely used as callback types.
2057 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002058AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
2059MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002060# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002061Mapping = _alias(collections.abc.Mapping, 2)
2062MutableMapping = _alias(collections.abc.MutableMapping, 2)
2063Sequence = _alias(collections.abc.Sequence, 1)
2064MutableSequence = _alias(collections.abc.MutableSequence, 1)
2065ByteString = _alias(collections.abc.ByteString, 0) # Not generic
2066# Tuple accepts variable number of parameters.
2067Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002068Tuple.__doc__ = \
2069 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002070
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002071 Example: Tuple[T1, T2] is a tuple of two elements corresponding
2072 to type variables T1 and T2. Tuple[int, float, str] is a tuple
2073 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002074
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002075 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
2076 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002077List = _alias(list, 1, inst=False, name='List')
2078Deque = _alias(collections.deque, 1, name='Deque')
2079Set = _alias(set, 1, inst=False, name='Set')
2080FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
2081MappingView = _alias(collections.abc.MappingView, 1)
2082KeysView = _alias(collections.abc.KeysView, 1)
2083ItemsView = _alias(collections.abc.ItemsView, 2)
2084ValuesView = _alias(collections.abc.ValuesView, 1)
2085ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
2086AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
2087Dict = _alias(dict, 2, inst=False, name='Dict')
2088DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
2089OrderedDict = _alias(collections.OrderedDict, 2)
2090Counter = _alias(collections.Counter, 1)
2091ChainMap = _alias(collections.ChainMap, 2)
2092Generator = _alias(collections.abc.Generator, 3)
2093AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
2094Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002095Type.__doc__ = \
2096 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002097
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002098 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002099
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002100 class User: ... # Abstract base for User classes
2101 class BasicUser(User): ...
2102 class ProUser(User): ...
2103 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08002104
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002105 And a function that takes a class argument that's a subclass of
2106 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08002107
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002108 U = TypeVar('U', bound=User)
2109 def new_user(user_class: Type[U]) -> U:
2110 user = user_class()
2111 # (Here we could write the user object to a database)
2112 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08002113
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002114 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08002115
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002116 At this point the type checker knows that joe has type BasicUser.
2117 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002118
2119
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002120@runtime_checkable
2121class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002122 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002123 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002124
2125 @abstractmethod
2126 def __int__(self) -> int:
2127 pass
2128
2129
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002130@runtime_checkable
2131class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002132 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002133 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002134
2135 @abstractmethod
2136 def __float__(self) -> float:
2137 pass
2138
2139
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002140@runtime_checkable
2141class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002142 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002143 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002144
2145 @abstractmethod
2146 def __complex__(self) -> complex:
2147 pass
2148
2149
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002150@runtime_checkable
2151class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002152 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002153 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002154
2155 @abstractmethod
2156 def __bytes__(self) -> bytes:
2157 pass
2158
2159
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002160@runtime_checkable
2161class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002162 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07002163 __slots__ = ()
2164
2165 @abstractmethod
2166 def __index__(self) -> int:
2167 pass
2168
2169
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002170@runtime_checkable
2171class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002172 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002173 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002174
2175 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002176 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002177 pass
2178
2179
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002180@runtime_checkable
2181class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002182 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002183 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002184
2185 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002186 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002187 pass
2188
2189
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002190def _make_nmtuple(name, types, module, defaults = ()):
2191 fields = [n for n, t in types]
2192 types = {n: _type_check(t, f"field {n} annotation must be a type")
2193 for n, t in types}
2194 nm_tpl = collections.namedtuple(name, fields,
2195 defaults=defaults, module=module)
2196 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002197 return nm_tpl
2198
2199
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002200# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002201_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
2202 '_fields', '_field_defaults',
2203 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002204
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002205_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002206
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002207
Guido van Rossum2f841442016-11-15 09:48:06 -08002208class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002209
Guido van Rossum2f841442016-11-15 09:48:06 -08002210 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002211 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08002212 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002213 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08002214 for field_name in types:
2215 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002216 default_names.append(field_name)
2217 elif default_names:
2218 raise TypeError(f"Non-default namedtuple field {field_name} "
2219 f"cannot follow default field"
2220 f"{'s' if len(default_names) > 1 else ''} "
2221 f"{', '.join(default_names)}")
2222 nm_tpl = _make_nmtuple(typename, types.items(),
2223 defaults=[ns[n] for n in default_names],
2224 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08002225 # update from user namespace without overriding special namedtuple attributes
2226 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002227 if key in _prohibited:
2228 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
2229 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08002230 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08002231 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002232
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002233
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002234def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08002235 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002236
Guido van Rossum2f841442016-11-15 09:48:06 -08002237 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002238
Guido van Rossum2f841442016-11-15 09:48:06 -08002239 class Employee(NamedTuple):
2240 name: str
2241 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002242
Guido van Rossum2f841442016-11-15 09:48:06 -08002243 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002244
Guido van Rossum2f841442016-11-15 09:48:06 -08002245 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002246
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07002247 The resulting class has an extra __annotations__ attribute, giving a
2248 dict that maps field names to types. (The field names are also in
2249 the _fields attribute, which is part of the namedtuple API.)
2250 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002251
Guido van Rossum2f841442016-11-15 09:48:06 -08002252 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002253
Guido van Rossum2f841442016-11-15 09:48:06 -08002254 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002255
Guido van Rossum2f841442016-11-15 09:48:06 -08002256 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
2257 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002258 if fields is None:
2259 fields = kwargs.items()
2260 elif kwargs:
2261 raise TypeError("Either list of fields or keywords"
2262 " can be provided to NamedTuple, not both")
2263 try:
2264 module = sys._getframe(1).f_globals.get('__name__', '__main__')
2265 except (AttributeError, ValueError):
2266 module = None
2267 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002268
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002269_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
2270
2271def _namedtuple_mro_entries(bases):
2272 if len(bases) > 1:
2273 raise TypeError("Multiple inheritance with NamedTuple is not supported")
2274 assert bases[0] is NamedTuple
2275 return (_NamedTuple,)
2276
2277NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002278
2279
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002280class _TypedDictMeta(type):
2281 def __new__(cls, name, bases, ns, total=True):
2282 """Create new typed dict class object.
2283
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002284 This method is called when TypedDict is subclassed,
2285 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002286 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002287 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002288 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002289 for base in bases:
2290 if type(base) is not _TypedDictMeta:
2291 raise TypeError('cannot inherit from both a TypedDict type '
2292 'and a non-TypedDict base class')
2293 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002294
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002295 annotations = {}
2296 own_annotations = ns.get('__annotations__', {})
2297 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002298 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002299 own_annotations = {
Miss Islington (bot)480f29f2021-07-17 01:48:17 -07002300 n: _type_check(tp, msg, module=tp_dict.__module__)
2301 for n, tp in own_annotations.items()
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002302 }
2303 required_keys = set()
2304 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002305
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002306 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002307 annotations.update(base.__dict__.get('__annotations__', {}))
2308 required_keys.update(base.__dict__.get('__required_keys__', ()))
2309 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002310
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002311 annotations.update(own_annotations)
2312 if total:
2313 required_keys.update(own_annotation_keys)
2314 else:
2315 optional_keys.update(own_annotation_keys)
2316
2317 tp_dict.__annotations__ = annotations
2318 tp_dict.__required_keys__ = frozenset(required_keys)
2319 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002320 if not hasattr(tp_dict, '__total__'):
2321 tp_dict.__total__ = total
2322 return tp_dict
2323
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002324 __call__ = dict # static method
2325
2326 def __subclasscheck__(cls, other):
2327 # Typed dicts are only for static structural subtyping.
2328 raise TypeError('TypedDict does not support instance and class checks')
2329
2330 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002331
2332
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002333def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002334 """A simple typed namespace. At runtime it is equivalent to a plain dict.
2335
2336 TypedDict creates a dictionary type that expects all of its
2337 instances to have a certain set of keys, where each key is
2338 associated with a value of a consistent type. This expectation
2339 is not checked at runtime but is only enforced by type checkers.
2340 Usage::
2341
2342 class Point2D(TypedDict):
2343 x: int
2344 y: int
2345 label: str
2346
2347 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
2348 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
2349
2350 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
2351
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002352 The type info can be accessed via the Point2D.__annotations__ dict, and
2353 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
2354 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002355
2356 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
2357 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
2358
ananthan-123ab6423f2020-02-19 10:03:05 +05302359 By default, all keys must be present in a TypedDict. It is possible
2360 to override this by specifying totality.
2361 Usage::
2362
2363 class point2D(TypedDict, total=False):
2364 x: int
2365 y: int
2366
2367 This means that a point2D TypedDict can have any of the keys omitted.A type
2368 checker is only expected to support a literal False or True as the value of
2369 the total argument. True is the default, and makes all items defined in the
2370 class body be required.
2371
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002372 The class syntax is only supported in Python 3.6+, while two other
2373 syntax forms work for Python 2.7 and 3.2+
2374 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002375 if fields is None:
2376 fields = kwargs
2377 elif kwargs:
2378 raise TypeError("TypedDict takes either a dict or keyword arguments,"
2379 " but not both")
2380
Alex Grönholm67b769f2020-12-10 23:49:05 +02002381 ns = {'__annotations__': dict(fields)}
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002382 try:
2383 # Setting correct module is necessary to make typed dict classes pickleable.
2384 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
2385 except (AttributeError, ValueError):
2386 pass
2387
Alex Grönholm67b769f2020-12-10 23:49:05 +02002388 return _TypedDictMeta(typename, (), ns, total=total)
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002389
2390_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
2391TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002392
2393
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002394class NewType:
Guido van Rossum91185fe2016-06-08 11:19:11 -07002395 """NewType creates simple unique types with almost zero
2396 runtime overhead. NewType(name, tp) is considered a subtype of tp
2397 by static type checkers. At runtime, NewType(name, tp) returns
2398 a dummy function that simply returns its argument. Usage::
2399
2400 UserId = NewType('UserId', int)
2401
2402 def name_by_id(user_id: UserId) -> str:
2403 ...
2404
2405 UserId('user') # Fails type check
2406
2407 name_by_id(42) # Fails type check
2408 name_by_id(UserId(42)) # OK
2409
2410 num = UserId(5) + 1 # type: int
2411 """
2412
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002413 def __init__(self, name, tp):
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002414 self.__qualname__ = name
Łukasz Langa05f5d8e2021-07-24 12:07:56 +02002415 if '.' in name:
2416 name = name.rpartition('.')[-1]
2417 self.__name__ = name
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002418 self.__supertype__ = tp
Miss Islington (bot)56122b02021-07-30 06:48:01 -07002419 def_mod = _caller()
2420 if def_mod != 'typing':
2421 self.__module__ = def_mod
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002422
2423 def __repr__(self):
2424 return f'{self.__module__}.{self.__qualname__}'
2425
2426 def __call__(self, x):
Guido van Rossum91185fe2016-06-08 11:19:11 -07002427 return x
2428
Łukasz Langa05f5d8e2021-07-24 12:07:56 +02002429 def __reduce__(self):
2430 return self.__qualname__
2431
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002432 def __or__(self, other):
2433 return Union[self, other]
2434
2435 def __ror__(self, other):
2436 return Union[other, self]
Guido van Rossum91185fe2016-06-08 11:19:11 -07002437
2438
Guido van Rossum0e0563c2016-04-05 14:54:25 -07002439# Python-version-specific alias (Python 2: unicode; Python 3: str)
2440Text = str
2441
2442
Guido van Rossum91185fe2016-06-08 11:19:11 -07002443# Constant that's True when type checking, but False here.
2444TYPE_CHECKING = False
2445
2446
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002447class IO(Generic[AnyStr]):
2448 """Generic base class for TextIO and BinaryIO.
2449
2450 This is an abstract, generic version of the return of open().
2451
2452 NOTE: This does not distinguish between the different possible
2453 classes (text vs. binary, read vs. write vs. read/write,
2454 append-only, unbuffered). The TextIO and BinaryIO subclasses
2455 below capture the distinctions between text vs. binary, which is
2456 pervasive in the interface; however we currently do not offer a
2457 way to track the other distinctions in the type system.
2458 """
2459
Guido van Rossumd70fe632015-08-05 12:11:06 +02002460 __slots__ = ()
2461
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002462 @property
2463 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002464 def mode(self) -> str:
2465 pass
2466
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002467 @property
2468 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002469 def name(self) -> str:
2470 pass
2471
2472 @abstractmethod
2473 def close(self) -> None:
2474 pass
2475
Shantanu2e6569b2020-01-29 18:52:36 -08002476 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002477 @abstractmethod
2478 def closed(self) -> bool:
2479 pass
2480
2481 @abstractmethod
2482 def fileno(self) -> int:
2483 pass
2484
2485 @abstractmethod
2486 def flush(self) -> None:
2487 pass
2488
2489 @abstractmethod
2490 def isatty(self) -> bool:
2491 pass
2492
2493 @abstractmethod
2494 def read(self, n: int = -1) -> AnyStr:
2495 pass
2496
2497 @abstractmethod
2498 def readable(self) -> bool:
2499 pass
2500
2501 @abstractmethod
2502 def readline(self, limit: int = -1) -> AnyStr:
2503 pass
2504
2505 @abstractmethod
2506 def readlines(self, hint: int = -1) -> List[AnyStr]:
2507 pass
2508
2509 @abstractmethod
2510 def seek(self, offset: int, whence: int = 0) -> int:
2511 pass
2512
2513 @abstractmethod
2514 def seekable(self) -> bool:
2515 pass
2516
2517 @abstractmethod
2518 def tell(self) -> int:
2519 pass
2520
2521 @abstractmethod
2522 def truncate(self, size: int = None) -> int:
2523 pass
2524
2525 @abstractmethod
2526 def writable(self) -> bool:
2527 pass
2528
2529 @abstractmethod
2530 def write(self, s: AnyStr) -> int:
2531 pass
2532
2533 @abstractmethod
2534 def writelines(self, lines: List[AnyStr]) -> None:
2535 pass
2536
2537 @abstractmethod
2538 def __enter__(self) -> 'IO[AnyStr]':
2539 pass
2540
2541 @abstractmethod
2542 def __exit__(self, type, value, traceback) -> None:
2543 pass
2544
2545
2546class BinaryIO(IO[bytes]):
2547 """Typed version of the return of open() in binary mode."""
2548
Guido van Rossumd70fe632015-08-05 12:11:06 +02002549 __slots__ = ()
2550
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002551 @abstractmethod
2552 def write(self, s: Union[bytes, bytearray]) -> int:
2553 pass
2554
2555 @abstractmethod
2556 def __enter__(self) -> 'BinaryIO':
2557 pass
2558
2559
2560class TextIO(IO[str]):
2561 """Typed version of the return of open() in text mode."""
2562
Guido van Rossumd70fe632015-08-05 12:11:06 +02002563 __slots__ = ()
2564
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002565 @property
2566 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002567 def buffer(self) -> BinaryIO:
2568 pass
2569
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002570 @property
2571 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002572 def encoding(self) -> str:
2573 pass
2574
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002575 @property
2576 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002577 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002578 pass
2579
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002580 @property
2581 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002582 def line_buffering(self) -> bool:
2583 pass
2584
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002585 @property
2586 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002587 def newlines(self) -> Any:
2588 pass
2589
2590 @abstractmethod
2591 def __enter__(self) -> 'TextIO':
2592 pass
2593
2594
2595class io:
2596 """Wrapper namespace for IO generic classes."""
2597
2598 __all__ = ['IO', 'TextIO', 'BinaryIO']
2599 IO = IO
2600 TextIO = TextIO
2601 BinaryIO = BinaryIO
2602
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002603
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002604io.__name__ = __name__ + '.io'
2605sys.modules[io.__name__] = io
2606
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002607Pattern = _alias(stdlib_re.Pattern, 1)
2608Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002609
2610class re:
2611 """Wrapper namespace for re type aliases."""
2612
2613 __all__ = ['Pattern', 'Match']
2614 Pattern = Pattern
2615 Match = Match
2616
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002617
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002618re.__name__ = __name__ + '.re'
2619sys.modules[re.__name__] = re