blob: 639feeef99e750accba5833bcb0ef7f12c0b04a1 [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
137def _type_convert(arg):
138 """For converting None to type(None), and strings to ForwardRef."""
139 if arg is None:
140 return type(None)
141 if isinstance(arg, str):
142 return ForwardRef(arg)
143 return arg
144
145
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700146def _type_check(arg, msg, is_argument=True):
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
kj463c7d32020-12-14 02:38:24 +0800162 arg = _type_convert(arg)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000163 if (isinstance(arg, _GenericAlias) and
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400164 arg.__origin__ in invalid_generic_forms):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000165 raise TypeError(f"{arg} is not valid as type argument")
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300166 if arg in (Any, NoReturn):
167 return arg
168 if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000169 raise TypeError(f"Plain {arg} is not valid as type argument")
kj73607be2020-12-24 12:33:48 +0800170 if isinstance(arg, (type, TypeVar, ForwardRef, types.Union, ParamSpec)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000171 return arg
172 if not callable(arg):
173 raise TypeError(f"{msg} Got {arg!r:.100}.")
174 return arg
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700175
176
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000177def _type_repr(obj):
178 """Return the repr() of an object, special-casing types (internal helper).
179
180 If obj is a type, we return a shorter version than the default
181 type.__repr__, based on the module and qualified name, which is
182 typically enough to uniquely identify a type. For everything
183 else, we fall back on repr(obj).
184 """
kj1f7dfb22020-11-02 02:13:38 +0800185 if isinstance(obj, types.GenericAlias):
186 return repr(obj)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000187 if isinstance(obj, type):
188 if obj.__module__ == 'builtins':
189 return obj.__qualname__
190 return f'{obj.__module__}.{obj.__qualname__}'
191 if obj is ...:
192 return('...')
193 if isinstance(obj, types.FunctionType):
194 return obj.__name__
195 return repr(obj)
196
197
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700198def _collect_type_vars(types, typevar_types=None):
199 """Collect all type variable contained
kj73607be2020-12-24 12:33:48 +0800200 in types in order of first appearance (lexicographic order). For example::
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000201
202 _collect_type_vars((T, List[S, T])) == (T, S)
203 """
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700204 if typevar_types is None:
205 typevar_types = TypeVar
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000206 tvars = []
207 for t in types:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700208 if isinstance(t, typevar_types) and t not in tvars:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000209 tvars.append(t)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300210 if isinstance(t, (_GenericAlias, GenericAlias)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000211 tvars.extend([t for t in t.__parameters__ if t not in tvars])
212 return tuple(tvars)
213
214
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300215def _check_generic(cls, parameters, elen):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000216 """Check correct count for parameters of a generic cls (internal helper).
217 This gives a nice error message in case of count mismatch.
218 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300219 if not elen:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000220 raise TypeError(f"{cls} is not a generic class")
221 alen = len(parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000222 if alen != elen:
223 raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};"
224 f" actual {alen}, expected {elen}")
225
kj73607be2020-12-24 12:33:48 +0800226def _prepare_paramspec_params(cls, params):
227 """Prepares the parameters for a Generic containing ParamSpec
228 variables (internal helper).
229 """
230 # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612.
231 if len(cls.__parameters__) == 1 and len(params) > 1:
232 return (params,)
233 else:
234 _params = []
235 # Convert lists to tuples to help other libraries cache the results.
236 for p, tvar in zip(params, cls.__parameters__):
237 if isinstance(tvar, ParamSpec) and isinstance(p, list):
238 p = tuple(p)
239 _params.append(p)
240 return tuple(_params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000241
Yurii Karabasf03d3182020-11-17 04:23:19 +0200242def _deduplicate(params):
243 # Weed out strict duplicates, preserving the first of each occurrence.
244 all_params = set(params)
245 if len(all_params) < len(params):
246 new_params = []
247 for t in params:
248 if t in all_params:
249 new_params.append(t)
250 all_params.remove(t)
251 params = new_params
252 assert not all_params, all_params
253 return params
254
255
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000256def _remove_dups_flatten(parameters):
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700257 """An internal helper for Union creation and substitution: flatten Unions
258 among parameters, then remove duplicates.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000259 """
260 # Flatten out Union[Union[...], ...].
261 params = []
262 for p in parameters:
Maggie Moss1b4552c2020-09-09 13:23:24 -0700263 if isinstance(p, (_UnionGenericAlias, types.Union)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000264 params.extend(p.__args__)
265 elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
266 params.extend(p[1:])
267 else:
268 params.append(p)
Yurii Karabasf03d3182020-11-17 04:23:19 +0200269
270 return tuple(_deduplicate(params))
271
272
273def _flatten_literal_params(parameters):
274 """An internal helper for Literal creation: flatten Literals among parameters"""
275 params = []
276 for p in parameters:
277 if isinstance(p, _LiteralGenericAlias):
278 params.extend(p.__args__)
279 else:
280 params.append(p)
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700281 return tuple(params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000282
283
284_cleanups = []
285
286
Yurii Karabasf03d3182020-11-17 04:23:19 +0200287def _tp_cache(func=None, /, *, typed=False):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000288 """Internal wrapper caching __getitem__ of generic types with a fallback to
289 original function for non-hashable arguments.
290 """
Yurii Karabasf03d3182020-11-17 04:23:19 +0200291 def decorator(func):
292 cached = functools.lru_cache(typed=typed)(func)
293 _cleanups.append(cached.cache_clear)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000294
Yurii Karabasf03d3182020-11-17 04:23:19 +0200295 @functools.wraps(func)
296 def inner(*args, **kwds):
297 try:
298 return cached(*args, **kwds)
299 except TypeError:
300 pass # All real errors (not unhashable args) are raised below.
301 return func(*args, **kwds)
302 return inner
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000303
Yurii Karabasf03d3182020-11-17 04:23:19 +0200304 if func is not None:
305 return decorator(func)
306
307 return decorator
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000308
wyfo653f4202020-07-22 21:47:28 +0200309def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
Graham Bleaney84ef33c2020-09-08 18:41:10 -0400310 """Evaluate all forward references in the given type t.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000311 For use of globalns and localns see the docstring for get_type_hints().
wyfo653f4202020-07-22 21:47:28 +0200312 recursive_guard is used to prevent prevent infinite recursion
313 with recursive ForwardRef.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000314 """
315 if isinstance(t, ForwardRef):
wyfo653f4202020-07-22 21:47:28 +0200316 return t._evaluate(globalns, localns, recursive_guard)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300317 if isinstance(t, (_GenericAlias, GenericAlias)):
wyfo653f4202020-07-22 21:47:28 +0200318 ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000319 if ev_args == t.__args__:
320 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300321 if isinstance(t, GenericAlias):
322 return GenericAlias(t.__origin__, ev_args)
323 else:
324 return t.copy_with(ev_args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000325 return t
326
327
328class _Final:
329 """Mixin to prohibit subclassing"""
Guido van Rossum4cefe742016-09-27 15:20:12 -0700330
Guido van Rossum83ec3022017-01-17 20:43:28 -0800331 __slots__ = ('__weakref__',)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700332
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300333 def __init_subclass__(self, /, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000334 if '_root' not in kwds:
335 raise TypeError("Cannot subclass special typing classes")
336
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100337class _Immutable:
338 """Mixin to indicate that object should not be copied."""
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300339 __slots__ = ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000340
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100341 def __copy__(self):
342 return self
343
344 def __deepcopy__(self, memo):
345 return self
346
347
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300348# Internal indicator of special typing constructs.
349# See __doc__ instance attribute for specific docs.
350class _SpecialForm(_Final, _root=True):
351 __slots__ = ('_name', '__doc__', '_getitem')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000352
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300353 def __init__(self, getitem):
354 self._getitem = getitem
355 self._name = getitem.__name__
356 self.__doc__ = getitem.__doc__
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000357
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300358 def __mro_entries__(self, bases):
359 raise TypeError(f"Cannot subclass {self!r}")
Guido van Rossum4cefe742016-09-27 15:20:12 -0700360
361 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000362 return 'typing.' + self._name
363
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100364 def __reduce__(self):
365 return self._name
Guido van Rossum4cefe742016-09-27 15:20:12 -0700366
367 def __call__(self, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000368 raise TypeError(f"Cannot instantiate {self!r}")
369
370 def __instancecheck__(self, obj):
371 raise TypeError(f"{self} cannot be used with isinstance()")
372
373 def __subclasscheck__(self, cls):
374 raise TypeError(f"{self} cannot be used with issubclass()")
375
376 @_tp_cache
377 def __getitem__(self, parameters):
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300378 return self._getitem(self, parameters)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700379
Yurii Karabasf03d3182020-11-17 04:23:19 +0200380
381class _LiteralSpecialForm(_SpecialForm, _root=True):
382 @_tp_cache(typed=True)
383 def __getitem__(self, parameters):
384 return self._getitem(self, parameters)
385
386
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300387@_SpecialForm
388def Any(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000389 """Special type indicating an unconstrained type.
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700390
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000391 - Any is compatible with every type.
392 - Any assumed to have all methods.
393 - All values assumed to be instances of Any.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700394
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000395 Note that all the above statements are true from the point of view of
396 static type checkers. At runtime, Any should not be used with instance
397 or class checks.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300398 """
399 raise TypeError(f"{self} is not subscriptable")
Guido van Rossumd70fe632015-08-05 12:11:06 +0200400
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300401@_SpecialForm
402def NoReturn(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000403 """Special type indicating functions that never return.
404 Example::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700405
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000406 from typing import NoReturn
407
408 def stop() -> NoReturn:
409 raise Exception('no way')
410
411 This type is invalid in other positions, e.g., ``List[NoReturn]``
412 will fail in static type checkers.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300413 """
414 raise TypeError(f"{self} is not subscriptable")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000415
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300416@_SpecialForm
417def ClassVar(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000418 """Special type construct to mark class variables.
419
420 An annotation wrapped in ClassVar indicates that a given
421 attribute is intended to be used as a class variable and
422 should not be set on instances of that class. Usage::
423
424 class Starship:
425 stats: ClassVar[Dict[str, int]] = {} # class variable
426 damage: int = 10 # instance variable
427
428 ClassVar accepts only types and cannot be further subscribed.
429
430 Note that ClassVar is not a class itself, and should not
431 be used with isinstance() or issubclass().
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300432 """
433 item = _type_check(parameters, f'{self} accepts only single type.')
434 return _GenericAlias(self, (item,))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000435
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300436@_SpecialForm
437def Final(self, parameters):
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100438 """Special typing construct to indicate final names to type checkers.
439
440 A final name cannot be re-assigned or overridden in a subclass.
441 For example:
442
443 MAX_SIZE: Final = 9000
444 MAX_SIZE += 1 # Error reported by type checker
445
446 class Connection:
447 TIMEOUT: Final[int] = 10
448
449 class FastConnector(Connection):
450 TIMEOUT = 1 # Error reported by type checker
451
452 There is no runtime checking of these properties.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300453 """
454 item = _type_check(parameters, f'{self} accepts only single type.')
455 return _GenericAlias(self, (item,))
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100456
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300457@_SpecialForm
458def Union(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000459 """Union type; Union[X, Y] means either X or Y.
460
461 To define a union, use e.g. Union[int, str]. Details:
462 - The arguments must be types and there must be at least one.
463 - None as an argument is a special case and is replaced by
464 type(None).
465 - Unions of unions are flattened, e.g.::
466
467 Union[Union[int, str], float] == Union[int, str, float]
468
469 - Unions of a single argument vanish, e.g.::
470
471 Union[int] == int # The constructor actually returns int
472
473 - Redundant arguments are skipped, e.g.::
474
475 Union[int, str, int] == Union[int, str]
476
477 - When comparing unions, the argument order is ignored, e.g.::
478
479 Union[int, str] == Union[str, int]
480
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000481 - You cannot subclass or instantiate a union.
482 - You can use Optional[X] as a shorthand for Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300483 """
484 if parameters == ():
485 raise TypeError("Cannot take a Union of no types.")
486 if not isinstance(parameters, tuple):
487 parameters = (parameters,)
488 msg = "Union[arg, ...]: each arg must be a type."
489 parameters = tuple(_type_check(p, msg) for p in parameters)
490 parameters = _remove_dups_flatten(parameters)
491 if len(parameters) == 1:
492 return parameters[0]
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300493 return _UnionGenericAlias(self, parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000494
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300495@_SpecialForm
496def Optional(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000497 """Optional type.
498
499 Optional[X] is equivalent to Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300500 """
501 arg = _type_check(parameters, f"{self} requires a single type.")
502 return Union[arg, type(None)]
Guido van Rossumb7dedc82016-10-29 12:44:29 -0700503
Yurii Karabasf03d3182020-11-17 04:23:19 +0200504@_LiteralSpecialForm
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300505def Literal(self, parameters):
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100506 """Special typing form to define literal types (a.k.a. value types).
507
508 This form can be used to indicate to type checkers that the corresponding
509 variable or function parameter has a value equivalent to the provided
510 literal (or one of several literals):
511
512 def validate_simple(data: Any) -> Literal[True]: # always returns True
513 ...
514
515 MODE = Literal['r', 'rb', 'w', 'wb']
516 def open_helper(file: str, mode: MODE) -> str:
517 ...
518
519 open_helper('/some/path', 'r') # Passes type check
520 open_helper('/other/path', 'typo') # Error in type checker
521
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300522 Literal[...] cannot be subclassed. At runtime, an arbitrary value
523 is allowed as type argument to Literal[...], but type checkers may
524 impose restrictions.
525 """
526 # There is no '_type_check' call because arguments to Literal[...] are
527 # values, not types.
Yurii Karabasf03d3182020-11-17 04:23:19 +0200528 if not isinstance(parameters, tuple):
529 parameters = (parameters,)
530
531 parameters = _flatten_literal_params(parameters)
532
533 try:
534 parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
535 except TypeError: # unhashable parameters
536 pass
537
538 return _LiteralGenericAlias(self, parameters)
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100539
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700540
Mikhail Golubev4f3c2502020-10-08 00:44:31 +0300541@_SpecialForm
542def TypeAlias(self, parameters):
543 """Special marker indicating that an assignment should
544 be recognized as a proper type alias definition by type
545 checkers.
546
547 For example::
548
549 Predicate: TypeAlias = Callable[..., bool]
550
551 It's invalid when used anywhere except as in the example above.
552 """
553 raise TypeError(f"{self} is not subscriptable")
554
555
kj73607be2020-12-24 12:33:48 +0800556@_SpecialForm
557def Concatenate(self, parameters):
Ken Jin11276cd2021-01-02 08:45:50 +0800558 """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a
559 higher order function which adds, removes or transforms parameters of a
560 callable.
kj73607be2020-12-24 12:33:48 +0800561
562 For example::
563
564 Callable[Concatenate[int, P], int]
565
566 See PEP 612 for detailed information.
567 """
568 if parameters == ():
569 raise TypeError("Cannot take a Concatenate of no types.")
570 if not isinstance(parameters, tuple):
571 parameters = (parameters,)
572 if not isinstance(parameters[-1], ParamSpec):
573 raise TypeError("The last parameter to Concatenate should be a "
574 "ParamSpec variable.")
575 msg = "Concatenate[arg, ...]: each arg must be a type."
576 parameters = tuple(_type_check(p, msg) for p in parameters)
577 return _ConcatenateGenericAlias(self, parameters)
578
579
Ken Jin05ab4b62021-04-27 22:31:04 +0800580@_SpecialForm
581def TypeGuard(self, parameters):
582 """Special typing form used to annotate the return type of a user-defined
583 type guard function. ``TypeGuard`` only accepts a single type argument.
584 At runtime, functions marked this way should return a boolean.
585
586 ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static
587 type checkers to determine a more precise type of an expression within a
588 program's code flow. Usually type narrowing is done by analyzing
589 conditional code flow and applying the narrowing to a block of code. The
590 conditional expression here is sometimes referred to as a "type guard".
591
592 Sometimes it would be convenient to use a user-defined boolean function
593 as a type guard. Such a function should use ``TypeGuard[...]`` as its
594 return type to alert static type checkers to this intention.
595
596 Using ``-> TypeGuard`` tells the static type checker that for a given
597 function:
598
599 1. The return value is a boolean.
600 2. If the return value is ``True``, the type of its argument
601 is the type inside ``TypeGuard``.
602
603 For example::
604
605 def is_str(val: Union[str, float]):
606 # "isinstance" type guard
607 if isinstance(val, str):
608 # Type of ``val`` is narrowed to ``str``
609 ...
610 else:
611 # Else, type of ``val`` is narrowed to ``float``.
612 ...
613
614 Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower
615 form of ``TypeA`` (it can even be a wider form) and this may lead to
616 type-unsafe results. The main reason is to allow for things like
617 narrowing ``List[object]`` to ``List[str]`` even though the latter is not
618 a subtype of the former, since ``List`` is invariant. The responsibility of
619 writing type-safe type guards is left to the user.
620
621 ``TypeGuard`` also works with type variables. For more information, see
622 PEP 647 (User-Defined Type Guards).
623 """
624 item = _type_check(parameters, f'{self} accepts only single type.')
625 return _GenericAlias(self, (item,))
626
627
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000628class ForwardRef(_Final, _root=True):
Guido van Rossumb24569a2016-11-20 18:01:29 -0800629 """Internal wrapper to hold a forward reference."""
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700630
Guido van Rossum4cefe742016-09-27 15:20:12 -0700631 __slots__ = ('__forward_arg__', '__forward_code__',
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400632 '__forward_evaluated__', '__forward_value__',
633 '__forward_is_argument__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700634
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700635 def __init__(self, arg, is_argument=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700636 if not isinstance(arg, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000637 raise TypeError(f"Forward reference must be a string -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700638 try:
639 code = compile(arg, '<string>', 'eval')
640 except SyntaxError:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000641 raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700642 self.__forward_arg__ = arg
643 self.__forward_code__ = code
644 self.__forward_evaluated__ = False
645 self.__forward_value__ = None
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400646 self.__forward_is_argument__ = is_argument
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700647
wyfo653f4202020-07-22 21:47:28 +0200648 def _evaluate(self, globalns, localns, recursive_guard):
649 if self.__forward_arg__ in recursive_guard:
650 return self
Guido van Rossumdad17902016-11-10 08:29:18 -0800651 if not self.__forward_evaluated__ or localns is not globalns:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700652 if globalns is None and localns is None:
653 globalns = localns = {}
654 elif globalns is None:
655 globalns = localns
656 elif localns is None:
657 localns = globalns
wyfo653f4202020-07-22 21:47:28 +0200658 type_ =_type_check(
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700659 eval(self.__forward_code__, globalns, localns),
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400660 "Forward references must evaluate to types.",
wyfo653f4202020-07-22 21:47:28 +0200661 is_argument=self.__forward_is_argument__,
662 )
663 self.__forward_value__ = _eval_type(
664 type_, globalns, localns, recursive_guard | {self.__forward_arg__}
665 )
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700666 self.__forward_evaluated__ = True
667 return self.__forward_value__
668
Guido van Rossum4cefe742016-09-27 15:20:12 -0700669 def __eq__(self, other):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000670 if not isinstance(other, ForwardRef):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700671 return NotImplemented
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100672 if self.__forward_evaluated__ and other.__forward_evaluated__:
673 return (self.__forward_arg__ == other.__forward_arg__ and
674 self.__forward_value__ == other.__forward_value__)
675 return self.__forward_arg__ == other.__forward_arg__
Guido van Rossum4cefe742016-09-27 15:20:12 -0700676
677 def __hash__(self):
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100678 return hash(self.__forward_arg__)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700679
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700680 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000681 return f'ForwardRef({self.__forward_arg__!r})'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700682
kj73607be2020-12-24 12:33:48 +0800683class _TypeVarLike:
684 """Mixin for TypeVar-like types (TypeVar and ParamSpec)."""
685 def __init__(self, bound, covariant, contravariant):
686 """Used to setup TypeVars and ParamSpec's bound, covariant and
687 contravariant attributes.
688 """
689 if covariant and contravariant:
690 raise ValueError("Bivariant types are not supported.")
691 self.__covariant__ = bool(covariant)
692 self.__contravariant__ = bool(contravariant)
693 if bound:
694 self.__bound__ = _type_check(bound, "Bound must be a type.")
695 else:
696 self.__bound__ = None
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700697
kj73607be2020-12-24 12:33:48 +0800698 def __or__(self, right):
699 return Union[self, right]
700
Jelle Zijlstra90459192021-04-10 20:00:05 -0700701 def __ror__(self, left):
702 return Union[left, self]
kj73607be2020-12-24 12:33:48 +0800703
704 def __repr__(self):
705 if self.__covariant__:
706 prefix = '+'
707 elif self.__contravariant__:
708 prefix = '-'
709 else:
710 prefix = '~'
711 return prefix + self.__name__
712
713 def __reduce__(self):
714 return self.__name__
715
716
717class TypeVar( _Final, _Immutable, _TypeVarLike, _root=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700718 """Type variable.
719
720 Usage::
721
722 T = TypeVar('T') # Can be anything
723 A = TypeVar('A', str, bytes) # Must be str or bytes
724
725 Type variables exist primarily for the benefit of static type
726 checkers. They serve as the parameters for generic types as well
727 as for generic function definitions. See class Generic for more
728 information on generic types. Generic functions work as follows:
729
Guido van Rossumb24569a2016-11-20 18:01:29 -0800730 def repeat(x: T, n: int) -> List[T]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700731 '''Return a list containing n references to x.'''
732 return [x]*n
733
734 def longest(x: A, y: A) -> A:
735 '''Return the longest of two strings.'''
736 return x if len(x) >= len(y) else y
737
738 The latter example's signature is essentially the overloading
739 of (str, str) -> str and (bytes, bytes) -> bytes. Also note
740 that if the arguments are instances of some subclass of str,
741 the return type is still plain str.
742
Guido van Rossumb24569a2016-11-20 18:01:29 -0800743 At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700744
Guido van Rossumefa798d2016-08-23 11:01:50 -0700745 Type variables defined with covariant=True or contravariant=True
João D. Ferreira86bfed32018-07-07 16:41:20 +0100746 can be used to declare covariant or contravariant generic types.
Guido van Rossumefa798d2016-08-23 11:01:50 -0700747 See PEP 484 for more details. By default generic types are invariant
748 in all type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700749
750 Type variables can be introspected. e.g.:
751
752 T.__name__ == 'T'
753 T.__constraints__ == ()
754 T.__covariant__ == False
755 T.__contravariant__ = False
756 A.__constraints__ == (str, bytes)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100757
758 Note that only type variables defined in global scope can be pickled.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700759 """
760
Guido van Rossum4cefe742016-09-27 15:20:12 -0700761 __slots__ = ('__name__', '__bound__', '__constraints__',
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300762 '__covariant__', '__contravariant__', '__dict__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700763
764 def __init__(self, name, *constraints, bound=None,
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800765 covariant=False, contravariant=False):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700766 self.__name__ = name
kj73607be2020-12-24 12:33:48 +0800767 super().__init__(bound, covariant, contravariant)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700768 if constraints and bound is not None:
769 raise TypeError("Constraints cannot be combined with bound=...")
770 if constraints and len(constraints) == 1:
771 raise TypeError("A single constraint is not allowed")
772 msg = "TypeVar(name, constraint, ...): constraints must be types."
773 self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
HongWeipenga25a04f2020-04-21 04:01:53 +0800774 try:
775 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling
776 except (AttributeError, ValueError):
777 def_mod = None
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300778 if def_mod != 'typing':
779 self.__module__ = def_mod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700780
Maggie Moss1b4552c2020-09-09 13:23:24 -0700781
Jelle Zijlstra52243362021-04-10 19:57:05 -0700782class ParamSpecArgs(_Final, _Immutable, _root=True):
783 """The args for a ParamSpec object.
784
785 Given a ParamSpec object P, P.args is an instance of ParamSpecArgs.
786
787 ParamSpecArgs objects have a reference back to their ParamSpec:
788
789 P.args.__origin__ is P
790
791 This type is meant for runtime introspection and has no special meaning to
792 static type checkers.
793 """
794 def __init__(self, origin):
795 self.__origin__ = origin
796
797 def __repr__(self):
798 return f"{self.__origin__.__name__}.args"
799
800
801class ParamSpecKwargs(_Final, _Immutable, _root=True):
802 """The kwargs for a ParamSpec object.
803
804 Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs.
805
806 ParamSpecKwargs objects have a reference back to their ParamSpec:
807
808 P.kwargs.__origin__ is P
809
810 This type is meant for runtime introspection and has no special meaning to
811 static type checkers.
812 """
813 def __init__(self, origin):
814 self.__origin__ = origin
815
816 def __repr__(self):
817 return f"{self.__origin__.__name__}.kwargs"
818
819
kj73607be2020-12-24 12:33:48 +0800820class ParamSpec(_Final, _Immutable, _TypeVarLike, _root=True):
821 """Parameter specification variable.
Maggie Moss1b4552c2020-09-09 13:23:24 -0700822
kj73607be2020-12-24 12:33:48 +0800823 Usage::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700824
kj73607be2020-12-24 12:33:48 +0800825 P = ParamSpec('P')
826
827 Parameter specification variables exist primarily for the benefit of static
828 type checkers. They are used to forward the parameter types of one
Ken Jin11276cd2021-01-02 08:45:50 +0800829 callable to another callable, a pattern commonly found in higher order
830 functions and decorators. They are only valid when used in ``Concatenate``,
831 or s the first argument to ``Callable``, or as parameters for user-defined
832 Generics. See class Generic for more information on generic types. An
833 example for annotating a decorator::
kj73607be2020-12-24 12:33:48 +0800834
835 T = TypeVar('T')
836 P = ParamSpec('P')
837
838 def add_logging(f: Callable[P, T]) -> Callable[P, T]:
839 '''A type-safe decorator to add logging to a function.'''
840 def inner(*args: P.args, **kwargs: P.kwargs) -> T:
841 logging.info(f'{f.__name__} was called')
842 return f(*args, **kwargs)
843 return inner
844
845 @add_logging
846 def add_two(x: float, y: float) -> float:
847 '''Add two numbers together.'''
848 return x + y
849
850 Parameter specification variables defined with covariant=True or
851 contravariant=True can be used to declare covariant or contravariant
852 generic types. These keyword arguments are valid, but their actual semantics
853 are yet to be decided. See PEP 612 for details.
854
855 Parameter specification variables can be introspected. e.g.:
856
857 P.__name__ == 'T'
858 P.__bound__ == None
859 P.__covariant__ == False
860 P.__contravariant__ == False
861
862 Note that only parameter specification variables defined in global scope can
863 be pickled.
864 """
865
866 __slots__ = ('__name__', '__bound__', '__covariant__', '__contravariant__',
867 '__dict__')
868
Jelle Zijlstra52243362021-04-10 19:57:05 -0700869 @property
870 def args(self):
871 return ParamSpecArgs(self)
872
873 @property
874 def kwargs(self):
875 return ParamSpecKwargs(self)
kj73607be2020-12-24 12:33:48 +0800876
Ken Jinace008c2021-01-11 08:11:41 +0800877 def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
kj73607be2020-12-24 12:33:48 +0800878 self.__name__ = name
879 super().__init__(bound, covariant, contravariant)
880 try:
881 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
882 except (AttributeError, ValueError):
883 def_mod = None
884 if def_mod != 'typing':
885 self.__module__ = def_mod
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100886
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700887
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000888def _is_dunder(attr):
889 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800890
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300891class _BaseGenericAlias(_Final, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000892 """The central part of internal API.
893
894 This represents a generic version of type 'origin' with type arguments 'params'.
895 There are two kind of these aliases: user defined and special. The special ones
896 are wrappers around builtin collections and ABCs in collections.abc. These must
897 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
898 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700899 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300900 def __init__(self, origin, *, inst=True, name=None):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000901 self._inst = inst
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000902 self._name = name
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700903 self.__origin__ = origin
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000904 self.__slots__ = None # This is not documented.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300905
906 def __call__(self, *args, **kwargs):
907 if not self._inst:
908 raise TypeError(f"Type {self._name} cannot be instantiated; "
909 f"use {self.__origin__.__name__}() instead")
910 result = self.__origin__(*args, **kwargs)
911 try:
912 result.__orig_class__ = self
913 except AttributeError:
914 pass
915 return result
916
917 def __mro_entries__(self, bases):
918 res = []
919 if self.__origin__ not in bases:
920 res.append(self.__origin__)
921 i = bases.index(self)
922 for b in bases[i+1:]:
923 if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
924 break
925 else:
926 res.append(Generic)
927 return tuple(res)
928
929 def __getattr__(self, attr):
930 # We are careful for copy and pickle.
931 # Also for simplicity we just don't relay all dunder names
932 if '__origin__' in self.__dict__ and not _is_dunder(attr):
933 return getattr(self.__origin__, attr)
934 raise AttributeError(attr)
935
936 def __setattr__(self, attr, val):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700937 if _is_dunder(attr) or attr in {'_name', '_inst', '_nparams',
938 '_typevar_types', '_paramspec_tvars'}:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300939 super().__setattr__(attr, val)
940 else:
941 setattr(self.__origin__, attr, val)
942
943 def __instancecheck__(self, obj):
944 return self.__subclasscheck__(type(obj))
945
946 def __subclasscheck__(self, cls):
947 raise TypeError("Subscripted generics cannot be used with"
948 " class and instance checks")
949
950
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300951# Special typing constructs Union, Optional, Generic, Callable and Tuple
952# use three special attributes for internal bookkeeping of generic types:
953# * __parameters__ is a tuple of unique free type parameters of a generic
954# type, for example, Dict[T, T].__parameters__ == (T,);
955# * __origin__ keeps a reference to a type that was subscripted,
956# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
957# the type.
958# * __args__ is a tuple of all arguments used in subscripting,
959# e.g., Dict[T, int].__args__ == (T, int).
960
961
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300962class _GenericAlias(_BaseGenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700963 def __init__(self, origin, params, *, inst=True, name=None,
964 _typevar_types=TypeVar,
965 _paramspec_tvars=False):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300966 super().__init__(origin, inst=inst, name=name)
967 if not isinstance(params, tuple):
968 params = (params,)
969 self.__args__ = tuple(... if a is _TypingEllipsis else
970 () if a is _TypingEmpty else
971 a for a in params)
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -0700972 self.__parameters__ = _collect_type_vars(params, typevar_types=_typevar_types)
973 self._typevar_types = _typevar_types
974 self._paramspec_tvars = _paramspec_tvars
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300975 if not name:
976 self.__module__ = origin.__module__
977
978 def __eq__(self, other):
979 if not isinstance(other, _GenericAlias):
980 return NotImplemented
981 return (self.__origin__ == other.__origin__
982 and self.__args__ == other.__args__)
983
984 def __hash__(self):
985 return hash((self.__origin__, self.__args__))
986
Maggie Moss1b4552c2020-09-09 13:23:24 -0700987 def __or__(self, right):
988 return Union[self, right]
989
990 def __ror__(self, right):
991 return Union[self, right]
992
Guido van Rossum4cefe742016-09-27 15:20:12 -0700993 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700994 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100995 if self.__origin__ in (Generic, Protocol):
996 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000997 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700998 if not isinstance(params, tuple):
999 params = (params,)
kj73607be2020-12-24 12:33:48 +08001000 params = tuple(_type_convert(p) for p in params)
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001001 if self._paramspec_tvars:
1002 if any(isinstance(t, ParamSpec) for t in self.__parameters__):
1003 params = _prepare_paramspec_params(self, params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001004 _check_generic(self, params, len(self.__parameters__))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001005
1006 subst = dict(zip(self.__parameters__, params))
1007 new_args = []
1008 for arg in self.__args__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001009 if isinstance(arg, self._typevar_types):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001010 arg = subst[arg]
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001011 elif isinstance(arg, (_GenericAlias, GenericAlias)):
Serhiy Storchaka0122d482020-05-10 13:39:40 +03001012 subparams = arg.__parameters__
1013 if subparams:
1014 subargs = tuple(subst[x] for x in subparams)
1015 arg = arg[subargs]
kj73607be2020-12-24 12:33:48 +08001016 # Required to flatten out the args for CallableGenericAlias
1017 if self.__origin__ == collections.abc.Callable and isinstance(arg, tuple):
1018 new_args.extend(arg)
1019 else:
1020 new_args.append(arg)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001021 return self.copy_with(tuple(new_args))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001022
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001023 def copy_with(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001024 return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001025
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001026 def __repr__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001027 if self._name:
1028 name = 'typing.' + self._name
1029 else:
1030 name = _type_repr(self.__origin__)
1031 args = ", ".join([_type_repr(a) for a in self.__args__])
1032 return f'{name}[{args}]'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001033
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001034 def __reduce__(self):
1035 if self._name:
1036 origin = globals()[self._name]
1037 else:
1038 origin = self.__origin__
1039 args = tuple(self.__args__)
1040 if len(args) == 1 and not isinstance(args[0], tuple):
1041 args, = args
1042 return operator.getitem, (origin, args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001043
1044 def __mro_entries__(self, bases):
1045 if self._name: # generic version of an ABC or built-in class
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001046 return super().__mro_entries__(bases)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001047 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001048 if Protocol in bases:
1049 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001050 i = bases.index(self)
1051 for b in bases[i+1:]:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001052 if isinstance(b, _BaseGenericAlias) and b is not self:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001053 return ()
1054 return (self.__origin__,)
1055
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001056
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001057# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
1058# 1 for List and 2 for Dict. It may be -1 if variable number of
1059# parameters are accepted (needs custom __getitem__).
1060
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001061class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001062 def __init__(self, origin, nparams, *, inst=True, name=None):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001063 if name is None:
1064 name = origin.__name__
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001065 super().__init__(origin, inst=inst, name=name)
1066 self._nparams = nparams
Serhiy Storchaka2fbc57a2020-05-10 15:14:27 +03001067 if origin.__module__ == 'builtins':
1068 self.__doc__ = f'A generic version of {origin.__qualname__}.'
1069 else:
1070 self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001071
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001072 @_tp_cache
1073 def __getitem__(self, params):
1074 if not isinstance(params, tuple):
1075 params = (params,)
1076 msg = "Parameters to generic types must be types."
1077 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001078 _check_generic(self, params, self._nparams)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001079 return self.copy_with(params)
1080
1081 def copy_with(self, params):
1082 return _GenericAlias(self.__origin__, params,
1083 name=self._name, inst=self._inst)
1084
1085 def __repr__(self):
1086 return 'typing.' + self._name
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001087
1088 def __subclasscheck__(self, cls):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001089 if isinstance(cls, _SpecialGenericAlias):
1090 return issubclass(cls.__origin__, self.__origin__)
1091 if not isinstance(cls, _GenericAlias):
1092 return issubclass(cls, self.__origin__)
1093 return super().__subclasscheck__(cls)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001094
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001095 def __reduce__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001096 return self._name
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001097
Maggie Moss1b4552c2020-09-09 13:23:24 -07001098 def __or__(self, right):
1099 return Union[self, right]
1100
1101 def __ror__(self, right):
1102 return Union[self, right]
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001103
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001104class _CallableGenericAlias(_GenericAlias, _root=True):
1105 def __repr__(self):
1106 assert self._name == 'Callable'
kj73607be2020-12-24 12:33:48 +08001107 args = self.__args__
1108 if len(args) == 2 and (args[0] is Ellipsis
1109 or isinstance(args[0], (ParamSpec, _ConcatenateGenericAlias))):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001110 return super().__repr__()
1111 return (f'typing.Callable'
kj73607be2020-12-24 12:33:48 +08001112 f'[[{", ".join([_type_repr(a) for a in args[:-1]])}], '
1113 f'{_type_repr(args[-1])}]')
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001114
1115 def __reduce__(self):
1116 args = self.__args__
kj73607be2020-12-24 12:33:48 +08001117 if not (len(args) == 2 and (args[0] is Ellipsis
1118 or isinstance(args[0], (ParamSpec, _ConcatenateGenericAlias)))):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001119 args = list(args[:-1]), args[-1]
1120 return operator.getitem, (Callable, args)
1121
1122
1123class _CallableType(_SpecialGenericAlias, _root=True):
1124 def copy_with(self, params):
1125 return _CallableGenericAlias(self.__origin__, params,
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001126 name=self._name, inst=self._inst,
1127 _typevar_types=(TypeVar, ParamSpec),
1128 _paramspec_tvars=True)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001129
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001130 def __getitem__(self, params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001131 if not isinstance(params, tuple) or len(params) != 2:
1132 raise TypeError("Callable must be used as "
1133 "Callable[[arg, ...], result].")
1134 args, result = params
kj463c7d32020-12-14 02:38:24 +08001135 # This relaxes what args can be on purpose to allow things like
1136 # PEP 612 ParamSpec. Responsibility for whether a user is using
1137 # Callable[...] properly is deferred to static type checkers.
1138 if isinstance(args, list):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001139 params = (tuple(args), result)
kj463c7d32020-12-14 02:38:24 +08001140 else:
1141 params = (args, result)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001142 return self.__getitem_inner__(params)
1143
1144 @_tp_cache
1145 def __getitem_inner__(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001146 args, result = params
1147 msg = "Callable[args, result]: result must be a type."
1148 result = _type_check(result, msg)
1149 if args is Ellipsis:
1150 return self.copy_with((_TypingEllipsis, result))
kj463c7d32020-12-14 02:38:24 +08001151 if not isinstance(args, tuple):
1152 args = (args,)
1153 args = tuple(_type_convert(arg) for arg in args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001154 params = args + (result,)
1155 return self.copy_with(params)
1156
1157
1158class _TupleType(_SpecialGenericAlias, _root=True):
1159 @_tp_cache
1160 def __getitem__(self, params):
1161 if params == ():
1162 return self.copy_with((_TypingEmpty,))
1163 if not isinstance(params, tuple):
1164 params = (params,)
1165 if len(params) == 2 and params[1] is ...:
1166 msg = "Tuple[t, ...]: t must be a type."
1167 p = _type_check(params[0], msg)
1168 return self.copy_with((p, _TypingEllipsis))
1169 msg = "Tuple[t0, t1, ...]: each t must be a type."
1170 params = tuple(_type_check(p, msg) for p in params)
1171 return self.copy_with(params)
1172
1173
1174class _UnionGenericAlias(_GenericAlias, _root=True):
1175 def copy_with(self, params):
1176 return Union[params]
1177
1178 def __eq__(self, other):
1179 if not isinstance(other, _UnionGenericAlias):
1180 return NotImplemented
1181 return set(self.__args__) == set(other.__args__)
1182
1183 def __hash__(self):
1184 return hash(frozenset(self.__args__))
1185
1186 def __repr__(self):
1187 args = self.__args__
1188 if len(args) == 2:
1189 if args[0] is type(None):
1190 return f'typing.Optional[{_type_repr(args[1])}]'
1191 elif args[1] is type(None):
1192 return f'typing.Optional[{_type_repr(args[0])}]'
1193 return super().__repr__()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001194
Maggie Moss1b4552c2020-09-09 13:23:24 -07001195 def __instancecheck__(self, obj):
1196 return self.__subclasscheck__(type(obj))
1197
1198 def __subclasscheck__(self, cls):
1199 for arg in self.__args__:
1200 if issubclass(cls, arg):
1201 return True
1202
1203
Yurii Karabasf03d3182020-11-17 04:23:19 +02001204def _value_and_type_iter(parameters):
1205 return ((p, type(p)) for p in parameters)
1206
1207
1208class _LiteralGenericAlias(_GenericAlias, _root=True):
1209
1210 def __eq__(self, other):
1211 if not isinstance(other, _LiteralGenericAlias):
1212 return NotImplemented
1213
1214 return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__))
1215
1216 def __hash__(self):
Yurii Karabas1b540772020-11-19 18:17:38 +02001217 return hash(frozenset(_value_and_type_iter(self.__args__)))
Yurii Karabasf03d3182020-11-17 04:23:19 +02001218
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001219
kj73607be2020-12-24 12:33:48 +08001220class _ConcatenateGenericAlias(_GenericAlias, _root=True):
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001221 def __init__(self, *args, **kwargs):
1222 super().__init__(*args, **kwargs,
1223 _typevar_types=(TypeVar, ParamSpec),
1224 _paramspec_tvars=True)
kj73607be2020-12-24 12:33:48 +08001225
1226
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001227class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001228 """Abstract base class for generic types.
1229
Guido van Rossumb24569a2016-11-20 18:01:29 -08001230 A generic type is typically declared by inheriting from
1231 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001232 For example, a generic mapping type might be defined as::
1233
1234 class Mapping(Generic[KT, VT]):
1235 def __getitem__(self, key: KT) -> VT:
1236 ...
1237 # Etc.
1238
1239 This class can then be used as follows::
1240
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001241 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001242 try:
1243 return mapping[key]
1244 except KeyError:
1245 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001246 """
Guido van Rossumd70fe632015-08-05 12:11:06 +02001247 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001248 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +02001249
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001250 @_tp_cache
1251 def __class_getitem__(cls, params):
1252 if not isinstance(params, tuple):
1253 params = (params,)
1254 if not params and cls is not Tuple:
1255 raise TypeError(
1256 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
kj73607be2020-12-24 12:33:48 +08001257 params = tuple(_type_convert(p) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001258 if cls in (Generic, Protocol):
1259 # Generic and Protocol can only be subscripted with unique type variables.
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001260 if not all(isinstance(p, (TypeVar, ParamSpec)) for p in params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001261 raise TypeError(
kj73607be2020-12-24 12:33:48 +08001262 f"Parameters to {cls.__name__}[...] must all be type variables "
1263 f"or parameter specification variables.")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001264 if len(set(params)) != len(params):
1265 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001266 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001267 else:
1268 # Subscripting a regular Generic subclass.
kj73607be2020-12-24 12:33:48 +08001269 if any(isinstance(t, ParamSpec) for t in cls.__parameters__):
1270 params = _prepare_paramspec_params(cls, params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001271 _check_generic(cls, params, len(cls.__parameters__))
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001272 return _GenericAlias(cls, params,
1273 _typevar_types=(TypeVar, ParamSpec),
1274 _paramspec_tvars=True)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001275
1276 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +01001277 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001278 tvars = []
1279 if '__orig_bases__' in cls.__dict__:
1280 error = Generic in cls.__orig_bases__
1281 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001282 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001283 if error:
1284 raise TypeError("Cannot inherit from plain Generic")
1285 if '__orig_bases__' in cls.__dict__:
Miss Islington (bot)c55ff1b2021-05-13 10:19:24 -07001286 tvars = _collect_type_vars(cls.__orig_bases__, (TypeVar, ParamSpec))
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001287 # Look for Generic[T1, ..., Tn].
1288 # If found, tvars must be a subset of it.
1289 # If not found, tvars is it.
1290 # Also check for and reject plain Generic,
1291 # and reject multiple Generic[...].
1292 gvars = None
1293 for base in cls.__orig_bases__:
1294 if (isinstance(base, _GenericAlias) and
1295 base.__origin__ is Generic):
1296 if gvars is not None:
1297 raise TypeError(
1298 "Cannot inherit from Generic[...] multiple types.")
1299 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001300 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001301 tvarset = set(tvars)
1302 gvarset = set(gvars)
1303 if not tvarset <= gvarset:
1304 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
1305 s_args = ', '.join(str(g) for g in gvars)
1306 raise TypeError(f"Some type variables ({s_vars}) are"
1307 f" not listed in Generic[{s_args}]")
1308 tvars = gvars
1309 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001310
1311
1312class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001313 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
1314 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001315 to sneak in where prohibited.
1316 """
1317
1318
1319class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001320 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001321
1322
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001323_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
1324 '_is_protocol', '_is_runtime_protocol']
1325
1326_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
1327 '__init__', '__module__', '__new__', '__slots__',
Guido van Rossum48b069a2020-04-07 09:50:06 -07001328 '__subclasshook__', '__weakref__', '__class_getitem__']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001329
1330# These special attributes will be not collected as protocol members.
1331EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
1332
1333
1334def _get_protocol_attrs(cls):
1335 """Collect protocol members from a protocol class objects.
1336
1337 This includes names actually defined in the class dictionary, as well
1338 as names that appear in annotations. Special names (above) are skipped.
1339 """
1340 attrs = set()
1341 for base in cls.__mro__[:-1]: # without object
1342 if base.__name__ in ('Protocol', 'Generic'):
1343 continue
1344 annotations = getattr(base, '__annotations__', {})
1345 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
1346 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
1347 attrs.add(attr)
1348 return attrs
1349
1350
1351def _is_callable_members_only(cls):
1352 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
1353 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
1354
1355
1356def _no_init(self, *args, **kwargs):
1357 if type(self)._is_protocol:
1358 raise TypeError('Protocols cannot be instantiated')
1359
1360
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001361def _allow_reckless_class_checks(depth=3):
Nickolena Fishercfaf4c02020-04-26 12:49:11 -05001362 """Allow instance and class checks for special stdlib modules.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001363
1364 The abc and functools modules indiscriminately call isinstance() and
1365 issubclass() on the whole MRO of a user class, which may contain protocols.
1366 """
1367 try:
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001368 return sys._getframe(depth).f_globals['__name__'] in ['abc', 'functools']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001369 except (AttributeError, ValueError): # For platforms without _getframe().
1370 return True
1371
1372
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001373_PROTO_ALLOWLIST = {
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001374 'collections.abc': [
1375 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
1376 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
1377 ],
1378 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1379}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001380
1381
1382class _ProtocolMeta(ABCMeta):
1383 # This metaclass is really unfortunate and exists only because of
1384 # the lack of __instancehook__.
1385 def __instancecheck__(cls, instance):
1386 # We need this method for situations where attributes are
1387 # assigned in __init__.
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001388 if (
1389 getattr(cls, '_is_protocol', False) and
1390 not getattr(cls, '_is_runtime_protocol', False) and
1391 not _allow_reckless_class_checks(depth=2)
1392 ):
1393 raise TypeError("Instance and class checks can only be used with"
1394 " @runtime_checkable protocols")
1395
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001396 if ((not getattr(cls, '_is_protocol', False) or
1397 _is_callable_members_only(cls)) and
1398 issubclass(instance.__class__, cls)):
1399 return True
1400 if cls._is_protocol:
1401 if all(hasattr(instance, attr) and
1402 # All *methods* can be blocked by setting them to None.
1403 (not callable(getattr(cls, attr, None)) or
1404 getattr(instance, attr) is not None)
1405 for attr in _get_protocol_attrs(cls)):
1406 return True
1407 return super().__instancecheck__(instance)
1408
1409
1410class Protocol(Generic, metaclass=_ProtocolMeta):
1411 """Base class for protocol classes.
1412
1413 Protocol classes are defined as::
1414
1415 class Proto(Protocol):
1416 def meth(self) -> int:
1417 ...
1418
1419 Such classes are primarily used with static type checkers that recognize
1420 structural subtyping (static duck-typing), for example::
1421
1422 class C:
1423 def meth(self) -> int:
1424 return 0
1425
1426 def func(x: Proto) -> int:
1427 return x.meth()
1428
1429 func(C()) # Passes static type check
1430
1431 See PEP 544 for details. Protocol classes decorated with
1432 @typing.runtime_checkable act as simple-minded runtime protocols that check
1433 only the presence of given attributes, ignoring their type signatures.
1434 Protocol classes can be generic, they are defined as::
1435
1436 class GenProto(Protocol[T]):
1437 def meth(self) -> T:
1438 ...
1439 """
1440 __slots__ = ()
1441 _is_protocol = True
1442 _is_runtime_protocol = False
1443
1444 def __init_subclass__(cls, *args, **kwargs):
1445 super().__init_subclass__(*args, **kwargs)
1446
1447 # Determine if this is a protocol or a concrete subclass.
1448 if not cls.__dict__.get('_is_protocol', False):
1449 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1450
1451 # Set (or override) the protocol subclass hook.
1452 def _proto_hook(other):
1453 if not cls.__dict__.get('_is_protocol', False):
1454 return NotImplemented
1455
1456 # First, perform various sanity checks.
1457 if not getattr(cls, '_is_runtime_protocol', False):
Rossc1af1282020-12-29 11:55:28 +00001458 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001459 return NotImplemented
1460 raise TypeError("Instance and class checks can only be used with"
1461 " @runtime_checkable protocols")
1462 if not _is_callable_members_only(cls):
Rossc1af1282020-12-29 11:55:28 +00001463 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001464 return NotImplemented
1465 raise TypeError("Protocols with non-method members"
1466 " don't support issubclass()")
1467 if not isinstance(other, type):
1468 # Same error message as for issubclass(1, int).
1469 raise TypeError('issubclass() arg 1 must be a class')
1470
1471 # Second, perform the actual structural compatibility check.
1472 for attr in _get_protocol_attrs(cls):
1473 for base in other.__mro__:
1474 # Check if the members appears in the class dictionary...
1475 if attr in base.__dict__:
1476 if base.__dict__[attr] is None:
1477 return NotImplemented
1478 break
1479
1480 # ...or in annotations, if it is a sub-protocol.
1481 annotations = getattr(base, '__annotations__', {})
1482 if (isinstance(annotations, collections.abc.Mapping) and
1483 attr in annotations and
1484 issubclass(other, Generic) and other._is_protocol):
1485 break
1486 else:
1487 return NotImplemented
1488 return True
1489
1490 if '__subclasshook__' not in cls.__dict__:
1491 cls.__subclasshook__ = _proto_hook
1492
1493 # We have nothing more to do for non-protocols...
1494 if not cls._is_protocol:
1495 return
1496
1497 # ... otherwise check consistency of bases, and prohibit instantiation.
1498 for base in cls.__bases__:
1499 if not (base in (object, Generic) or
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001500 base.__module__ in _PROTO_ALLOWLIST and
1501 base.__name__ in _PROTO_ALLOWLIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001502 issubclass(base, Generic) and base._is_protocol):
1503 raise TypeError('Protocols can only inherit from other'
1504 ' protocols, got %r' % base)
1505 cls.__init__ = _no_init
1506
1507
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001508class _AnnotatedAlias(_GenericAlias, _root=True):
1509 """Runtime representation of an annotated type.
1510
1511 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1512 with extra annotations. The alias behaves like a normal typing alias,
1513 instantiating is the same as instantiating the underlying type, binding
1514 it to types is also the same.
1515 """
1516 def __init__(self, origin, metadata):
1517 if isinstance(origin, _AnnotatedAlias):
1518 metadata = origin.__metadata__ + metadata
1519 origin = origin.__origin__
1520 super().__init__(origin, origin)
1521 self.__metadata__ = metadata
1522
1523 def copy_with(self, params):
1524 assert len(params) == 1
1525 new_type = params[0]
1526 return _AnnotatedAlias(new_type, self.__metadata__)
1527
1528 def __repr__(self):
1529 return "typing.Annotated[{}, {}]".format(
1530 _type_repr(self.__origin__),
1531 ", ".join(repr(a) for a in self.__metadata__)
1532 )
1533
1534 def __reduce__(self):
1535 return operator.getitem, (
1536 Annotated, (self.__origin__,) + self.__metadata__
1537 )
1538
1539 def __eq__(self, other):
1540 if not isinstance(other, _AnnotatedAlias):
1541 return NotImplemented
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001542 return (self.__origin__ == other.__origin__
1543 and self.__metadata__ == other.__metadata__)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001544
1545 def __hash__(self):
1546 return hash((self.__origin__, self.__metadata__))
1547
1548
1549class Annotated:
1550 """Add context specific metadata to a type.
1551
1552 Example: Annotated[int, runtime_check.Unsigned] indicates to the
1553 hypothetical runtime_check module that this type is an unsigned int.
1554 Every other consumer of this type can ignore this metadata and treat
1555 this type as int.
1556
1557 The first argument to Annotated must be a valid type.
1558
1559 Details:
1560
1561 - It's an error to call `Annotated` with less than two arguments.
1562 - Nested Annotated are flattened::
1563
1564 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1565
1566 - Instantiating an annotated type is equivalent to instantiating the
1567 underlying type::
1568
1569 Annotated[C, Ann1](5) == C(5)
1570
1571 - Annotated can be used as a generic type alias::
1572
1573 Optimized = Annotated[T, runtime.Optimize()]
1574 Optimized[int] == Annotated[int, runtime.Optimize()]
1575
1576 OptimizedList = Annotated[List[T], runtime.Optimize()]
1577 OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1578 """
1579
1580 __slots__ = ()
1581
1582 def __new__(cls, *args, **kwargs):
1583 raise TypeError("Type Annotated cannot be instantiated.")
1584
1585 @_tp_cache
1586 def __class_getitem__(cls, params):
1587 if not isinstance(params, tuple) or len(params) < 2:
1588 raise TypeError("Annotated[...] should be used "
1589 "with at least two arguments (a type and an "
1590 "annotation).")
1591 msg = "Annotated[t, ...]: t must be a type."
1592 origin = _type_check(params[0], msg)
1593 metadata = tuple(params[1:])
1594 return _AnnotatedAlias(origin, metadata)
1595
1596 def __init_subclass__(cls, *args, **kwargs):
1597 raise TypeError(
1598 "Cannot subclass {}.Annotated".format(cls.__module__)
1599 )
1600
1601
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001602def runtime_checkable(cls):
1603 """Mark a protocol class as a runtime protocol.
1604
1605 Such protocol can be used with isinstance() and issubclass().
1606 Raise TypeError if applied to a non-protocol class.
1607 This allows a simple-minded structural check very similar to
1608 one trick ponies in collections.abc such as Iterable.
1609 For example::
1610
1611 @runtime_checkable
1612 class Closable(Protocol):
1613 def close(self): ...
1614
1615 assert isinstance(open('/some/file'), Closable)
1616
1617 Warning: this will check only the presence of the required methods,
1618 not their type signatures!
1619 """
1620 if not issubclass(cls, Generic) or not cls._is_protocol:
1621 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1622 ' got %r' % cls)
1623 cls._is_runtime_protocol = True
1624 return cls
1625
1626
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001627def cast(typ, val):
1628 """Cast a value to a type.
1629
1630 This returns the value unchanged. To the type checker this
1631 signals that the return value has the designated type, but at
1632 runtime we intentionally don't check anything (we want this
1633 to be as fast as possible).
1634 """
1635 return val
1636
1637
1638def _get_defaults(func):
1639 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001640 try:
1641 code = func.__code__
1642 except AttributeError:
1643 # Some built-in functions don't have __code__, __defaults__, etc.
1644 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001645 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001646 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001647 arg_names = arg_names[:pos_count]
1648 defaults = func.__defaults__ or ()
1649 kwdefaults = func.__kwdefaults__
1650 res = dict(kwdefaults) if kwdefaults else {}
1651 pos_offset = pos_count - len(defaults)
1652 for name, value in zip(arg_names[pos_offset:], defaults):
1653 assert name not in res
1654 res[name] = value
1655 return res
1656
1657
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001658_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1659 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001660 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001661
1662
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001663def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001664 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001665
Guido van Rossum991d14f2016-11-09 13:12:51 -08001666 This is often the same as obj.__annotations__, but it handles
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001667 forward references encoded as string literals, adds Optional[t] if a
1668 default value equal to None is set and recursively replaces all
1669 'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001670
Guido van Rossum991d14f2016-11-09 13:12:51 -08001671 The argument may be a module, class, method, or function. The annotations
1672 are returned as a dictionary. For classes, annotations include also
1673 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001674
Guido van Rossum991d14f2016-11-09 13:12:51 -08001675 TypeError is raised if the argument is not of a type that can contain
1676 annotations, and an empty dictionary is returned if no annotations are
1677 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001678
Guido van Rossum991d14f2016-11-09 13:12:51 -08001679 BEWARE -- the behavior of globalns and localns is counterintuitive
1680 (unless you are familiar with how eval() and exec() work). The
1681 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001682
Guido van Rossum991d14f2016-11-09 13:12:51 -08001683 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001684 globals from obj (or the respective module's globals for classes),
1685 and these are also used as the locals. If the object does not appear
Ken Jin1b1f9852021-04-27 01:31:21 +08001686 to have globals, an empty dictionary is used. For classes, the search
1687 order is globals first then locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001688
Guido van Rossum991d14f2016-11-09 13:12:51 -08001689 - If one dict argument is passed, it is used for both globals and
1690 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001691
Guido van Rossum991d14f2016-11-09 13:12:51 -08001692 - If two dict arguments are passed, they specify globals and
1693 locals, respectively.
1694 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001695
Guido van Rossum991d14f2016-11-09 13:12:51 -08001696 if getattr(obj, '__no_type_check__', None):
1697 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001698 # Classes require a special treatment.
1699 if isinstance(obj, type):
1700 hints = {}
1701 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001702 if globalns is None:
Karthikeyan Singaravelana9cf69d2021-04-12 23:47:25 +05301703 try:
1704 base_globals = sys.modules[base.__module__].__dict__
1705 except KeyError:
1706 continue
Łukasz Langaf350a262017-09-14 14:33:00 -04001707 else:
1708 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001709 ann = base.__dict__.get('__annotations__', {})
larryhastings2f2b6982021-04-29 20:09:08 -07001710 if isinstance(ann, types.GetSetDescriptorType):
1711 ann = {}
Ken Jin852150d2021-04-13 01:23:12 +08001712 base_locals = dict(vars(base)) if localns is None else localns
Ken Jin1b1f9852021-04-27 01:31:21 +08001713 if localns is None and globalns is None:
1714 # This is surprising, but required. Before Python 3.10,
1715 # get_type_hints only evaluated the globalns of
1716 # a class. To maintain backwards compatibility, we reverse
1717 # the globalns and localns order so that eval() looks into
1718 # *base_globals* first rather than *base_locals*.
1719 # This only affects ForwardRefs.
1720 base_globals, base_locals = base_locals, base_globals
Guido van Rossum991d14f2016-11-09 13:12:51 -08001721 for name, value in ann.items():
1722 if value is None:
1723 value = type(None)
1724 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001725 value = ForwardRef(value, is_argument=False)
Ken Jin852150d2021-04-13 01:23:12 +08001726 value = _eval_type(value, base_globals, base_locals)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001727 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001728 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001729
1730 if globalns is None:
1731 if isinstance(obj, types.ModuleType):
1732 globalns = obj.__dict__
1733 else:
benedwards140aca3a32019-11-21 17:24:58 +00001734 nsobj = obj
1735 # Find globalns for the unwrapped object.
1736 while hasattr(nsobj, '__wrapped__'):
1737 nsobj = nsobj.__wrapped__
1738 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001739 if localns is None:
1740 localns = globalns
1741 elif localns is None:
1742 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001743 hints = getattr(obj, '__annotations__', None)
1744 if hints is None:
1745 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001746 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001747 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001748 else:
1749 raise TypeError('{!r} is not a module, class, method, '
1750 'or function.'.format(obj))
1751 defaults = _get_defaults(obj)
1752 hints = dict(hints)
1753 for name, value in hints.items():
1754 if value is None:
1755 value = type(None)
1756 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001757 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001758 value = _eval_type(value, globalns, localns)
1759 if name in defaults and defaults[name] is None:
1760 value = Optional[value]
1761 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001762 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1763
1764
1765def _strip_annotations(t):
1766 """Strips the annotations from a given type.
1767 """
1768 if isinstance(t, _AnnotatedAlias):
1769 return _strip_annotations(t.__origin__)
1770 if isinstance(t, _GenericAlias):
1771 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1772 if stripped_args == t.__args__:
1773 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001774 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001775 if isinstance(t, GenericAlias):
1776 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1777 if stripped_args == t.__args__:
1778 return t
1779 return GenericAlias(t.__origin__, stripped_args)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001780 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001781
1782
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001783def get_origin(tp):
1784 """Get the unsubscripted version of a type.
1785
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001786 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1787 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001788
1789 get_origin(Literal[42]) is Literal
1790 get_origin(int) is None
1791 get_origin(ClassVar[int]) is ClassVar
1792 get_origin(Generic) is Generic
1793 get_origin(Generic[T]) is Generic
1794 get_origin(Union[T, int]) is Union
1795 get_origin(List[Tuple[T, T]][int]) == list
Jelle Zijlstra52243362021-04-10 19:57:05 -07001796 get_origin(P.args) is P
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001797 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001798 if isinstance(tp, _AnnotatedAlias):
1799 return Annotated
Jelle Zijlstra52243362021-04-10 19:57:05 -07001800 if isinstance(tp, (_BaseGenericAlias, GenericAlias,
1801 ParamSpecArgs, ParamSpecKwargs)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001802 return tp.__origin__
1803 if tp is Generic:
1804 return Generic
Ken Jinefb1f092020-12-29 10:26:19 +08001805 if isinstance(tp, types.Union):
1806 return types.Union
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001807 return None
1808
1809
1810def get_args(tp):
1811 """Get type arguments with all substitutions performed.
1812
1813 For unions, basic simplifications used by Union constructor are performed.
1814 Examples::
1815 get_args(Dict[str, int]) == (str, int)
1816 get_args(int) == ()
1817 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1818 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1819 get_args(Callable[[], T][int]) == ([], int)
1820 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001821 if isinstance(tp, _AnnotatedAlias):
1822 return (tp.__origin__,) + tp.__metadata__
Ken Jin4140f102020-12-29 04:06:19 +08001823 if isinstance(tp, (_GenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001824 res = tp.__args__
Ken Jinefb1f092020-12-29 10:26:19 +08001825 if (tp.__origin__ is collections.abc.Callable
1826 and not (res[0] is Ellipsis
1827 or isinstance(res[0], (ParamSpec, _ConcatenateGenericAlias)))):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001828 res = (list(res[:-1]), res[-1])
1829 return res
Ken Jinefb1f092020-12-29 10:26:19 +08001830 if isinstance(tp, types.Union):
1831 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001832 return ()
1833
1834
Patrick Reader0705ec82020-09-16 05:58:32 +01001835def is_typeddict(tp):
1836 """Check if an annotation is a TypedDict class
1837
1838 For example::
1839 class Film(TypedDict):
1840 title: str
1841 year: int
1842
1843 is_typeddict(Film) # => True
1844 is_typeddict(Union[list, str]) # => False
1845 """
1846 return isinstance(tp, _TypedDictMeta)
1847
1848
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001849def no_type_check(arg):
1850 """Decorator to indicate that annotations are not type hints.
1851
1852 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001853 applies recursively to all methods and classes defined in that class
1854 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001855
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001856 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001857 """
1858 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001859 arg_attrs = arg.__dict__.copy()
1860 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001861 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001862 arg_attrs.pop(attr)
1863 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001864 if isinstance(obj, types.FunctionType):
1865 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001866 if isinstance(obj, type):
1867 no_type_check(obj)
1868 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001869 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001870 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001871 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001872 return arg
1873
1874
1875def no_type_check_decorator(decorator):
1876 """Decorator to give another decorator the @no_type_check effect.
1877
1878 This wraps the decorator with something that wraps the decorated
1879 function in @no_type_check.
1880 """
1881
1882 @functools.wraps(decorator)
1883 def wrapped_decorator(*args, **kwds):
1884 func = decorator(*args, **kwds)
1885 func = no_type_check(func)
1886 return func
1887
1888 return wrapped_decorator
1889
1890
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001891def _overload_dummy(*args, **kwds):
1892 """Helper for @overload to raise when called."""
1893 raise NotImplementedError(
1894 "You should not call an overloaded function. "
1895 "A series of @overload-decorated functions "
1896 "outside a stub module should always be followed "
1897 "by an implementation that is not @overload-ed.")
1898
1899
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001900def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001901 """Decorator for overloaded functions/methods.
1902
1903 In a stub file, place two or more stub definitions for the same
1904 function in a row, each decorated with @overload. For example:
1905
1906 @overload
1907 def utf8(value: None) -> None: ...
1908 @overload
1909 def utf8(value: bytes) -> bytes: ...
1910 @overload
1911 def utf8(value: str) -> bytes: ...
1912
1913 In a non-stub file (i.e. a regular .py file), do the same but
1914 follow it with an implementation. The implementation should *not*
1915 be decorated with @overload. For example:
1916
1917 @overload
1918 def utf8(value: None) -> None: ...
1919 @overload
1920 def utf8(value: bytes) -> bytes: ...
1921 @overload
1922 def utf8(value: str) -> bytes: ...
1923 def utf8(value):
1924 # implementation goes here
1925 """
1926 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001927
1928
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001929def final(f):
1930 """A decorator to indicate final methods and final classes.
1931
1932 Use this decorator to indicate to type checkers that the decorated
1933 method cannot be overridden, and decorated class cannot be subclassed.
1934 For example:
1935
1936 class Base:
1937 @final
1938 def done(self) -> None:
1939 ...
1940 class Sub(Base):
1941 def done(self) -> None: # Error reported by type checker
1942 ...
1943
1944 @final
1945 class Leaf:
1946 ...
1947 class Other(Leaf): # Error reported by type checker
1948 ...
1949
1950 There is no runtime checking of these properties.
1951 """
1952 return f
1953
1954
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001955# Some unconstrained type variables. These are used by the container types.
1956# (These are not for export.)
1957T = TypeVar('T') # Any type.
1958KT = TypeVar('KT') # Key type.
1959VT = TypeVar('VT') # Value type.
1960T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
1961V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
1962VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
1963T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
1964# Internal type variable used for Type[].
1965CT_co = TypeVar('CT_co', covariant=True, bound=type)
1966
1967# A useful type variable with constraints. This represents string types.
1968# (This one *is* for export!)
1969AnyStr = TypeVar('AnyStr', bytes, str)
1970
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001971
1972# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001973_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001974
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001975Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
1976Awaitable = _alias(collections.abc.Awaitable, 1)
1977Coroutine = _alias(collections.abc.Coroutine, 3)
1978AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
1979AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
1980Iterable = _alias(collections.abc.Iterable, 1)
1981Iterator = _alias(collections.abc.Iterator, 1)
1982Reversible = _alias(collections.abc.Reversible, 1)
1983Sized = _alias(collections.abc.Sized, 0) # Not generic.
1984Container = _alias(collections.abc.Container, 1)
1985Collection = _alias(collections.abc.Collection, 1)
1986Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001987Callable.__doc__ = \
1988 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001989
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001990 The subscription syntax must always be used with exactly two
1991 values: the argument list and the return type. The argument list
1992 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001993
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001994 There is no syntax to indicate optional or keyword arguments,
1995 such function types are rarely used as callback types.
1996 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001997AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
1998MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001999# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002000Mapping = _alias(collections.abc.Mapping, 2)
2001MutableMapping = _alias(collections.abc.MutableMapping, 2)
2002Sequence = _alias(collections.abc.Sequence, 1)
2003MutableSequence = _alias(collections.abc.MutableSequence, 1)
2004ByteString = _alias(collections.abc.ByteString, 0) # Not generic
2005# Tuple accepts variable number of parameters.
2006Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002007Tuple.__doc__ = \
2008 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002009
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002010 Example: Tuple[T1, T2] is a tuple of two elements corresponding
2011 to type variables T1 and T2. Tuple[int, float, str] is a tuple
2012 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002013
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002014 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
2015 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002016List = _alias(list, 1, inst=False, name='List')
2017Deque = _alias(collections.deque, 1, name='Deque')
2018Set = _alias(set, 1, inst=False, name='Set')
2019FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
2020MappingView = _alias(collections.abc.MappingView, 1)
2021KeysView = _alias(collections.abc.KeysView, 1)
2022ItemsView = _alias(collections.abc.ItemsView, 2)
2023ValuesView = _alias(collections.abc.ValuesView, 1)
2024ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
2025AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
2026Dict = _alias(dict, 2, inst=False, name='Dict')
2027DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
2028OrderedDict = _alias(collections.OrderedDict, 2)
2029Counter = _alias(collections.Counter, 1)
2030ChainMap = _alias(collections.ChainMap, 2)
2031Generator = _alias(collections.abc.Generator, 3)
2032AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
2033Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002034Type.__doc__ = \
2035 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002036
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002037 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002038
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002039 class User: ... # Abstract base for User classes
2040 class BasicUser(User): ...
2041 class ProUser(User): ...
2042 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08002043
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002044 And a function that takes a class argument that's a subclass of
2045 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08002046
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002047 U = TypeVar('U', bound=User)
2048 def new_user(user_class: Type[U]) -> U:
2049 user = user_class()
2050 # (Here we could write the user object to a database)
2051 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08002052
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002053 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08002054
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002055 At this point the type checker knows that joe has type BasicUser.
2056 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002057
2058
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002059@runtime_checkable
2060class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002061 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002062 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002063
2064 @abstractmethod
2065 def __int__(self) -> int:
2066 pass
2067
2068
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002069@runtime_checkable
2070class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002071 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002072 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002073
2074 @abstractmethod
2075 def __float__(self) -> float:
2076 pass
2077
2078
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002079@runtime_checkable
2080class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002081 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002082 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002083
2084 @abstractmethod
2085 def __complex__(self) -> complex:
2086 pass
2087
2088
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002089@runtime_checkable
2090class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002091 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002092 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002093
2094 @abstractmethod
2095 def __bytes__(self) -> bytes:
2096 pass
2097
2098
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002099@runtime_checkable
2100class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002101 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07002102 __slots__ = ()
2103
2104 @abstractmethod
2105 def __index__(self) -> int:
2106 pass
2107
2108
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002109@runtime_checkable
2110class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002111 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002112 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002113
2114 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002115 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002116 pass
2117
2118
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002119@runtime_checkable
2120class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002121 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002122 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002123
2124 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002125 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002126 pass
2127
2128
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002129def _make_nmtuple(name, types, module, defaults = ()):
2130 fields = [n for n, t in types]
2131 types = {n: _type_check(t, f"field {n} annotation must be a type")
2132 for n, t in types}
2133 nm_tpl = collections.namedtuple(name, fields,
2134 defaults=defaults, module=module)
2135 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002136 return nm_tpl
2137
2138
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002139# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002140_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
2141 '_fields', '_field_defaults',
2142 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002143
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002144_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002145
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002146
Guido van Rossum2f841442016-11-15 09:48:06 -08002147class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002148
Guido van Rossum2f841442016-11-15 09:48:06 -08002149 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002150 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08002151 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002152 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08002153 for field_name in types:
2154 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002155 default_names.append(field_name)
2156 elif default_names:
2157 raise TypeError(f"Non-default namedtuple field {field_name} "
2158 f"cannot follow default field"
2159 f"{'s' if len(default_names) > 1 else ''} "
2160 f"{', '.join(default_names)}")
2161 nm_tpl = _make_nmtuple(typename, types.items(),
2162 defaults=[ns[n] for n in default_names],
2163 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08002164 # update from user namespace without overriding special namedtuple attributes
2165 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002166 if key in _prohibited:
2167 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
2168 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08002169 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08002170 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002171
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002172
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002173def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08002174 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002175
Guido van Rossum2f841442016-11-15 09:48:06 -08002176 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002177
Guido van Rossum2f841442016-11-15 09:48:06 -08002178 class Employee(NamedTuple):
2179 name: str
2180 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002181
Guido van Rossum2f841442016-11-15 09:48:06 -08002182 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002183
Guido van Rossum2f841442016-11-15 09:48:06 -08002184 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002185
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07002186 The resulting class has an extra __annotations__ attribute, giving a
2187 dict that maps field names to types. (The field names are also in
2188 the _fields attribute, which is part of the namedtuple API.)
2189 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002190
Guido van Rossum2f841442016-11-15 09:48:06 -08002191 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002192
Guido van Rossum2f841442016-11-15 09:48:06 -08002193 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002194
Guido van Rossum2f841442016-11-15 09:48:06 -08002195 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
2196 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002197 if fields is None:
2198 fields = kwargs.items()
2199 elif kwargs:
2200 raise TypeError("Either list of fields or keywords"
2201 " can be provided to NamedTuple, not both")
2202 try:
2203 module = sys._getframe(1).f_globals.get('__name__', '__main__')
2204 except (AttributeError, ValueError):
2205 module = None
2206 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002207
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002208_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
2209
2210def _namedtuple_mro_entries(bases):
2211 if len(bases) > 1:
2212 raise TypeError("Multiple inheritance with NamedTuple is not supported")
2213 assert bases[0] is NamedTuple
2214 return (_NamedTuple,)
2215
2216NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002217
2218
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002219class _TypedDictMeta(type):
2220 def __new__(cls, name, bases, ns, total=True):
2221 """Create new typed dict class object.
2222
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002223 This method is called when TypedDict is subclassed,
2224 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002225 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002226 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002227 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002228 for base in bases:
2229 if type(base) is not _TypedDictMeta:
2230 raise TypeError('cannot inherit from both a TypedDict type '
2231 'and a non-TypedDict base class')
2232 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002233
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002234 annotations = {}
2235 own_annotations = ns.get('__annotations__', {})
2236 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002237 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002238 own_annotations = {
2239 n: _type_check(tp, msg) for n, tp in own_annotations.items()
2240 }
2241 required_keys = set()
2242 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002243
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002244 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002245 annotations.update(base.__dict__.get('__annotations__', {}))
2246 required_keys.update(base.__dict__.get('__required_keys__', ()))
2247 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002248
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002249 annotations.update(own_annotations)
2250 if total:
2251 required_keys.update(own_annotation_keys)
2252 else:
2253 optional_keys.update(own_annotation_keys)
2254
2255 tp_dict.__annotations__ = annotations
2256 tp_dict.__required_keys__ = frozenset(required_keys)
2257 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002258 if not hasattr(tp_dict, '__total__'):
2259 tp_dict.__total__ = total
2260 return tp_dict
2261
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002262 __call__ = dict # static method
2263
2264 def __subclasscheck__(cls, other):
2265 # Typed dicts are only for static structural subtyping.
2266 raise TypeError('TypedDict does not support instance and class checks')
2267
2268 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002269
2270
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002271def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002272 """A simple typed namespace. At runtime it is equivalent to a plain dict.
2273
2274 TypedDict creates a dictionary type that expects all of its
2275 instances to have a certain set of keys, where each key is
2276 associated with a value of a consistent type. This expectation
2277 is not checked at runtime but is only enforced by type checkers.
2278 Usage::
2279
2280 class Point2D(TypedDict):
2281 x: int
2282 y: int
2283 label: str
2284
2285 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
2286 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
2287
2288 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
2289
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002290 The type info can be accessed via the Point2D.__annotations__ dict, and
2291 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
2292 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002293
2294 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
2295 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
2296
ananthan-123ab6423f2020-02-19 10:03:05 +05302297 By default, all keys must be present in a TypedDict. It is possible
2298 to override this by specifying totality.
2299 Usage::
2300
2301 class point2D(TypedDict, total=False):
2302 x: int
2303 y: int
2304
2305 This means that a point2D TypedDict can have any of the keys omitted.A type
2306 checker is only expected to support a literal False or True as the value of
2307 the total argument. True is the default, and makes all items defined in the
2308 class body be required.
2309
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002310 The class syntax is only supported in Python 3.6+, while two other
2311 syntax forms work for Python 2.7 and 3.2+
2312 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002313 if fields is None:
2314 fields = kwargs
2315 elif kwargs:
2316 raise TypeError("TypedDict takes either a dict or keyword arguments,"
2317 " but not both")
2318
Alex Grönholm67b769f2020-12-10 23:49:05 +02002319 ns = {'__annotations__': dict(fields)}
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002320 try:
2321 # Setting correct module is necessary to make typed dict classes pickleable.
2322 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
2323 except (AttributeError, ValueError):
2324 pass
2325
Alex Grönholm67b769f2020-12-10 23:49:05 +02002326 return _TypedDictMeta(typename, (), ns, total=total)
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002327
2328_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
2329TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002330
2331
Guido van Rossum91185fe2016-06-08 11:19:11 -07002332def NewType(name, tp):
2333 """NewType creates simple unique types with almost zero
2334 runtime overhead. NewType(name, tp) is considered a subtype of tp
2335 by static type checkers. At runtime, NewType(name, tp) returns
2336 a dummy function that simply returns its argument. Usage::
2337
2338 UserId = NewType('UserId', int)
2339
2340 def name_by_id(user_id: UserId) -> str:
2341 ...
2342
2343 UserId('user') # Fails type check
2344
2345 name_by_id(42) # Fails type check
2346 name_by_id(UserId(42)) # OK
2347
2348 num = UserId(5) + 1 # type: int
2349 """
2350
2351 def new_type(x):
2352 return x
2353
2354 new_type.__name__ = name
2355 new_type.__supertype__ = tp
2356 return new_type
2357
2358
Guido van Rossum0e0563c2016-04-05 14:54:25 -07002359# Python-version-specific alias (Python 2: unicode; Python 3: str)
2360Text = str
2361
2362
Guido van Rossum91185fe2016-06-08 11:19:11 -07002363# Constant that's True when type checking, but False here.
2364TYPE_CHECKING = False
2365
2366
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002367class IO(Generic[AnyStr]):
2368 """Generic base class for TextIO and BinaryIO.
2369
2370 This is an abstract, generic version of the return of open().
2371
2372 NOTE: This does not distinguish between the different possible
2373 classes (text vs. binary, read vs. write vs. read/write,
2374 append-only, unbuffered). The TextIO and BinaryIO subclasses
2375 below capture the distinctions between text vs. binary, which is
2376 pervasive in the interface; however we currently do not offer a
2377 way to track the other distinctions in the type system.
2378 """
2379
Guido van Rossumd70fe632015-08-05 12:11:06 +02002380 __slots__ = ()
2381
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002382 @property
2383 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002384 def mode(self) -> str:
2385 pass
2386
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002387 @property
2388 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002389 def name(self) -> str:
2390 pass
2391
2392 @abstractmethod
2393 def close(self) -> None:
2394 pass
2395
Shantanu2e6569b2020-01-29 18:52:36 -08002396 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002397 @abstractmethod
2398 def closed(self) -> bool:
2399 pass
2400
2401 @abstractmethod
2402 def fileno(self) -> int:
2403 pass
2404
2405 @abstractmethod
2406 def flush(self) -> None:
2407 pass
2408
2409 @abstractmethod
2410 def isatty(self) -> bool:
2411 pass
2412
2413 @abstractmethod
2414 def read(self, n: int = -1) -> AnyStr:
2415 pass
2416
2417 @abstractmethod
2418 def readable(self) -> bool:
2419 pass
2420
2421 @abstractmethod
2422 def readline(self, limit: int = -1) -> AnyStr:
2423 pass
2424
2425 @abstractmethod
2426 def readlines(self, hint: int = -1) -> List[AnyStr]:
2427 pass
2428
2429 @abstractmethod
2430 def seek(self, offset: int, whence: int = 0) -> int:
2431 pass
2432
2433 @abstractmethod
2434 def seekable(self) -> bool:
2435 pass
2436
2437 @abstractmethod
2438 def tell(self) -> int:
2439 pass
2440
2441 @abstractmethod
2442 def truncate(self, size: int = None) -> int:
2443 pass
2444
2445 @abstractmethod
2446 def writable(self) -> bool:
2447 pass
2448
2449 @abstractmethod
2450 def write(self, s: AnyStr) -> int:
2451 pass
2452
2453 @abstractmethod
2454 def writelines(self, lines: List[AnyStr]) -> None:
2455 pass
2456
2457 @abstractmethod
2458 def __enter__(self) -> 'IO[AnyStr]':
2459 pass
2460
2461 @abstractmethod
2462 def __exit__(self, type, value, traceback) -> None:
2463 pass
2464
2465
2466class BinaryIO(IO[bytes]):
2467 """Typed version of the return of open() in binary mode."""
2468
Guido van Rossumd70fe632015-08-05 12:11:06 +02002469 __slots__ = ()
2470
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002471 @abstractmethod
2472 def write(self, s: Union[bytes, bytearray]) -> int:
2473 pass
2474
2475 @abstractmethod
2476 def __enter__(self) -> 'BinaryIO':
2477 pass
2478
2479
2480class TextIO(IO[str]):
2481 """Typed version of the return of open() in text mode."""
2482
Guido van Rossumd70fe632015-08-05 12:11:06 +02002483 __slots__ = ()
2484
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002485 @property
2486 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002487 def buffer(self) -> BinaryIO:
2488 pass
2489
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002490 @property
2491 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002492 def encoding(self) -> str:
2493 pass
2494
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002495 @property
2496 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002497 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002498 pass
2499
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002500 @property
2501 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002502 def line_buffering(self) -> bool:
2503 pass
2504
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002505 @property
2506 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002507 def newlines(self) -> Any:
2508 pass
2509
2510 @abstractmethod
2511 def __enter__(self) -> 'TextIO':
2512 pass
2513
2514
2515class io:
2516 """Wrapper namespace for IO generic classes."""
2517
2518 __all__ = ['IO', 'TextIO', 'BinaryIO']
2519 IO = IO
2520 TextIO = TextIO
2521 BinaryIO = BinaryIO
2522
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002523
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002524io.__name__ = __name__ + '.io'
2525sys.modules[io.__name__] = io
2526
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002527Pattern = _alias(stdlib_re.Pattern, 1)
2528Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002529
2530class re:
2531 """Wrapper namespace for re type aliases."""
2532
2533 __all__ = ['Pattern', 'Match']
2534 Pattern = Pattern
2535 Match = Match
2536
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002537
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002538re.__name__ = __name__ + '.re'
2539sys.modules[re.__name__] = re