blob: 3cbc8a42c2010a58a672c793a0956cc65419479d [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.')
456 return _GenericAlias(self, (item,))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000457
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300458@_SpecialForm
459def Final(self, parameters):
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100460 """Special typing construct to indicate final names to type checkers.
461
462 A final name cannot be re-assigned or overridden in a subclass.
463 For example:
464
465 MAX_SIZE: Final = 9000
466 MAX_SIZE += 1 # Error reported by type checker
467
468 class Connection:
469 TIMEOUT: Final[int] = 10
470
471 class FastConnector(Connection):
472 TIMEOUT = 1 # Error reported by type checker
473
474 There is no runtime checking of these properties.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300475 """
476 item = _type_check(parameters, f'{self} accepts only single type.')
477 return _GenericAlias(self, (item,))
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100478
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300479@_SpecialForm
480def Union(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000481 """Union type; Union[X, Y] means either X or Y.
482
483 To define a union, use e.g. Union[int, str]. Details:
484 - The arguments must be types and there must be at least one.
485 - None as an argument is a special case and is replaced by
486 type(None).
487 - Unions of unions are flattened, e.g.::
488
489 Union[Union[int, str], float] == Union[int, str, float]
490
491 - Unions of a single argument vanish, e.g.::
492
493 Union[int] == int # The constructor actually returns int
494
495 - Redundant arguments are skipped, e.g.::
496
497 Union[int, str, int] == Union[int, str]
498
499 - When comparing unions, the argument order is ignored, e.g.::
500
501 Union[int, str] == Union[str, int]
502
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000503 - You cannot subclass or instantiate a union.
504 - You can use Optional[X] as a shorthand for Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300505 """
506 if parameters == ():
507 raise TypeError("Cannot take a Union of no types.")
508 if not isinstance(parameters, tuple):
509 parameters = (parameters,)
510 msg = "Union[arg, ...]: each arg must be a type."
511 parameters = tuple(_type_check(p, msg) for p in parameters)
512 parameters = _remove_dups_flatten(parameters)
513 if len(parameters) == 1:
514 return parameters[0]
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300515 return _UnionGenericAlias(self, parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000516
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300517@_SpecialForm
518def Optional(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000519 """Optional type.
520
521 Optional[X] is equivalent to Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300522 """
523 arg = _type_check(parameters, f"{self} requires a single type.")
524 return Union[arg, type(None)]
Guido van Rossumb7dedc82016-10-29 12:44:29 -0700525
Yurii Karabasf03d3182020-11-17 04:23:19 +0200526@_LiteralSpecialForm
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300527def Literal(self, parameters):
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100528 """Special typing form to define literal types (a.k.a. value types).
529
530 This form can be used to indicate to type checkers that the corresponding
531 variable or function parameter has a value equivalent to the provided
532 literal (or one of several literals):
533
534 def validate_simple(data: Any) -> Literal[True]: # always returns True
535 ...
536
537 MODE = Literal['r', 'rb', 'w', 'wb']
538 def open_helper(file: str, mode: MODE) -> str:
539 ...
540
541 open_helper('/some/path', 'r') # Passes type check
542 open_helper('/other/path', 'typo') # Error in type checker
543
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300544 Literal[...] cannot be subclassed. At runtime, an arbitrary value
545 is allowed as type argument to Literal[...], but type checkers may
546 impose restrictions.
547 """
548 # There is no '_type_check' call because arguments to Literal[...] are
549 # values, not types.
Yurii Karabasf03d3182020-11-17 04:23:19 +0200550 if not isinstance(parameters, tuple):
551 parameters = (parameters,)
552
553 parameters = _flatten_literal_params(parameters)
554
555 try:
556 parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
557 except TypeError: # unhashable parameters
558 pass
559
560 return _LiteralGenericAlias(self, parameters)
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100561
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700562
Mikhail Golubev4f3c2502020-10-08 00:44:31 +0300563@_SpecialForm
564def TypeAlias(self, parameters):
565 """Special marker indicating that an assignment should
566 be recognized as a proper type alias definition by type
567 checkers.
568
569 For example::
570
571 Predicate: TypeAlias = Callable[..., bool]
572
573 It's invalid when used anywhere except as in the example above.
574 """
575 raise TypeError(f"{self} is not subscriptable")
576
577
kj73607be2020-12-24 12:33:48 +0800578@_SpecialForm
579def Concatenate(self, parameters):
Ken Jin11276cd2021-01-02 08:45:50 +0800580 """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a
581 higher order function which adds, removes or transforms parameters of a
582 callable.
kj73607be2020-12-24 12:33:48 +0800583
584 For example::
585
586 Callable[Concatenate[int, P], int]
587
588 See PEP 612 for detailed information.
589 """
590 if parameters == ():
591 raise TypeError("Cannot take a Concatenate of no types.")
592 if not isinstance(parameters, tuple):
593 parameters = (parameters,)
594 if not isinstance(parameters[-1], ParamSpec):
595 raise TypeError("The last parameter to Concatenate should be a "
596 "ParamSpec variable.")
597 msg = "Concatenate[arg, ...]: each arg must be a type."
598 parameters = tuple(_type_check(p, msg) for p in parameters)
599 return _ConcatenateGenericAlias(self, parameters)
600
601
Ken Jin05ab4b62021-04-27 22:31:04 +0800602@_SpecialForm
603def TypeGuard(self, parameters):
604 """Special typing form used to annotate the return type of a user-defined
605 type guard function. ``TypeGuard`` only accepts a single type argument.
606 At runtime, functions marked this way should return a boolean.
607
608 ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static
609 type checkers to determine a more precise type of an expression within a
610 program's code flow. Usually type narrowing is done by analyzing
611 conditional code flow and applying the narrowing to a block of code. The
612 conditional expression here is sometimes referred to as a "type guard".
613
614 Sometimes it would be convenient to use a user-defined boolean function
615 as a type guard. Such a function should use ``TypeGuard[...]`` as its
616 return type to alert static type checkers to this intention.
617
618 Using ``-> TypeGuard`` tells the static type checker that for a given
619 function:
620
621 1. The return value is a boolean.
622 2. If the return value is ``True``, the type of its argument
623 is the type inside ``TypeGuard``.
624
625 For example::
626
627 def is_str(val: Union[str, float]):
628 # "isinstance" type guard
629 if isinstance(val, str):
630 # Type of ``val`` is narrowed to ``str``
631 ...
632 else:
633 # Else, type of ``val`` is narrowed to ``float``.
634 ...
635
636 Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower
637 form of ``TypeA`` (it can even be a wider form) and this may lead to
638 type-unsafe results. The main reason is to allow for things like
639 narrowing ``List[object]`` to ``List[str]`` even though the latter is not
640 a subtype of the former, since ``List`` is invariant. The responsibility of
641 writing type-safe type guards is left to the user.
642
643 ``TypeGuard`` also works with type variables. For more information, see
644 PEP 647 (User-Defined Type Guards).
645 """
646 item = _type_check(parameters, f'{self} accepts only single type.')
647 return _GenericAlias(self, (item,))
648
649
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000650class ForwardRef(_Final, _root=True):
Guido van Rossumb24569a2016-11-20 18:01:29 -0800651 """Internal wrapper to hold a forward reference."""
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700652
Guido van Rossum4cefe742016-09-27 15:20:12 -0700653 __slots__ = ('__forward_arg__', '__forward_code__',
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400654 '__forward_evaluated__', '__forward_value__',
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700655 '__forward_is_argument__', '__forward_module__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700656
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700657 def __init__(self, arg, is_argument=True, module=None):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700658 if not isinstance(arg, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000659 raise TypeError(f"Forward reference must be a string -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700660 try:
661 code = compile(arg, '<string>', 'eval')
662 except SyntaxError:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000663 raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700664 self.__forward_arg__ = arg
665 self.__forward_code__ = code
666 self.__forward_evaluated__ = False
667 self.__forward_value__ = None
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400668 self.__forward_is_argument__ = is_argument
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700669 self.__forward_module__ = module
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700670
wyfo653f4202020-07-22 21:47:28 +0200671 def _evaluate(self, globalns, localns, recursive_guard):
672 if self.__forward_arg__ in recursive_guard:
673 return self
Guido van Rossumdad17902016-11-10 08:29:18 -0800674 if not self.__forward_evaluated__ or localns is not globalns:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700675 if globalns is None and localns is None:
676 globalns = localns = {}
677 elif globalns is None:
678 globalns = localns
679 elif localns is None:
680 localns = globalns
Miss Islington (bot)480f29f2021-07-17 01:48:17 -0700681 if self.__forward_module__ is not None:
682 globalns = getattr(
683 sys.modules.get(self.__forward_module__, None), '__dict__', globalns
684 )
wyfo653f4202020-07-22 21:47:28 +0200685 type_ =_type_check(
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700686 eval(self.__forward_code__, globalns, localns),
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400687 "Forward references must evaluate to types.",
wyfo653f4202020-07-22 21:47:28 +0200688 is_argument=self.__forward_is_argument__,
689 )
690 self.__forward_value__ = _eval_type(
691 type_, globalns, localns, recursive_guard | {self.__forward_arg__}
692 )
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700693 self.__forward_evaluated__ = True
694 return self.__forward_value__
695
Guido van Rossum4cefe742016-09-27 15:20:12 -0700696 def __eq__(self, other):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000697 if not isinstance(other, ForwardRef):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700698 return NotImplemented
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100699 if self.__forward_evaluated__ and other.__forward_evaluated__:
700 return (self.__forward_arg__ == other.__forward_arg__ and
701 self.__forward_value__ == other.__forward_value__)
702 return self.__forward_arg__ == other.__forward_arg__
Guido van Rossum4cefe742016-09-27 15:20:12 -0700703
704 def __hash__(self):
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100705 return hash(self.__forward_arg__)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700706
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700707 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000708 return f'ForwardRef({self.__forward_arg__!r})'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700709
kj73607be2020-12-24 12:33:48 +0800710class _TypeVarLike:
711 """Mixin for TypeVar-like types (TypeVar and ParamSpec)."""
712 def __init__(self, bound, covariant, contravariant):
713 """Used to setup TypeVars and ParamSpec's bound, covariant and
714 contravariant attributes.
715 """
716 if covariant and contravariant:
717 raise ValueError("Bivariant types are not supported.")
718 self.__covariant__ = bool(covariant)
719 self.__contravariant__ = bool(contravariant)
720 if bound:
721 self.__bound__ = _type_check(bound, "Bound must be a type.")
722 else:
723 self.__bound__ = None
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700724
kj73607be2020-12-24 12:33:48 +0800725 def __or__(self, right):
726 return Union[self, right]
727
Jelle Zijlstra90459192021-04-10 20:00:05 -0700728 def __ror__(self, left):
729 return Union[left, self]
kj73607be2020-12-24 12:33:48 +0800730
731 def __repr__(self):
732 if self.__covariant__:
733 prefix = '+'
734 elif self.__contravariant__:
735 prefix = '-'
736 else:
737 prefix = '~'
738 return prefix + self.__name__
739
740 def __reduce__(self):
741 return self.__name__
742
743
744class TypeVar( _Final, _Immutable, _TypeVarLike, _root=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700745 """Type variable.
746
747 Usage::
748
749 T = TypeVar('T') # Can be anything
750 A = TypeVar('A', str, bytes) # Must be str or bytes
751
752 Type variables exist primarily for the benefit of static type
753 checkers. They serve as the parameters for generic types as well
754 as for generic function definitions. See class Generic for more
755 information on generic types. Generic functions work as follows:
756
Guido van Rossumb24569a2016-11-20 18:01:29 -0800757 def repeat(x: T, n: int) -> List[T]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700758 '''Return a list containing n references to x.'''
759 return [x]*n
760
761 def longest(x: A, y: A) -> A:
762 '''Return the longest of two strings.'''
763 return x if len(x) >= len(y) else y
764
765 The latter example's signature is essentially the overloading
766 of (str, str) -> str and (bytes, bytes) -> bytes. Also note
767 that if the arguments are instances of some subclass of str,
768 the return type is still plain str.
769
Guido van Rossumb24569a2016-11-20 18:01:29 -0800770 At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700771
Guido van Rossumefa798d2016-08-23 11:01:50 -0700772 Type variables defined with covariant=True or contravariant=True
João D. Ferreira86bfed32018-07-07 16:41:20 +0100773 can be used to declare covariant or contravariant generic types.
Guido van Rossumefa798d2016-08-23 11:01:50 -0700774 See PEP 484 for more details. By default generic types are invariant
775 in all type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700776
777 Type variables can be introspected. e.g.:
778
779 T.__name__ == 'T'
780 T.__constraints__ == ()
781 T.__covariant__ == False
782 T.__contravariant__ = False
783 A.__constraints__ == (str, bytes)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100784
785 Note that only type variables defined in global scope can be pickled.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700786 """
787
Guido van Rossum4cefe742016-09-27 15:20:12 -0700788 __slots__ = ('__name__', '__bound__', '__constraints__',
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300789 '__covariant__', '__contravariant__', '__dict__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700790
791 def __init__(self, name, *constraints, bound=None,
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800792 covariant=False, contravariant=False):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700793 self.__name__ = name
kj73607be2020-12-24 12:33:48 +0800794 super().__init__(bound, covariant, contravariant)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700795 if constraints and bound is not None:
796 raise TypeError("Constraints cannot be combined with bound=...")
797 if constraints and len(constraints) == 1:
798 raise TypeError("A single constraint is not allowed")
799 msg = "TypeVar(name, constraint, ...): constraints must be types."
800 self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
HongWeipenga25a04f2020-04-21 04:01:53 +0800801 try:
802 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling
803 except (AttributeError, ValueError):
804 def_mod = None
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300805 if def_mod != 'typing':
806 self.__module__ = def_mod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700807
Maggie Moss1b4552c2020-09-09 13:23:24 -0700808
Jelle Zijlstra52243362021-04-10 19:57:05 -0700809class ParamSpecArgs(_Final, _Immutable, _root=True):
810 """The args for a ParamSpec object.
811
812 Given a ParamSpec object P, P.args is an instance of ParamSpecArgs.
813
814 ParamSpecArgs objects have a reference back to their ParamSpec:
815
816 P.args.__origin__ is P
817
818 This type is meant for runtime introspection and has no special meaning to
819 static type checkers.
820 """
821 def __init__(self, origin):
822 self.__origin__ = origin
823
824 def __repr__(self):
825 return f"{self.__origin__.__name__}.args"
826
827
828class ParamSpecKwargs(_Final, _Immutable, _root=True):
829 """The kwargs for a ParamSpec object.
830
831 Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs.
832
833 ParamSpecKwargs objects have a reference back to their ParamSpec:
834
835 P.kwargs.__origin__ is P
836
837 This type is meant for runtime introspection and has no special meaning to
838 static type checkers.
839 """
840 def __init__(self, origin):
841 self.__origin__ = origin
842
843 def __repr__(self):
844 return f"{self.__origin__.__name__}.kwargs"
845
846
kj73607be2020-12-24 12:33:48 +0800847class ParamSpec(_Final, _Immutable, _TypeVarLike, _root=True):
848 """Parameter specification variable.
Maggie Moss1b4552c2020-09-09 13:23:24 -0700849
kj73607be2020-12-24 12:33:48 +0800850 Usage::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700851
kj73607be2020-12-24 12:33:48 +0800852 P = ParamSpec('P')
853
854 Parameter specification variables exist primarily for the benefit of static
855 type checkers. They are used to forward the parameter types of one
Ken Jin11276cd2021-01-02 08:45:50 +0800856 callable to another callable, a pattern commonly found in higher order
857 functions and decorators. They are only valid when used in ``Concatenate``,
858 or s the first argument to ``Callable``, or as parameters for user-defined
859 Generics. See class Generic for more information on generic types. An
860 example for annotating a decorator::
kj73607be2020-12-24 12:33:48 +0800861
862 T = TypeVar('T')
863 P = ParamSpec('P')
864
865 def add_logging(f: Callable[P, T]) -> Callable[P, T]:
866 '''A type-safe decorator to add logging to a function.'''
867 def inner(*args: P.args, **kwargs: P.kwargs) -> T:
868 logging.info(f'{f.__name__} was called')
869 return f(*args, **kwargs)
870 return inner
871
872 @add_logging
873 def add_two(x: float, y: float) -> float:
874 '''Add two numbers together.'''
875 return x + y
876
877 Parameter specification variables defined with covariant=True or
878 contravariant=True can be used to declare covariant or contravariant
879 generic types. These keyword arguments are valid, but their actual semantics
880 are yet to be decided. See PEP 612 for details.
881
882 Parameter specification variables can be introspected. e.g.:
883
884 P.__name__ == 'T'
885 P.__bound__ == None
886 P.__covariant__ == False
887 P.__contravariant__ == False
888
889 Note that only parameter specification variables defined in global scope can
890 be pickled.
891 """
892
893 __slots__ = ('__name__', '__bound__', '__covariant__', '__contravariant__',
894 '__dict__')
895
Jelle Zijlstra52243362021-04-10 19:57:05 -0700896 @property
897 def args(self):
898 return ParamSpecArgs(self)
899
900 @property
901 def kwargs(self):
902 return ParamSpecKwargs(self)
kj73607be2020-12-24 12:33:48 +0800903
Ken Jinace008c2021-01-11 08:11:41 +0800904 def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
kj73607be2020-12-24 12:33:48 +0800905 self.__name__ = name
906 super().__init__(bound, covariant, contravariant)
907 try:
908 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
909 except (AttributeError, ValueError):
910 def_mod = None
911 if def_mod != 'typing':
912 self.__module__ = def_mod
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100913
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700914
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000915def _is_dunder(attr):
916 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800917
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300918class _BaseGenericAlias(_Final, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000919 """The central part of internal API.
920
921 This represents a generic version of type 'origin' with type arguments 'params'.
922 There are two kind of these aliases: user defined and special. The special ones
923 are wrappers around builtin collections and ABCs in collections.abc. These must
924 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
925 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700926 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300927 def __init__(self, origin, *, inst=True, name=None):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000928 self._inst = inst
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000929 self._name = name
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700930 self.__origin__ = origin
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000931 self.__slots__ = None # This is not documented.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300932
933 def __call__(self, *args, **kwargs):
934 if not self._inst:
935 raise TypeError(f"Type {self._name} cannot be instantiated; "
936 f"use {self.__origin__.__name__}() instead")
937 result = self.__origin__(*args, **kwargs)
938 try:
939 result.__orig_class__ = self
940 except AttributeError:
941 pass
942 return result
943
944 def __mro_entries__(self, bases):
945 res = []
946 if self.__origin__ not in bases:
947 res.append(self.__origin__)
948 i = bases.index(self)
949 for b in bases[i+1:]:
950 if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
951 break
952 else:
953 res.append(Generic)
954 return tuple(res)
955
956 def __getattr__(self, attr):
Miss Islington (bot)c895f2b2021-07-19 10:57:27 -0700957 if attr in {'__name__', '__qualname__'}:
958 return self._name
959
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300960 # We are careful for copy and pickle.
961 # Also for simplicity we just don't relay all dunder names
962 if '__origin__' in self.__dict__ and not _is_dunder(attr):
963 return getattr(self.__origin__, attr)
964 raise AttributeError(attr)
965
966 def __setattr__(self, attr, val):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700967 if _is_dunder(attr) or attr in {'_name', '_inst', '_nparams',
968 '_typevar_types', '_paramspec_tvars'}:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300969 super().__setattr__(attr, val)
970 else:
971 setattr(self.__origin__, attr, val)
972
973 def __instancecheck__(self, obj):
974 return self.__subclasscheck__(type(obj))
975
976 def __subclasscheck__(self, cls):
977 raise TypeError("Subscripted generics cannot be used with"
978 " class and instance checks")
979
980
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300981# Special typing constructs Union, Optional, Generic, Callable and Tuple
982# use three special attributes for internal bookkeeping of generic types:
983# * __parameters__ is a tuple of unique free type parameters of a generic
984# type, for example, Dict[T, T].__parameters__ == (T,);
985# * __origin__ keeps a reference to a type that was subscripted,
986# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
987# the type.
988# * __args__ is a tuple of all arguments used in subscripting,
989# e.g., Dict[T, int].__args__ == (T, int).
990
991
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300992class _GenericAlias(_BaseGenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700993 def __init__(self, origin, params, *, inst=True, name=None,
994 _typevar_types=TypeVar,
995 _paramspec_tvars=False):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300996 super().__init__(origin, inst=inst, name=name)
997 if not isinstance(params, tuple):
998 params = (params,)
999 self.__args__ = tuple(... if a is _TypingEllipsis else
1000 () if a is _TypingEmpty else
1001 a for a in params)
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001002 self.__parameters__ = _collect_type_vars(params, typevar_types=_typevar_types)
1003 self._typevar_types = _typevar_types
1004 self._paramspec_tvars = _paramspec_tvars
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001005 if not name:
1006 self.__module__ = origin.__module__
1007
1008 def __eq__(self, other):
1009 if not isinstance(other, _GenericAlias):
1010 return NotImplemented
1011 return (self.__origin__ == other.__origin__
1012 and self.__args__ == other.__args__)
1013
1014 def __hash__(self):
1015 return hash((self.__origin__, self.__args__))
1016
Maggie Moss1b4552c2020-09-09 13:23:24 -07001017 def __or__(self, right):
1018 return Union[self, right]
1019
Serhiy Storchaka80844d12021-07-16 16:42:04 +03001020 def __ror__(self, left):
1021 return Union[left, self]
Maggie Moss1b4552c2020-09-09 13:23:24 -07001022
Guido van Rossum4cefe742016-09-27 15:20:12 -07001023 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001024 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001025 if self.__origin__ in (Generic, Protocol):
1026 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001027 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001028 if not isinstance(params, tuple):
1029 params = (params,)
kj73607be2020-12-24 12:33:48 +08001030 params = tuple(_type_convert(p) for p in params)
Miss Islington (bot)c8db2922021-08-02 00:08:24 -07001031 if (self._paramspec_tvars
1032 and any(isinstance(t, ParamSpec) for t in self.__parameters__)):
1033 params = _prepare_paramspec_params(self, params)
1034 else:
1035 _check_generic(self, params, len(self.__parameters__))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001036
1037 subst = dict(zip(self.__parameters__, params))
1038 new_args = []
1039 for arg in self.__args__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001040 if isinstance(arg, self._typevar_types):
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001041 if isinstance(arg, ParamSpec):
1042 arg = subst[arg]
1043 if not _is_param_expr(arg):
1044 raise TypeError(f"Expected a list of types, an ellipsis, "
1045 f"ParamSpec, or Concatenate. Got {arg}")
1046 else:
1047 arg = subst[arg]
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001048 elif isinstance(arg, (_GenericAlias, GenericAlias, types.UnionType)):
Serhiy Storchaka0122d482020-05-10 13:39:40 +03001049 subparams = arg.__parameters__
1050 if subparams:
1051 subargs = tuple(subst[x] for x in subparams)
1052 arg = arg[subargs]
kj73607be2020-12-24 12:33:48 +08001053 # Required to flatten out the args for CallableGenericAlias
1054 if self.__origin__ == collections.abc.Callable and isinstance(arg, tuple):
1055 new_args.extend(arg)
1056 else:
1057 new_args.append(arg)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001058 return self.copy_with(tuple(new_args))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001059
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001060 def copy_with(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001061 return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001062
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001063 def __repr__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001064 if self._name:
1065 name = 'typing.' + self._name
1066 else:
1067 name = _type_repr(self.__origin__)
1068 args = ", ".join([_type_repr(a) for a in self.__args__])
1069 return f'{name}[{args}]'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001070
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001071 def __reduce__(self):
1072 if self._name:
1073 origin = globals()[self._name]
1074 else:
1075 origin = self.__origin__
1076 args = tuple(self.__args__)
1077 if len(args) == 1 and not isinstance(args[0], tuple):
1078 args, = args
1079 return operator.getitem, (origin, args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001080
1081 def __mro_entries__(self, bases):
1082 if self._name: # generic version of an ABC or built-in class
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001083 return super().__mro_entries__(bases)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001084 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001085 if Protocol in bases:
1086 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001087 i = bases.index(self)
1088 for b in bases[i+1:]:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001089 if isinstance(b, _BaseGenericAlias) and b is not self:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001090 return ()
1091 return (self.__origin__,)
1092
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001093
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001094# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
1095# 1 for List and 2 for Dict. It may be -1 if variable number of
1096# parameters are accepted (needs custom __getitem__).
1097
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001098class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001099 def __init__(self, origin, nparams, *, inst=True, name=None):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001100 if name is None:
1101 name = origin.__name__
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001102 super().__init__(origin, inst=inst, name=name)
1103 self._nparams = nparams
Serhiy Storchaka2fbc57a2020-05-10 15:14:27 +03001104 if origin.__module__ == 'builtins':
1105 self.__doc__ = f'A generic version of {origin.__qualname__}.'
1106 else:
1107 self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001108
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001109 @_tp_cache
1110 def __getitem__(self, params):
1111 if not isinstance(params, tuple):
1112 params = (params,)
1113 msg = "Parameters to generic types must be types."
1114 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001115 _check_generic(self, params, self._nparams)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001116 return self.copy_with(params)
1117
1118 def copy_with(self, params):
1119 return _GenericAlias(self.__origin__, params,
1120 name=self._name, inst=self._inst)
1121
1122 def __repr__(self):
1123 return 'typing.' + self._name
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001124
1125 def __subclasscheck__(self, cls):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001126 if isinstance(cls, _SpecialGenericAlias):
1127 return issubclass(cls.__origin__, self.__origin__)
1128 if not isinstance(cls, _GenericAlias):
1129 return issubclass(cls, self.__origin__)
1130 return super().__subclasscheck__(cls)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001131
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001132 def __reduce__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001133 return self._name
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001134
Maggie Moss1b4552c2020-09-09 13:23:24 -07001135 def __or__(self, right):
1136 return Union[self, right]
1137
Serhiy Storchaka80844d12021-07-16 16:42:04 +03001138 def __ror__(self, left):
1139 return Union[left, self]
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001140
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001141class _CallableGenericAlias(_GenericAlias, _root=True):
1142 def __repr__(self):
1143 assert self._name == 'Callable'
kj73607be2020-12-24 12:33:48 +08001144 args = self.__args__
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001145 if len(args) == 2 and _is_param_expr(args[0]):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001146 return super().__repr__()
1147 return (f'typing.Callable'
kj73607be2020-12-24 12:33:48 +08001148 f'[[{", ".join([_type_repr(a) for a in args[:-1]])}], '
1149 f'{_type_repr(args[-1])}]')
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001150
1151 def __reduce__(self):
1152 args = self.__args__
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001153 if not (len(args) == 2 and _is_param_expr(args[0])):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001154 args = list(args[:-1]), args[-1]
1155 return operator.getitem, (Callable, args)
1156
1157
1158class _CallableType(_SpecialGenericAlias, _root=True):
1159 def copy_with(self, params):
1160 return _CallableGenericAlias(self.__origin__, params,
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001161 name=self._name, inst=self._inst,
1162 _typevar_types=(TypeVar, ParamSpec),
1163 _paramspec_tvars=True)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001164
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001165 def __getitem__(self, params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001166 if not isinstance(params, tuple) or len(params) != 2:
1167 raise TypeError("Callable must be used as "
1168 "Callable[[arg, ...], result].")
1169 args, result = params
kj463c7d32020-12-14 02:38:24 +08001170 # This relaxes what args can be on purpose to allow things like
1171 # PEP 612 ParamSpec. Responsibility for whether a user is using
1172 # Callable[...] properly is deferred to static type checkers.
1173 if isinstance(args, list):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001174 params = (tuple(args), result)
kj463c7d32020-12-14 02:38:24 +08001175 else:
1176 params = (args, result)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001177 return self.__getitem_inner__(params)
1178
1179 @_tp_cache
1180 def __getitem_inner__(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001181 args, result = params
1182 msg = "Callable[args, result]: result must be a type."
1183 result = _type_check(result, msg)
1184 if args is Ellipsis:
1185 return self.copy_with((_TypingEllipsis, result))
kj463c7d32020-12-14 02:38:24 +08001186 if not isinstance(args, tuple):
1187 args = (args,)
1188 args = tuple(_type_convert(arg) for arg in args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001189 params = args + (result,)
1190 return self.copy_with(params)
1191
1192
1193class _TupleType(_SpecialGenericAlias, _root=True):
1194 @_tp_cache
1195 def __getitem__(self, params):
1196 if params == ():
1197 return self.copy_with((_TypingEmpty,))
1198 if not isinstance(params, tuple):
1199 params = (params,)
1200 if len(params) == 2 and params[1] is ...:
1201 msg = "Tuple[t, ...]: t must be a type."
1202 p = _type_check(params[0], msg)
1203 return self.copy_with((p, _TypingEllipsis))
1204 msg = "Tuple[t0, t1, ...]: each t must be a type."
1205 params = tuple(_type_check(p, msg) for p in params)
1206 return self.copy_with(params)
1207
1208
1209class _UnionGenericAlias(_GenericAlias, _root=True):
1210 def copy_with(self, params):
1211 return Union[params]
1212
1213 def __eq__(self, other):
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001214 if not isinstance(other, (_UnionGenericAlias, types.UnionType)):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001215 return NotImplemented
1216 return set(self.__args__) == set(other.__args__)
1217
1218 def __hash__(self):
1219 return hash(frozenset(self.__args__))
1220
1221 def __repr__(self):
1222 args = self.__args__
1223 if len(args) == 2:
1224 if args[0] is type(None):
1225 return f'typing.Optional[{_type_repr(args[1])}]'
1226 elif args[1] is type(None):
1227 return f'typing.Optional[{_type_repr(args[0])}]'
1228 return super().__repr__()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001229
Maggie Moss1b4552c2020-09-09 13:23:24 -07001230 def __instancecheck__(self, obj):
1231 return self.__subclasscheck__(type(obj))
1232
1233 def __subclasscheck__(self, cls):
1234 for arg in self.__args__:
1235 if issubclass(cls, arg):
1236 return True
1237
1238
Yurii Karabasf03d3182020-11-17 04:23:19 +02001239def _value_and_type_iter(parameters):
1240 return ((p, type(p)) for p in parameters)
1241
1242
1243class _LiteralGenericAlias(_GenericAlias, _root=True):
1244
1245 def __eq__(self, other):
1246 if not isinstance(other, _LiteralGenericAlias):
1247 return NotImplemented
1248
1249 return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__))
1250
1251 def __hash__(self):
Yurii Karabas1b540772020-11-19 18:17:38 +02001252 return hash(frozenset(_value_and_type_iter(self.__args__)))
Yurii Karabasf03d3182020-11-17 04:23:19 +02001253
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001254
kj73607be2020-12-24 12:33:48 +08001255class _ConcatenateGenericAlias(_GenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001256 def __init__(self, *args, **kwargs):
1257 super().__init__(*args, **kwargs,
1258 _typevar_types=(TypeVar, ParamSpec),
1259 _paramspec_tvars=True)
kj73607be2020-12-24 12:33:48 +08001260
1261
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001262class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001263 """Abstract base class for generic types.
1264
Guido van Rossumb24569a2016-11-20 18:01:29 -08001265 A generic type is typically declared by inheriting from
1266 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001267 For example, a generic mapping type might be defined as::
1268
1269 class Mapping(Generic[KT, VT]):
1270 def __getitem__(self, key: KT) -> VT:
1271 ...
1272 # Etc.
1273
1274 This class can then be used as follows::
1275
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001276 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001277 try:
1278 return mapping[key]
1279 except KeyError:
1280 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001281 """
Guido van Rossumd70fe632015-08-05 12:11:06 +02001282 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001283 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +02001284
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001285 @_tp_cache
1286 def __class_getitem__(cls, params):
1287 if not isinstance(params, tuple):
1288 params = (params,)
1289 if not params and cls is not Tuple:
1290 raise TypeError(
1291 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
kj73607be2020-12-24 12:33:48 +08001292 params = tuple(_type_convert(p) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001293 if cls in (Generic, Protocol):
1294 # Generic and Protocol can only be subscripted with unique type variables.
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001295 if not all(isinstance(p, (TypeVar, ParamSpec)) for p in params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001296 raise TypeError(
kj73607be2020-12-24 12:33:48 +08001297 f"Parameters to {cls.__name__}[...] must all be type variables "
1298 f"or parameter specification variables.")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001299 if len(set(params)) != len(params):
1300 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001301 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001302 else:
1303 # Subscripting a regular Generic subclass.
kj73607be2020-12-24 12:33:48 +08001304 if any(isinstance(t, ParamSpec) for t in cls.__parameters__):
1305 params = _prepare_paramspec_params(cls, params)
Miss Islington (bot)c8db2922021-08-02 00:08:24 -07001306 else:
1307 _check_generic(cls, params, len(cls.__parameters__))
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001308 return _GenericAlias(cls, params,
1309 _typevar_types=(TypeVar, ParamSpec),
1310 _paramspec_tvars=True)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001311
1312 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +01001313 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001314 tvars = []
1315 if '__orig_bases__' in cls.__dict__:
1316 error = Generic in cls.__orig_bases__
1317 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001318 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001319 if error:
1320 raise TypeError("Cannot inherit from plain Generic")
1321 if '__orig_bases__' in cls.__dict__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001322 tvars = _collect_type_vars(cls.__orig_bases__, (TypeVar, ParamSpec))
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001323 # Look for Generic[T1, ..., Tn].
1324 # If found, tvars must be a subset of it.
1325 # If not found, tvars is it.
1326 # Also check for and reject plain Generic,
1327 # and reject multiple Generic[...].
1328 gvars = None
1329 for base in cls.__orig_bases__:
1330 if (isinstance(base, _GenericAlias) and
1331 base.__origin__ is Generic):
1332 if gvars is not None:
1333 raise TypeError(
1334 "Cannot inherit from Generic[...] multiple types.")
1335 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001336 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001337 tvarset = set(tvars)
1338 gvarset = set(gvars)
1339 if not tvarset <= gvarset:
1340 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
1341 s_args = ', '.join(str(g) for g in gvars)
1342 raise TypeError(f"Some type variables ({s_vars}) are"
1343 f" not listed in Generic[{s_args}]")
1344 tvars = gvars
1345 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001346
1347
1348class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001349 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
1350 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001351 to sneak in where prohibited.
1352 """
1353
1354
1355class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001356 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001357
1358
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001359_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
1360 '_is_protocol', '_is_runtime_protocol']
1361
1362_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
1363 '__init__', '__module__', '__new__', '__slots__',
Guido van Rossum48b069a2020-04-07 09:50:06 -07001364 '__subclasshook__', '__weakref__', '__class_getitem__']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001365
1366# These special attributes will be not collected as protocol members.
1367EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
1368
1369
1370def _get_protocol_attrs(cls):
1371 """Collect protocol members from a protocol class objects.
1372
1373 This includes names actually defined in the class dictionary, as well
1374 as names that appear in annotations. Special names (above) are skipped.
1375 """
1376 attrs = set()
1377 for base in cls.__mro__[:-1]: # without object
1378 if base.__name__ in ('Protocol', 'Generic'):
1379 continue
1380 annotations = getattr(base, '__annotations__', {})
1381 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
1382 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
1383 attrs.add(attr)
1384 return attrs
1385
1386
1387def _is_callable_members_only(cls):
1388 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
1389 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
1390
1391
1392def _no_init(self, *args, **kwargs):
Miss Islington (bot)2cc19a52021-08-02 10:08:59 -07001393 raise TypeError('Protocols cannot be instantiated')
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001394
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001395def _caller(depth=1, default='__main__'):
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001396 try:
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001397 return sys._getframe(depth + 1).f_globals.get('__name__', default)
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001398 except (AttributeError, ValueError): # For platforms without _getframe()
Miss Islington (bot)56122b02021-07-30 06:48:01 -07001399 return None
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07001400
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001401
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001402def _allow_reckless_class_checks(depth=3):
Nickolena Fishercfaf4c02020-04-26 12:49:11 -05001403 """Allow instance and class checks for special stdlib modules.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001404
1405 The abc and functools modules indiscriminately call isinstance() and
1406 issubclass() on the whole MRO of a user class, which may contain protocols.
1407 """
1408 try:
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001409 return sys._getframe(depth).f_globals['__name__'] in ['abc', 'functools']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001410 except (AttributeError, ValueError): # For platforms without _getframe().
1411 return True
1412
1413
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001414_PROTO_ALLOWLIST = {
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001415 'collections.abc': [
1416 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
1417 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
1418 ],
1419 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1420}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001421
1422
1423class _ProtocolMeta(ABCMeta):
1424 # This metaclass is really unfortunate and exists only because of
1425 # the lack of __instancehook__.
1426 def __instancecheck__(cls, instance):
1427 # We need this method for situations where attributes are
1428 # assigned in __init__.
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001429 if (
1430 getattr(cls, '_is_protocol', False) and
1431 not getattr(cls, '_is_runtime_protocol', False) and
1432 not _allow_reckless_class_checks(depth=2)
1433 ):
1434 raise TypeError("Instance and class checks can only be used with"
1435 " @runtime_checkable protocols")
1436
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001437 if ((not getattr(cls, '_is_protocol', False) or
1438 _is_callable_members_only(cls)) and
1439 issubclass(instance.__class__, cls)):
1440 return True
1441 if cls._is_protocol:
1442 if all(hasattr(instance, attr) and
1443 # All *methods* can be blocked by setting them to None.
1444 (not callable(getattr(cls, attr, None)) or
1445 getattr(instance, attr) is not None)
1446 for attr in _get_protocol_attrs(cls)):
1447 return True
1448 return super().__instancecheck__(instance)
1449
1450
1451class Protocol(Generic, metaclass=_ProtocolMeta):
1452 """Base class for protocol classes.
1453
1454 Protocol classes are defined as::
1455
1456 class Proto(Protocol):
1457 def meth(self) -> int:
1458 ...
1459
1460 Such classes are primarily used with static type checkers that recognize
1461 structural subtyping (static duck-typing), for example::
1462
1463 class C:
1464 def meth(self) -> int:
1465 return 0
1466
1467 def func(x: Proto) -> int:
1468 return x.meth()
1469
1470 func(C()) # Passes static type check
1471
1472 See PEP 544 for details. Protocol classes decorated with
1473 @typing.runtime_checkable act as simple-minded runtime protocols that check
1474 only the presence of given attributes, ignoring their type signatures.
1475 Protocol classes can be generic, they are defined as::
1476
1477 class GenProto(Protocol[T]):
1478 def meth(self) -> T:
1479 ...
1480 """
1481 __slots__ = ()
1482 _is_protocol = True
1483 _is_runtime_protocol = False
1484
1485 def __init_subclass__(cls, *args, **kwargs):
1486 super().__init_subclass__(*args, **kwargs)
1487
1488 # Determine if this is a protocol or a concrete subclass.
1489 if not cls.__dict__.get('_is_protocol', False):
1490 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1491
1492 # Set (or override) the protocol subclass hook.
1493 def _proto_hook(other):
1494 if not cls.__dict__.get('_is_protocol', False):
1495 return NotImplemented
1496
1497 # First, perform various sanity checks.
1498 if not getattr(cls, '_is_runtime_protocol', False):
Rossc1af1282020-12-29 11:55:28 +00001499 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001500 return NotImplemented
1501 raise TypeError("Instance and class checks can only be used with"
1502 " @runtime_checkable protocols")
1503 if not _is_callable_members_only(cls):
Rossc1af1282020-12-29 11:55:28 +00001504 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001505 return NotImplemented
1506 raise TypeError("Protocols with non-method members"
1507 " don't support issubclass()")
1508 if not isinstance(other, type):
1509 # Same error message as for issubclass(1, int).
1510 raise TypeError('issubclass() arg 1 must be a class')
1511
1512 # Second, perform the actual structural compatibility check.
1513 for attr in _get_protocol_attrs(cls):
1514 for base in other.__mro__:
1515 # Check if the members appears in the class dictionary...
1516 if attr in base.__dict__:
1517 if base.__dict__[attr] is None:
1518 return NotImplemented
1519 break
1520
1521 # ...or in annotations, if it is a sub-protocol.
1522 annotations = getattr(base, '__annotations__', {})
1523 if (isinstance(annotations, collections.abc.Mapping) and
1524 attr in annotations and
1525 issubclass(other, Generic) and other._is_protocol):
1526 break
1527 else:
1528 return NotImplemented
1529 return True
1530
1531 if '__subclasshook__' not in cls.__dict__:
1532 cls.__subclasshook__ = _proto_hook
1533
1534 # We have nothing more to do for non-protocols...
1535 if not cls._is_protocol:
Miss Islington (bot)2cc19a52021-08-02 10:08:59 -07001536 if cls.__init__ == _no_init:
1537 for base in cls.__mro__:
1538 init = base.__dict__.get('__init__', _no_init)
1539 if init != _no_init:
1540 cls.__init__ = init
1541 break
1542 else:
1543 # should not happen
1544 cls.__init__ = object.__init__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001545 return
1546
1547 # ... otherwise check consistency of bases, and prohibit instantiation.
1548 for base in cls.__bases__:
1549 if not (base in (object, Generic) or
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001550 base.__module__ in _PROTO_ALLOWLIST and
1551 base.__name__ in _PROTO_ALLOWLIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001552 issubclass(base, Generic) and base._is_protocol):
1553 raise TypeError('Protocols can only inherit from other'
1554 ' protocols, got %r' % base)
1555 cls.__init__ = _no_init
1556
1557
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001558class _AnnotatedAlias(_GenericAlias, _root=True):
1559 """Runtime representation of an annotated type.
1560
1561 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1562 with extra annotations. The alias behaves like a normal typing alias,
1563 instantiating is the same as instantiating the underlying type, binding
1564 it to types is also the same.
1565 """
1566 def __init__(self, origin, metadata):
1567 if isinstance(origin, _AnnotatedAlias):
1568 metadata = origin.__metadata__ + metadata
1569 origin = origin.__origin__
1570 super().__init__(origin, origin)
1571 self.__metadata__ = metadata
1572
1573 def copy_with(self, params):
1574 assert len(params) == 1
1575 new_type = params[0]
1576 return _AnnotatedAlias(new_type, self.__metadata__)
1577
1578 def __repr__(self):
1579 return "typing.Annotated[{}, {}]".format(
1580 _type_repr(self.__origin__),
1581 ", ".join(repr(a) for a in self.__metadata__)
1582 )
1583
1584 def __reduce__(self):
1585 return operator.getitem, (
1586 Annotated, (self.__origin__,) + self.__metadata__
1587 )
1588
1589 def __eq__(self, other):
1590 if not isinstance(other, _AnnotatedAlias):
1591 return NotImplemented
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001592 return (self.__origin__ == other.__origin__
1593 and self.__metadata__ == other.__metadata__)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001594
1595 def __hash__(self):
1596 return hash((self.__origin__, self.__metadata__))
1597
1598
1599class Annotated:
1600 """Add context specific metadata to a type.
1601
1602 Example: Annotated[int, runtime_check.Unsigned] indicates to the
1603 hypothetical runtime_check module that this type is an unsigned int.
1604 Every other consumer of this type can ignore this metadata and treat
1605 this type as int.
1606
1607 The first argument to Annotated must be a valid type.
1608
1609 Details:
1610
1611 - It's an error to call `Annotated` with less than two arguments.
1612 - Nested Annotated are flattened::
1613
1614 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1615
1616 - Instantiating an annotated type is equivalent to instantiating the
1617 underlying type::
1618
1619 Annotated[C, Ann1](5) == C(5)
1620
1621 - Annotated can be used as a generic type alias::
1622
1623 Optimized = Annotated[T, runtime.Optimize()]
1624 Optimized[int] == Annotated[int, runtime.Optimize()]
1625
1626 OptimizedList = Annotated[List[T], runtime.Optimize()]
1627 OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1628 """
1629
1630 __slots__ = ()
1631
1632 def __new__(cls, *args, **kwargs):
1633 raise TypeError("Type Annotated cannot be instantiated.")
1634
1635 @_tp_cache
1636 def __class_getitem__(cls, params):
1637 if not isinstance(params, tuple) or len(params) < 2:
1638 raise TypeError("Annotated[...] should be used "
1639 "with at least two arguments (a type and an "
1640 "annotation).")
1641 msg = "Annotated[t, ...]: t must be a type."
1642 origin = _type_check(params[0], msg)
1643 metadata = tuple(params[1:])
1644 return _AnnotatedAlias(origin, metadata)
1645
1646 def __init_subclass__(cls, *args, **kwargs):
1647 raise TypeError(
1648 "Cannot subclass {}.Annotated".format(cls.__module__)
1649 )
1650
1651
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001652def runtime_checkable(cls):
1653 """Mark a protocol class as a runtime protocol.
1654
1655 Such protocol can be used with isinstance() and issubclass().
1656 Raise TypeError if applied to a non-protocol class.
1657 This allows a simple-minded structural check very similar to
1658 one trick ponies in collections.abc such as Iterable.
1659 For example::
1660
1661 @runtime_checkable
1662 class Closable(Protocol):
1663 def close(self): ...
1664
1665 assert isinstance(open('/some/file'), Closable)
1666
1667 Warning: this will check only the presence of the required methods,
1668 not their type signatures!
1669 """
1670 if not issubclass(cls, Generic) or not cls._is_protocol:
1671 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1672 ' got %r' % cls)
1673 cls._is_runtime_protocol = True
1674 return cls
1675
1676
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001677def cast(typ, val):
1678 """Cast a value to a type.
1679
1680 This returns the value unchanged. To the type checker this
1681 signals that the return value has the designated type, but at
1682 runtime we intentionally don't check anything (we want this
1683 to be as fast as possible).
1684 """
1685 return val
1686
1687
1688def _get_defaults(func):
1689 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001690 try:
1691 code = func.__code__
1692 except AttributeError:
1693 # Some built-in functions don't have __code__, __defaults__, etc.
1694 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001695 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001696 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001697 arg_names = arg_names[:pos_count]
1698 defaults = func.__defaults__ or ()
1699 kwdefaults = func.__kwdefaults__
1700 res = dict(kwdefaults) if kwdefaults else {}
1701 pos_offset = pos_count - len(defaults)
1702 for name, value in zip(arg_names[pos_offset:], defaults):
1703 assert name not in res
1704 res[name] = value
1705 return res
1706
1707
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001708_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1709 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001710 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001711
1712
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001713def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001714 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001715
Guido van Rossum991d14f2016-11-09 13:12:51 -08001716 This is often the same as obj.__annotations__, but it handles
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001717 forward references encoded as string literals, adds Optional[t] if a
1718 default value equal to None is set and recursively replaces all
1719 'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001720
Guido van Rossum991d14f2016-11-09 13:12:51 -08001721 The argument may be a module, class, method, or function. The annotations
1722 are returned as a dictionary. For classes, annotations include also
1723 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001724
Guido van Rossum991d14f2016-11-09 13:12:51 -08001725 TypeError is raised if the argument is not of a type that can contain
1726 annotations, and an empty dictionary is returned if no annotations are
1727 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001728
Guido van Rossum991d14f2016-11-09 13:12:51 -08001729 BEWARE -- the behavior of globalns and localns is counterintuitive
1730 (unless you are familiar with how eval() and exec() work). The
1731 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001732
Guido van Rossum991d14f2016-11-09 13:12:51 -08001733 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001734 globals from obj (or the respective module's globals for classes),
1735 and these are also used as the locals. If the object does not appear
Ken Jin1b1f9852021-04-27 01:31:21 +08001736 to have globals, an empty dictionary is used. For classes, the search
1737 order is globals first then locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001738
Guido van Rossum991d14f2016-11-09 13:12:51 -08001739 - If one dict argument is passed, it is used for both globals and
1740 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001741
Guido van Rossum991d14f2016-11-09 13:12:51 -08001742 - If two dict arguments are passed, they specify globals and
1743 locals, respectively.
1744 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001745
Guido van Rossum991d14f2016-11-09 13:12:51 -08001746 if getattr(obj, '__no_type_check__', None):
1747 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001748 # Classes require a special treatment.
1749 if isinstance(obj, type):
1750 hints = {}
1751 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001752 if globalns is None:
Miss Islington (bot)3df23b52021-06-26 16:52:28 -07001753 base_globals = getattr(sys.modules.get(base.__module__, None), '__dict__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001754 else:
1755 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001756 ann = base.__dict__.get('__annotations__', {})
larryhastings2f2b6982021-04-29 20:09:08 -07001757 if isinstance(ann, types.GetSetDescriptorType):
1758 ann = {}
Ken Jin852150d2021-04-13 01:23:12 +08001759 base_locals = dict(vars(base)) if localns is None else localns
Ken Jin1b1f9852021-04-27 01:31:21 +08001760 if localns is None and globalns is None:
1761 # This is surprising, but required. Before Python 3.10,
1762 # get_type_hints only evaluated the globalns of
1763 # a class. To maintain backwards compatibility, we reverse
1764 # the globalns and localns order so that eval() looks into
1765 # *base_globals* first rather than *base_locals*.
1766 # This only affects ForwardRefs.
1767 base_globals, base_locals = base_locals, base_globals
Guido van Rossum991d14f2016-11-09 13:12:51 -08001768 for name, value in ann.items():
1769 if value is None:
1770 value = type(None)
1771 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001772 value = ForwardRef(value, is_argument=False)
Ken Jin852150d2021-04-13 01:23:12 +08001773 value = _eval_type(value, base_globals, base_locals)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001774 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001775 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001776
1777 if globalns is None:
1778 if isinstance(obj, types.ModuleType):
1779 globalns = obj.__dict__
1780 else:
benedwards140aca3a32019-11-21 17:24:58 +00001781 nsobj = obj
1782 # Find globalns for the unwrapped object.
1783 while hasattr(nsobj, '__wrapped__'):
1784 nsobj = nsobj.__wrapped__
1785 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001786 if localns is None:
1787 localns = globalns
1788 elif localns is None:
1789 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001790 hints = getattr(obj, '__annotations__', None)
1791 if hints is None:
1792 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001793 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001794 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001795 else:
1796 raise TypeError('{!r} is not a module, class, method, '
1797 'or function.'.format(obj))
1798 defaults = _get_defaults(obj)
1799 hints = dict(hints)
1800 for name, value in hints.items():
1801 if value is None:
1802 value = type(None)
1803 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001804 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001805 value = _eval_type(value, globalns, localns)
1806 if name in defaults and defaults[name] is None:
1807 value = Optional[value]
1808 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001809 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1810
1811
1812def _strip_annotations(t):
1813 """Strips the annotations from a given type.
1814 """
1815 if isinstance(t, _AnnotatedAlias):
1816 return _strip_annotations(t.__origin__)
1817 if isinstance(t, _GenericAlias):
1818 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1819 if stripped_args == t.__args__:
1820 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001821 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001822 if isinstance(t, GenericAlias):
1823 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1824 if stripped_args == t.__args__:
1825 return t
1826 return GenericAlias(t.__origin__, stripped_args)
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001827 if isinstance(t, types.UnionType):
Ken Jina2721642021-07-19 22:22:59 +08001828 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1829 if stripped_args == t.__args__:
1830 return t
Miss Islington (bot)0aea99e2021-07-24 12:35:33 -07001831 return functools.reduce(operator.or_, stripped_args)
Ken Jina2721642021-07-19 22:22:59 +08001832
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001833 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001834
1835
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001836def get_origin(tp):
1837 """Get the unsubscripted version of a type.
1838
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001839 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1840 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001841
1842 get_origin(Literal[42]) is Literal
1843 get_origin(int) is None
1844 get_origin(ClassVar[int]) is ClassVar
1845 get_origin(Generic) is Generic
1846 get_origin(Generic[T]) is Generic
1847 get_origin(Union[T, int]) is Union
1848 get_origin(List[Tuple[T, T]][int]) == list
Jelle Zijlstra52243362021-04-10 19:57:05 -07001849 get_origin(P.args) is P
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001850 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001851 if isinstance(tp, _AnnotatedAlias):
1852 return Annotated
Jelle Zijlstra52243362021-04-10 19:57:05 -07001853 if isinstance(tp, (_BaseGenericAlias, GenericAlias,
1854 ParamSpecArgs, ParamSpecKwargs)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001855 return tp.__origin__
1856 if tp is Generic:
1857 return Generic
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001858 if isinstance(tp, types.UnionType):
1859 return types.UnionType
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001860 return None
1861
1862
1863def get_args(tp):
1864 """Get type arguments with all substitutions performed.
1865
1866 For unions, basic simplifications used by Union constructor are performed.
1867 Examples::
1868 get_args(Dict[str, int]) == (str, int)
1869 get_args(int) == ()
1870 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1871 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1872 get_args(Callable[[], T][int]) == ([], int)
1873 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001874 if isinstance(tp, _AnnotatedAlias):
1875 return (tp.__origin__,) + tp.__metadata__
Ken Jin4140f102020-12-29 04:06:19 +08001876 if isinstance(tp, (_GenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001877 res = tp.__args__
Ken Jinefb1f092020-12-29 10:26:19 +08001878 if (tp.__origin__ is collections.abc.Callable
Miss Islington (bot)536e35a2021-08-04 13:36:01 -07001879 and not (len(res) == 2 and _is_param_expr(res[0]))):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001880 res = (list(res[:-1]), res[-1])
1881 return res
Miss Islington (bot)8a37e8c2021-07-26 12:02:58 -07001882 if isinstance(tp, types.UnionType):
Ken Jinefb1f092020-12-29 10:26:19 +08001883 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001884 return ()
1885
1886
Patrick Reader0705ec82020-09-16 05:58:32 +01001887def is_typeddict(tp):
1888 """Check if an annotation is a TypedDict class
1889
1890 For example::
1891 class Film(TypedDict):
1892 title: str
1893 year: int
1894
1895 is_typeddict(Film) # => True
1896 is_typeddict(Union[list, str]) # => False
1897 """
1898 return isinstance(tp, _TypedDictMeta)
1899
1900
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001901def no_type_check(arg):
1902 """Decorator to indicate that annotations are not type hints.
1903
1904 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001905 applies recursively to all methods and classes defined in that class
1906 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001907
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001908 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001909 """
1910 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001911 arg_attrs = arg.__dict__.copy()
1912 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001913 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001914 arg_attrs.pop(attr)
1915 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001916 if isinstance(obj, types.FunctionType):
1917 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001918 if isinstance(obj, type):
1919 no_type_check(obj)
1920 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001921 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001922 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001923 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001924 return arg
1925
1926
1927def no_type_check_decorator(decorator):
1928 """Decorator to give another decorator the @no_type_check effect.
1929
1930 This wraps the decorator with something that wraps the decorated
1931 function in @no_type_check.
1932 """
1933
1934 @functools.wraps(decorator)
1935 def wrapped_decorator(*args, **kwds):
1936 func = decorator(*args, **kwds)
1937 func = no_type_check(func)
1938 return func
1939
1940 return wrapped_decorator
1941
1942
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001943def _overload_dummy(*args, **kwds):
1944 """Helper for @overload to raise when called."""
1945 raise NotImplementedError(
1946 "You should not call an overloaded function. "
1947 "A series of @overload-decorated functions "
1948 "outside a stub module should always be followed "
1949 "by an implementation that is not @overload-ed.")
1950
1951
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001952def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001953 """Decorator for overloaded functions/methods.
1954
1955 In a stub file, place two or more stub definitions for the same
1956 function in a row, each decorated with @overload. For example:
1957
1958 @overload
1959 def utf8(value: None) -> None: ...
1960 @overload
1961 def utf8(value: bytes) -> bytes: ...
1962 @overload
1963 def utf8(value: str) -> bytes: ...
1964
1965 In a non-stub file (i.e. a regular .py file), do the same but
1966 follow it with an implementation. The implementation should *not*
1967 be decorated with @overload. For example:
1968
1969 @overload
1970 def utf8(value: None) -> None: ...
1971 @overload
1972 def utf8(value: bytes) -> bytes: ...
1973 @overload
1974 def utf8(value: str) -> bytes: ...
1975 def utf8(value):
1976 # implementation goes here
1977 """
1978 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001979
1980
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001981def final(f):
1982 """A decorator to indicate final methods and final classes.
1983
1984 Use this decorator to indicate to type checkers that the decorated
1985 method cannot be overridden, and decorated class cannot be subclassed.
1986 For example:
1987
1988 class Base:
1989 @final
1990 def done(self) -> None:
1991 ...
1992 class Sub(Base):
1993 def done(self) -> None: # Error reported by type checker
1994 ...
1995
1996 @final
1997 class Leaf:
1998 ...
1999 class Other(Leaf): # Error reported by type checker
2000 ...
2001
2002 There is no runtime checking of these properties.
2003 """
2004 return f
2005
2006
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002007# Some unconstrained type variables. These are used by the container types.
2008# (These are not for export.)
2009T = TypeVar('T') # Any type.
2010KT = TypeVar('KT') # Key type.
2011VT = TypeVar('VT') # Value type.
2012T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
2013V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
2014VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
2015T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
2016# Internal type variable used for Type[].
2017CT_co = TypeVar('CT_co', covariant=True, bound=type)
2018
2019# A useful type variable with constraints. This represents string types.
2020# (This one *is* for export!)
2021AnyStr = TypeVar('AnyStr', bytes, str)
2022
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002023
2024# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03002025_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002026
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002027Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
2028Awaitable = _alias(collections.abc.Awaitable, 1)
2029Coroutine = _alias(collections.abc.Coroutine, 3)
2030AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
2031AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
2032Iterable = _alias(collections.abc.Iterable, 1)
2033Iterator = _alias(collections.abc.Iterator, 1)
2034Reversible = _alias(collections.abc.Reversible, 1)
2035Sized = _alias(collections.abc.Sized, 0) # Not generic.
2036Container = _alias(collections.abc.Container, 1)
2037Collection = _alias(collections.abc.Collection, 1)
2038Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002039Callable.__doc__ = \
2040 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002041
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002042 The subscription syntax must always be used with exactly two
2043 values: the argument list and the return type. The argument list
2044 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002045
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002046 There is no syntax to indicate optional or keyword arguments,
2047 such function types are rarely used as callback types.
2048 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002049AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
2050MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002051# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002052Mapping = _alias(collections.abc.Mapping, 2)
2053MutableMapping = _alias(collections.abc.MutableMapping, 2)
2054Sequence = _alias(collections.abc.Sequence, 1)
2055MutableSequence = _alias(collections.abc.MutableSequence, 1)
2056ByteString = _alias(collections.abc.ByteString, 0) # Not generic
2057# Tuple accepts variable number of parameters.
2058Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002059Tuple.__doc__ = \
2060 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002061
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002062 Example: Tuple[T1, T2] is a tuple of two elements corresponding
2063 to type variables T1 and T2. Tuple[int, float, str] is a tuple
2064 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002065
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002066 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
2067 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002068List = _alias(list, 1, inst=False, name='List')
2069Deque = _alias(collections.deque, 1, name='Deque')
2070Set = _alias(set, 1, inst=False, name='Set')
2071FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
2072MappingView = _alias(collections.abc.MappingView, 1)
2073KeysView = _alias(collections.abc.KeysView, 1)
2074ItemsView = _alias(collections.abc.ItemsView, 2)
2075ValuesView = _alias(collections.abc.ValuesView, 1)
2076ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
2077AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
2078Dict = _alias(dict, 2, inst=False, name='Dict')
2079DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
2080OrderedDict = _alias(collections.OrderedDict, 2)
2081Counter = _alias(collections.Counter, 1)
2082ChainMap = _alias(collections.ChainMap, 2)
2083Generator = _alias(collections.abc.Generator, 3)
2084AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
2085Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002086Type.__doc__ = \
2087 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002088
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002089 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002090
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002091 class User: ... # Abstract base for User classes
2092 class BasicUser(User): ...
2093 class ProUser(User): ...
2094 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08002095
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002096 And a function that takes a class argument that's a subclass of
2097 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08002098
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002099 U = TypeVar('U', bound=User)
2100 def new_user(user_class: Type[U]) -> U:
2101 user = user_class()
2102 # (Here we could write the user object to a database)
2103 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08002104
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002105 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08002106
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002107 At this point the type checker knows that joe has type BasicUser.
2108 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002109
2110
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002111@runtime_checkable
2112class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002113 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002114 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002115
2116 @abstractmethod
2117 def __int__(self) -> int:
2118 pass
2119
2120
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002121@runtime_checkable
2122class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002123 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002124 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002125
2126 @abstractmethod
2127 def __float__(self) -> float:
2128 pass
2129
2130
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002131@runtime_checkable
2132class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002133 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002134 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002135
2136 @abstractmethod
2137 def __complex__(self) -> complex:
2138 pass
2139
2140
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002141@runtime_checkable
2142class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002143 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002144 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002145
2146 @abstractmethod
2147 def __bytes__(self) -> bytes:
2148 pass
2149
2150
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002151@runtime_checkable
2152class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002153 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07002154 __slots__ = ()
2155
2156 @abstractmethod
2157 def __index__(self) -> int:
2158 pass
2159
2160
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002161@runtime_checkable
2162class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002163 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002164 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002165
2166 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002167 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002168 pass
2169
2170
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002171@runtime_checkable
2172class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002173 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002174 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002175
2176 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002177 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002178 pass
2179
2180
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002181def _make_nmtuple(name, types, module, defaults = ()):
2182 fields = [n for n, t in types]
2183 types = {n: _type_check(t, f"field {n} annotation must be a type")
2184 for n, t in types}
2185 nm_tpl = collections.namedtuple(name, fields,
2186 defaults=defaults, module=module)
2187 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002188 return nm_tpl
2189
2190
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002191# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002192_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
2193 '_fields', '_field_defaults',
2194 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002195
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002196_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002197
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002198
Guido van Rossum2f841442016-11-15 09:48:06 -08002199class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002200
Guido van Rossum2f841442016-11-15 09:48:06 -08002201 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002202 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08002203 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002204 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08002205 for field_name in types:
2206 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002207 default_names.append(field_name)
2208 elif default_names:
2209 raise TypeError(f"Non-default namedtuple field {field_name} "
2210 f"cannot follow default field"
2211 f"{'s' if len(default_names) > 1 else ''} "
2212 f"{', '.join(default_names)}")
2213 nm_tpl = _make_nmtuple(typename, types.items(),
2214 defaults=[ns[n] for n in default_names],
2215 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08002216 # update from user namespace without overriding special namedtuple attributes
2217 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002218 if key in _prohibited:
2219 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
2220 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08002221 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08002222 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002223
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002224
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002225def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08002226 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002227
Guido van Rossum2f841442016-11-15 09:48:06 -08002228 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002229
Guido van Rossum2f841442016-11-15 09:48:06 -08002230 class Employee(NamedTuple):
2231 name: str
2232 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002233
Guido van Rossum2f841442016-11-15 09:48:06 -08002234 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002235
Guido van Rossum2f841442016-11-15 09:48:06 -08002236 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002237
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07002238 The resulting class has an extra __annotations__ attribute, giving a
2239 dict that maps field names to types. (The field names are also in
2240 the _fields attribute, which is part of the namedtuple API.)
2241 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002242
Guido van Rossum2f841442016-11-15 09:48:06 -08002243 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002244
Guido van Rossum2f841442016-11-15 09:48:06 -08002245 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002246
Guido van Rossum2f841442016-11-15 09:48:06 -08002247 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
2248 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002249 if fields is None:
2250 fields = kwargs.items()
2251 elif kwargs:
2252 raise TypeError("Either list of fields or keywords"
2253 " can be provided to NamedTuple, not both")
2254 try:
2255 module = sys._getframe(1).f_globals.get('__name__', '__main__')
2256 except (AttributeError, ValueError):
2257 module = None
2258 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002259
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002260_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
2261
2262def _namedtuple_mro_entries(bases):
2263 if len(bases) > 1:
2264 raise TypeError("Multiple inheritance with NamedTuple is not supported")
2265 assert bases[0] is NamedTuple
2266 return (_NamedTuple,)
2267
2268NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002269
2270
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002271class _TypedDictMeta(type):
2272 def __new__(cls, name, bases, ns, total=True):
2273 """Create new typed dict class object.
2274
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002275 This method is called when TypedDict is subclassed,
2276 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002277 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002278 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002279 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002280 for base in bases:
2281 if type(base) is not _TypedDictMeta:
2282 raise TypeError('cannot inherit from both a TypedDict type '
2283 'and a non-TypedDict base class')
2284 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002285
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002286 annotations = {}
2287 own_annotations = ns.get('__annotations__', {})
2288 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002289 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002290 own_annotations = {
Miss Islington (bot)480f29f2021-07-17 01:48:17 -07002291 n: _type_check(tp, msg, module=tp_dict.__module__)
2292 for n, tp in own_annotations.items()
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002293 }
2294 required_keys = set()
2295 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002296
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002297 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002298 annotations.update(base.__dict__.get('__annotations__', {}))
2299 required_keys.update(base.__dict__.get('__required_keys__', ()))
2300 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002301
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002302 annotations.update(own_annotations)
2303 if total:
2304 required_keys.update(own_annotation_keys)
2305 else:
2306 optional_keys.update(own_annotation_keys)
2307
2308 tp_dict.__annotations__ = annotations
2309 tp_dict.__required_keys__ = frozenset(required_keys)
2310 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002311 if not hasattr(tp_dict, '__total__'):
2312 tp_dict.__total__ = total
2313 return tp_dict
2314
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002315 __call__ = dict # static method
2316
2317 def __subclasscheck__(cls, other):
2318 # Typed dicts are only for static structural subtyping.
2319 raise TypeError('TypedDict does not support instance and class checks')
2320
2321 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002322
2323
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002324def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002325 """A simple typed namespace. At runtime it is equivalent to a plain dict.
2326
2327 TypedDict creates a dictionary type that expects all of its
2328 instances to have a certain set of keys, where each key is
2329 associated with a value of a consistent type. This expectation
2330 is not checked at runtime but is only enforced by type checkers.
2331 Usage::
2332
2333 class Point2D(TypedDict):
2334 x: int
2335 y: int
2336 label: str
2337
2338 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
2339 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
2340
2341 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
2342
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002343 The type info can be accessed via the Point2D.__annotations__ dict, and
2344 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
2345 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002346
2347 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
2348 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
2349
ananthan-123ab6423f2020-02-19 10:03:05 +05302350 By default, all keys must be present in a TypedDict. It is possible
2351 to override this by specifying totality.
2352 Usage::
2353
2354 class point2D(TypedDict, total=False):
2355 x: int
2356 y: int
2357
2358 This means that a point2D TypedDict can have any of the keys omitted.A type
2359 checker is only expected to support a literal False or True as the value of
2360 the total argument. True is the default, and makes all items defined in the
2361 class body be required.
2362
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002363 The class syntax is only supported in Python 3.6+, while two other
2364 syntax forms work for Python 2.7 and 3.2+
2365 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002366 if fields is None:
2367 fields = kwargs
2368 elif kwargs:
2369 raise TypeError("TypedDict takes either a dict or keyword arguments,"
2370 " but not both")
2371
Alex Grönholm67b769f2020-12-10 23:49:05 +02002372 ns = {'__annotations__': dict(fields)}
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002373 try:
2374 # Setting correct module is necessary to make typed dict classes pickleable.
2375 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
2376 except (AttributeError, ValueError):
2377 pass
2378
Alex Grönholm67b769f2020-12-10 23:49:05 +02002379 return _TypedDictMeta(typename, (), ns, total=total)
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002380
2381_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
2382TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002383
2384
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002385class NewType:
Guido van Rossum91185fe2016-06-08 11:19:11 -07002386 """NewType creates simple unique types with almost zero
2387 runtime overhead. NewType(name, tp) is considered a subtype of tp
2388 by static type checkers. At runtime, NewType(name, tp) returns
2389 a dummy function that simply returns its argument. Usage::
2390
2391 UserId = NewType('UserId', int)
2392
2393 def name_by_id(user_id: UserId) -> str:
2394 ...
2395
2396 UserId('user') # Fails type check
2397
2398 name_by_id(42) # Fails type check
2399 name_by_id(UserId(42)) # OK
2400
2401 num = UserId(5) + 1 # type: int
2402 """
2403
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002404 def __init__(self, name, tp):
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002405 self.__qualname__ = name
Łukasz Langa05f5d8e2021-07-24 12:07:56 +02002406 if '.' in name:
2407 name = name.rpartition('.')[-1]
2408 self.__name__ = name
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002409 self.__supertype__ = tp
Miss Islington (bot)56122b02021-07-30 06:48:01 -07002410 def_mod = _caller()
2411 if def_mod != 'typing':
2412 self.__module__ = def_mod
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002413
2414 def __repr__(self):
2415 return f'{self.__module__}.{self.__qualname__}'
2416
2417 def __call__(self, x):
Guido van Rossum91185fe2016-06-08 11:19:11 -07002418 return x
2419
Łukasz Langa05f5d8e2021-07-24 12:07:56 +02002420 def __reduce__(self):
2421 return self.__qualname__
2422
Miss Islington (bot)c2f33df2021-07-20 08:24:57 -07002423 def __or__(self, other):
2424 return Union[self, other]
2425
2426 def __ror__(self, other):
2427 return Union[other, self]
Guido van Rossum91185fe2016-06-08 11:19:11 -07002428
2429
Guido van Rossum0e0563c2016-04-05 14:54:25 -07002430# Python-version-specific alias (Python 2: unicode; Python 3: str)
2431Text = str
2432
2433
Guido van Rossum91185fe2016-06-08 11:19:11 -07002434# Constant that's True when type checking, but False here.
2435TYPE_CHECKING = False
2436
2437
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002438class IO(Generic[AnyStr]):
2439 """Generic base class for TextIO and BinaryIO.
2440
2441 This is an abstract, generic version of the return of open().
2442
2443 NOTE: This does not distinguish between the different possible
2444 classes (text vs. binary, read vs. write vs. read/write,
2445 append-only, unbuffered). The TextIO and BinaryIO subclasses
2446 below capture the distinctions between text vs. binary, which is
2447 pervasive in the interface; however we currently do not offer a
2448 way to track the other distinctions in the type system.
2449 """
2450
Guido van Rossumd70fe632015-08-05 12:11:06 +02002451 __slots__ = ()
2452
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002453 @property
2454 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002455 def mode(self) -> str:
2456 pass
2457
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002458 @property
2459 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002460 def name(self) -> str:
2461 pass
2462
2463 @abstractmethod
2464 def close(self) -> None:
2465 pass
2466
Shantanu2e6569b2020-01-29 18:52:36 -08002467 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002468 @abstractmethod
2469 def closed(self) -> bool:
2470 pass
2471
2472 @abstractmethod
2473 def fileno(self) -> int:
2474 pass
2475
2476 @abstractmethod
2477 def flush(self) -> None:
2478 pass
2479
2480 @abstractmethod
2481 def isatty(self) -> bool:
2482 pass
2483
2484 @abstractmethod
2485 def read(self, n: int = -1) -> AnyStr:
2486 pass
2487
2488 @abstractmethod
2489 def readable(self) -> bool:
2490 pass
2491
2492 @abstractmethod
2493 def readline(self, limit: int = -1) -> AnyStr:
2494 pass
2495
2496 @abstractmethod
2497 def readlines(self, hint: int = -1) -> List[AnyStr]:
2498 pass
2499
2500 @abstractmethod
2501 def seek(self, offset: int, whence: int = 0) -> int:
2502 pass
2503
2504 @abstractmethod
2505 def seekable(self) -> bool:
2506 pass
2507
2508 @abstractmethod
2509 def tell(self) -> int:
2510 pass
2511
2512 @abstractmethod
2513 def truncate(self, size: int = None) -> int:
2514 pass
2515
2516 @abstractmethod
2517 def writable(self) -> bool:
2518 pass
2519
2520 @abstractmethod
2521 def write(self, s: AnyStr) -> int:
2522 pass
2523
2524 @abstractmethod
2525 def writelines(self, lines: List[AnyStr]) -> None:
2526 pass
2527
2528 @abstractmethod
2529 def __enter__(self) -> 'IO[AnyStr]':
2530 pass
2531
2532 @abstractmethod
2533 def __exit__(self, type, value, traceback) -> None:
2534 pass
2535
2536
2537class BinaryIO(IO[bytes]):
2538 """Typed version of the return of open() in binary mode."""
2539
Guido van Rossumd70fe632015-08-05 12:11:06 +02002540 __slots__ = ()
2541
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002542 @abstractmethod
2543 def write(self, s: Union[bytes, bytearray]) -> int:
2544 pass
2545
2546 @abstractmethod
2547 def __enter__(self) -> 'BinaryIO':
2548 pass
2549
2550
2551class TextIO(IO[str]):
2552 """Typed version of the return of open() in text mode."""
2553
Guido van Rossumd70fe632015-08-05 12:11:06 +02002554 __slots__ = ()
2555
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002556 @property
2557 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002558 def buffer(self) -> BinaryIO:
2559 pass
2560
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002561 @property
2562 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002563 def encoding(self) -> str:
2564 pass
2565
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002566 @property
2567 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002568 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002569 pass
2570
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002571 @property
2572 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002573 def line_buffering(self) -> bool:
2574 pass
2575
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002576 @property
2577 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002578 def newlines(self) -> Any:
2579 pass
2580
2581 @abstractmethod
2582 def __enter__(self) -> 'TextIO':
2583 pass
2584
2585
2586class io:
2587 """Wrapper namespace for IO generic classes."""
2588
2589 __all__ = ['IO', 'TextIO', 'BinaryIO']
2590 IO = IO
2591 TextIO = TextIO
2592 BinaryIO = BinaryIO
2593
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002594
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002595io.__name__ = __name__ + '.io'
2596sys.modules[io.__name__] = io
2597
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002598Pattern = _alias(stdlib_re.Pattern, 1)
2599Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002600
2601class re:
2602 """Wrapper namespace for re type aliases."""
2603
2604 __all__ = ['Pattern', 'Match']
2605 Pattern = Pattern
2606 Match = Match
2607
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002608
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002609re.__name__ = __name__ + '.re'
2610sys.modules[re.__name__] = re