blob: 9540021e8c0a6fba2d7d3c69cb38537ce915aea3 [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:
Miss Islington (bot)3df23b52021-06-26 16:52:28 -07001703 base_globals = getattr(sys.modules.get(base.__module__, None), '__dict__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001704 else:
1705 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001706 ann = base.__dict__.get('__annotations__', {})
larryhastings2f2b6982021-04-29 20:09:08 -07001707 if isinstance(ann, types.GetSetDescriptorType):
1708 ann = {}
Ken Jin852150d2021-04-13 01:23:12 +08001709 base_locals = dict(vars(base)) if localns is None else localns
Ken Jin1b1f9852021-04-27 01:31:21 +08001710 if localns is None and globalns is None:
1711 # This is surprising, but required. Before Python 3.10,
1712 # get_type_hints only evaluated the globalns of
1713 # a class. To maintain backwards compatibility, we reverse
1714 # the globalns and localns order so that eval() looks into
1715 # *base_globals* first rather than *base_locals*.
1716 # This only affects ForwardRefs.
1717 base_globals, base_locals = base_locals, base_globals
Guido van Rossum991d14f2016-11-09 13:12:51 -08001718 for name, value in ann.items():
1719 if value is None:
1720 value = type(None)
1721 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001722 value = ForwardRef(value, is_argument=False)
Ken Jin852150d2021-04-13 01:23:12 +08001723 value = _eval_type(value, base_globals, base_locals)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001724 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001725 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001726
1727 if globalns is None:
1728 if isinstance(obj, types.ModuleType):
1729 globalns = obj.__dict__
1730 else:
benedwards140aca3a32019-11-21 17:24:58 +00001731 nsobj = obj
1732 # Find globalns for the unwrapped object.
1733 while hasattr(nsobj, '__wrapped__'):
1734 nsobj = nsobj.__wrapped__
1735 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001736 if localns is None:
1737 localns = globalns
1738 elif localns is None:
1739 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001740 hints = getattr(obj, '__annotations__', None)
1741 if hints is None:
1742 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001743 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001744 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001745 else:
1746 raise TypeError('{!r} is not a module, class, method, '
1747 'or function.'.format(obj))
1748 defaults = _get_defaults(obj)
1749 hints = dict(hints)
1750 for name, value in hints.items():
1751 if value is None:
1752 value = type(None)
1753 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001754 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001755 value = _eval_type(value, globalns, localns)
1756 if name in defaults and defaults[name] is None:
1757 value = Optional[value]
1758 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001759 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1760
1761
1762def _strip_annotations(t):
1763 """Strips the annotations from a given type.
1764 """
1765 if isinstance(t, _AnnotatedAlias):
1766 return _strip_annotations(t.__origin__)
1767 if isinstance(t, _GenericAlias):
1768 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1769 if stripped_args == t.__args__:
1770 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001771 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001772 if isinstance(t, GenericAlias):
1773 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1774 if stripped_args == t.__args__:
1775 return t
1776 return GenericAlias(t.__origin__, stripped_args)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001777 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001778
1779
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001780def get_origin(tp):
1781 """Get the unsubscripted version of a type.
1782
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001783 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1784 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001785
1786 get_origin(Literal[42]) is Literal
1787 get_origin(int) is None
1788 get_origin(ClassVar[int]) is ClassVar
1789 get_origin(Generic) is Generic
1790 get_origin(Generic[T]) is Generic
1791 get_origin(Union[T, int]) is Union
1792 get_origin(List[Tuple[T, T]][int]) == list
Jelle Zijlstra52243362021-04-10 19:57:05 -07001793 get_origin(P.args) is P
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001794 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001795 if isinstance(tp, _AnnotatedAlias):
1796 return Annotated
Jelle Zijlstra52243362021-04-10 19:57:05 -07001797 if isinstance(tp, (_BaseGenericAlias, GenericAlias,
1798 ParamSpecArgs, ParamSpecKwargs)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001799 return tp.__origin__
1800 if tp is Generic:
1801 return Generic
Ken Jinefb1f092020-12-29 10:26:19 +08001802 if isinstance(tp, types.Union):
1803 return types.Union
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001804 return None
1805
1806
1807def get_args(tp):
1808 """Get type arguments with all substitutions performed.
1809
1810 For unions, basic simplifications used by Union constructor are performed.
1811 Examples::
1812 get_args(Dict[str, int]) == (str, int)
1813 get_args(int) == ()
1814 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1815 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1816 get_args(Callable[[], T][int]) == ([], int)
1817 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001818 if isinstance(tp, _AnnotatedAlias):
1819 return (tp.__origin__,) + tp.__metadata__
Ken Jin4140f102020-12-29 04:06:19 +08001820 if isinstance(tp, (_GenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001821 res = tp.__args__
Ken Jinefb1f092020-12-29 10:26:19 +08001822 if (tp.__origin__ is collections.abc.Callable
1823 and not (res[0] is Ellipsis
1824 or isinstance(res[0], (ParamSpec, _ConcatenateGenericAlias)))):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001825 res = (list(res[:-1]), res[-1])
1826 return res
Ken Jinefb1f092020-12-29 10:26:19 +08001827 if isinstance(tp, types.Union):
1828 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001829 return ()
1830
1831
Patrick Reader0705ec82020-09-16 05:58:32 +01001832def is_typeddict(tp):
1833 """Check if an annotation is a TypedDict class
1834
1835 For example::
1836 class Film(TypedDict):
1837 title: str
1838 year: int
1839
1840 is_typeddict(Film) # => True
1841 is_typeddict(Union[list, str]) # => False
1842 """
1843 return isinstance(tp, _TypedDictMeta)
1844
1845
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001846def no_type_check(arg):
1847 """Decorator to indicate that annotations are not type hints.
1848
1849 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001850 applies recursively to all methods and classes defined in that class
1851 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001852
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001853 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001854 """
1855 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001856 arg_attrs = arg.__dict__.copy()
1857 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001858 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001859 arg_attrs.pop(attr)
1860 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001861 if isinstance(obj, types.FunctionType):
1862 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001863 if isinstance(obj, type):
1864 no_type_check(obj)
1865 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001866 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001867 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001868 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001869 return arg
1870
1871
1872def no_type_check_decorator(decorator):
1873 """Decorator to give another decorator the @no_type_check effect.
1874
1875 This wraps the decorator with something that wraps the decorated
1876 function in @no_type_check.
1877 """
1878
1879 @functools.wraps(decorator)
1880 def wrapped_decorator(*args, **kwds):
1881 func = decorator(*args, **kwds)
1882 func = no_type_check(func)
1883 return func
1884
1885 return wrapped_decorator
1886
1887
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001888def _overload_dummy(*args, **kwds):
1889 """Helper for @overload to raise when called."""
1890 raise NotImplementedError(
1891 "You should not call an overloaded function. "
1892 "A series of @overload-decorated functions "
1893 "outside a stub module should always be followed "
1894 "by an implementation that is not @overload-ed.")
1895
1896
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001897def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001898 """Decorator for overloaded functions/methods.
1899
1900 In a stub file, place two or more stub definitions for the same
1901 function in a row, each decorated with @overload. For example:
1902
1903 @overload
1904 def utf8(value: None) -> None: ...
1905 @overload
1906 def utf8(value: bytes) -> bytes: ...
1907 @overload
1908 def utf8(value: str) -> bytes: ...
1909
1910 In a non-stub file (i.e. a regular .py file), do the same but
1911 follow it with an implementation. The implementation should *not*
1912 be decorated with @overload. For example:
1913
1914 @overload
1915 def utf8(value: None) -> None: ...
1916 @overload
1917 def utf8(value: bytes) -> bytes: ...
1918 @overload
1919 def utf8(value: str) -> bytes: ...
1920 def utf8(value):
1921 # implementation goes here
1922 """
1923 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001924
1925
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001926def final(f):
1927 """A decorator to indicate final methods and final classes.
1928
1929 Use this decorator to indicate to type checkers that the decorated
1930 method cannot be overridden, and decorated class cannot be subclassed.
1931 For example:
1932
1933 class Base:
1934 @final
1935 def done(self) -> None:
1936 ...
1937 class Sub(Base):
1938 def done(self) -> None: # Error reported by type checker
1939 ...
1940
1941 @final
1942 class Leaf:
1943 ...
1944 class Other(Leaf): # Error reported by type checker
1945 ...
1946
1947 There is no runtime checking of these properties.
1948 """
1949 return f
1950
1951
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001952# Some unconstrained type variables. These are used by the container types.
1953# (These are not for export.)
1954T = TypeVar('T') # Any type.
1955KT = TypeVar('KT') # Key type.
1956VT = TypeVar('VT') # Value type.
1957T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
1958V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
1959VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
1960T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
1961# Internal type variable used for Type[].
1962CT_co = TypeVar('CT_co', covariant=True, bound=type)
1963
1964# A useful type variable with constraints. This represents string types.
1965# (This one *is* for export!)
1966AnyStr = TypeVar('AnyStr', bytes, str)
1967
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001968
1969# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001970_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001971
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001972Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
1973Awaitable = _alias(collections.abc.Awaitable, 1)
1974Coroutine = _alias(collections.abc.Coroutine, 3)
1975AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
1976AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
1977Iterable = _alias(collections.abc.Iterable, 1)
1978Iterator = _alias(collections.abc.Iterator, 1)
1979Reversible = _alias(collections.abc.Reversible, 1)
1980Sized = _alias(collections.abc.Sized, 0) # Not generic.
1981Container = _alias(collections.abc.Container, 1)
1982Collection = _alias(collections.abc.Collection, 1)
1983Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001984Callable.__doc__ = \
1985 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001986
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001987 The subscription syntax must always be used with exactly two
1988 values: the argument list and the return type. The argument list
1989 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001990
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001991 There is no syntax to indicate optional or keyword arguments,
1992 such function types are rarely used as callback types.
1993 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001994AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
1995MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001996# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001997Mapping = _alias(collections.abc.Mapping, 2)
1998MutableMapping = _alias(collections.abc.MutableMapping, 2)
1999Sequence = _alias(collections.abc.Sequence, 1)
2000MutableSequence = _alias(collections.abc.MutableSequence, 1)
2001ByteString = _alias(collections.abc.ByteString, 0) # Not generic
2002# Tuple accepts variable number of parameters.
2003Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002004Tuple.__doc__ = \
2005 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002006
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002007 Example: Tuple[T1, T2] is a tuple of two elements corresponding
2008 to type variables T1 and T2. Tuple[int, float, str] is a tuple
2009 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002010
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002011 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
2012 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002013List = _alias(list, 1, inst=False, name='List')
2014Deque = _alias(collections.deque, 1, name='Deque')
2015Set = _alias(set, 1, inst=False, name='Set')
2016FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
2017MappingView = _alias(collections.abc.MappingView, 1)
2018KeysView = _alias(collections.abc.KeysView, 1)
2019ItemsView = _alias(collections.abc.ItemsView, 2)
2020ValuesView = _alias(collections.abc.ValuesView, 1)
2021ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
2022AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
2023Dict = _alias(dict, 2, inst=False, name='Dict')
2024DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
2025OrderedDict = _alias(collections.OrderedDict, 2)
2026Counter = _alias(collections.Counter, 1)
2027ChainMap = _alias(collections.ChainMap, 2)
2028Generator = _alias(collections.abc.Generator, 3)
2029AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
2030Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002031Type.__doc__ = \
2032 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002033
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002034 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002035
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002036 class User: ... # Abstract base for User classes
2037 class BasicUser(User): ...
2038 class ProUser(User): ...
2039 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08002040
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002041 And a function that takes a class argument that's a subclass of
2042 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08002043
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002044 U = TypeVar('U', bound=User)
2045 def new_user(user_class: Type[U]) -> U:
2046 user = user_class()
2047 # (Here we could write the user object to a database)
2048 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08002049
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002050 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08002051
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002052 At this point the type checker knows that joe has type BasicUser.
2053 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002054
2055
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002056@runtime_checkable
2057class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002058 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002059 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002060
2061 @abstractmethod
2062 def __int__(self) -> int:
2063 pass
2064
2065
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002066@runtime_checkable
2067class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002068 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002069 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002070
2071 @abstractmethod
2072 def __float__(self) -> float:
2073 pass
2074
2075
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002076@runtime_checkable
2077class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002078 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002079 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002080
2081 @abstractmethod
2082 def __complex__(self) -> complex:
2083 pass
2084
2085
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002086@runtime_checkable
2087class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002088 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002089 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002090
2091 @abstractmethod
2092 def __bytes__(self) -> bytes:
2093 pass
2094
2095
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002096@runtime_checkable
2097class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002098 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07002099 __slots__ = ()
2100
2101 @abstractmethod
2102 def __index__(self) -> int:
2103 pass
2104
2105
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002106@runtime_checkable
2107class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002108 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002109 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002110
2111 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002112 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002113 pass
2114
2115
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002116@runtime_checkable
2117class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002118 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002119 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002120
2121 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002122 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002123 pass
2124
2125
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002126def _make_nmtuple(name, types, module, defaults = ()):
2127 fields = [n for n, t in types]
2128 types = {n: _type_check(t, f"field {n} annotation must be a type")
2129 for n, t in types}
2130 nm_tpl = collections.namedtuple(name, fields,
2131 defaults=defaults, module=module)
2132 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002133 return nm_tpl
2134
2135
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002136# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002137_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
2138 '_fields', '_field_defaults',
2139 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002140
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002141_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002142
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002143
Guido van Rossum2f841442016-11-15 09:48:06 -08002144class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002145
Guido van Rossum2f841442016-11-15 09:48:06 -08002146 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002147 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08002148 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002149 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08002150 for field_name in types:
2151 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002152 default_names.append(field_name)
2153 elif default_names:
2154 raise TypeError(f"Non-default namedtuple field {field_name} "
2155 f"cannot follow default field"
2156 f"{'s' if len(default_names) > 1 else ''} "
2157 f"{', '.join(default_names)}")
2158 nm_tpl = _make_nmtuple(typename, types.items(),
2159 defaults=[ns[n] for n in default_names],
2160 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08002161 # update from user namespace without overriding special namedtuple attributes
2162 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002163 if key in _prohibited:
2164 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
2165 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08002166 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08002167 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002168
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002169
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002170def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08002171 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002172
Guido van Rossum2f841442016-11-15 09:48:06 -08002173 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002174
Guido van Rossum2f841442016-11-15 09:48:06 -08002175 class Employee(NamedTuple):
2176 name: str
2177 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002178
Guido van Rossum2f841442016-11-15 09:48:06 -08002179 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002180
Guido van Rossum2f841442016-11-15 09:48:06 -08002181 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002182
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07002183 The resulting class has an extra __annotations__ attribute, giving a
2184 dict that maps field names to types. (The field names are also in
2185 the _fields attribute, which is part of the namedtuple API.)
2186 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002187
Guido van Rossum2f841442016-11-15 09:48:06 -08002188 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002189
Guido van Rossum2f841442016-11-15 09:48:06 -08002190 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002191
Guido van Rossum2f841442016-11-15 09:48:06 -08002192 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
2193 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002194 if fields is None:
2195 fields = kwargs.items()
2196 elif kwargs:
2197 raise TypeError("Either list of fields or keywords"
2198 " can be provided to NamedTuple, not both")
2199 try:
2200 module = sys._getframe(1).f_globals.get('__name__', '__main__')
2201 except (AttributeError, ValueError):
2202 module = None
2203 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002204
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002205_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
2206
2207def _namedtuple_mro_entries(bases):
2208 if len(bases) > 1:
2209 raise TypeError("Multiple inheritance with NamedTuple is not supported")
2210 assert bases[0] is NamedTuple
2211 return (_NamedTuple,)
2212
2213NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002214
2215
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002216class _TypedDictMeta(type):
2217 def __new__(cls, name, bases, ns, total=True):
2218 """Create new typed dict class object.
2219
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002220 This method is called when TypedDict is subclassed,
2221 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002222 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002223 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002224 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002225 for base in bases:
2226 if type(base) is not _TypedDictMeta:
2227 raise TypeError('cannot inherit from both a TypedDict type '
2228 'and a non-TypedDict base class')
2229 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002230
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002231 annotations = {}
2232 own_annotations = ns.get('__annotations__', {})
2233 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002234 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002235 own_annotations = {
2236 n: _type_check(tp, msg) for n, tp in own_annotations.items()
2237 }
2238 required_keys = set()
2239 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002240
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002241 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002242 annotations.update(base.__dict__.get('__annotations__', {}))
2243 required_keys.update(base.__dict__.get('__required_keys__', ()))
2244 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002245
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002246 annotations.update(own_annotations)
2247 if total:
2248 required_keys.update(own_annotation_keys)
2249 else:
2250 optional_keys.update(own_annotation_keys)
2251
2252 tp_dict.__annotations__ = annotations
2253 tp_dict.__required_keys__ = frozenset(required_keys)
2254 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002255 if not hasattr(tp_dict, '__total__'):
2256 tp_dict.__total__ = total
2257 return tp_dict
2258
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002259 __call__ = dict # static method
2260
2261 def __subclasscheck__(cls, other):
2262 # Typed dicts are only for static structural subtyping.
2263 raise TypeError('TypedDict does not support instance and class checks')
2264
2265 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002266
2267
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002268def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002269 """A simple typed namespace. At runtime it is equivalent to a plain dict.
2270
2271 TypedDict creates a dictionary type that expects all of its
2272 instances to have a certain set of keys, where each key is
2273 associated with a value of a consistent type. This expectation
2274 is not checked at runtime but is only enforced by type checkers.
2275 Usage::
2276
2277 class Point2D(TypedDict):
2278 x: int
2279 y: int
2280 label: str
2281
2282 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
2283 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
2284
2285 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
2286
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002287 The type info can be accessed via the Point2D.__annotations__ dict, and
2288 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
2289 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002290
2291 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
2292 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
2293
ananthan-123ab6423f2020-02-19 10:03:05 +05302294 By default, all keys must be present in a TypedDict. It is possible
2295 to override this by specifying totality.
2296 Usage::
2297
2298 class point2D(TypedDict, total=False):
2299 x: int
2300 y: int
2301
2302 This means that a point2D TypedDict can have any of the keys omitted.A type
2303 checker is only expected to support a literal False or True as the value of
2304 the total argument. True is the default, and makes all items defined in the
2305 class body be required.
2306
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002307 The class syntax is only supported in Python 3.6+, while two other
2308 syntax forms work for Python 2.7 and 3.2+
2309 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002310 if fields is None:
2311 fields = kwargs
2312 elif kwargs:
2313 raise TypeError("TypedDict takes either a dict or keyword arguments,"
2314 " but not both")
2315
Alex Grönholm67b769f2020-12-10 23:49:05 +02002316 ns = {'__annotations__': dict(fields)}
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002317 try:
2318 # Setting correct module is necessary to make typed dict classes pickleable.
2319 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
2320 except (AttributeError, ValueError):
2321 pass
2322
Alex Grönholm67b769f2020-12-10 23:49:05 +02002323 return _TypedDictMeta(typename, (), ns, total=total)
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002324
2325_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
2326TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002327
2328
Guido van Rossum91185fe2016-06-08 11:19:11 -07002329def NewType(name, tp):
2330 """NewType creates simple unique types with almost zero
2331 runtime overhead. NewType(name, tp) is considered a subtype of tp
2332 by static type checkers. At runtime, NewType(name, tp) returns
2333 a dummy function that simply returns its argument. Usage::
2334
2335 UserId = NewType('UserId', int)
2336
2337 def name_by_id(user_id: UserId) -> str:
2338 ...
2339
2340 UserId('user') # Fails type check
2341
2342 name_by_id(42) # Fails type check
2343 name_by_id(UserId(42)) # OK
2344
2345 num = UserId(5) + 1 # type: int
2346 """
2347
2348 def new_type(x):
2349 return x
2350
2351 new_type.__name__ = name
2352 new_type.__supertype__ = tp
2353 return new_type
2354
2355
Guido van Rossum0e0563c2016-04-05 14:54:25 -07002356# Python-version-specific alias (Python 2: unicode; Python 3: str)
2357Text = str
2358
2359
Guido van Rossum91185fe2016-06-08 11:19:11 -07002360# Constant that's True when type checking, but False here.
2361TYPE_CHECKING = False
2362
2363
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002364class IO(Generic[AnyStr]):
2365 """Generic base class for TextIO and BinaryIO.
2366
2367 This is an abstract, generic version of the return of open().
2368
2369 NOTE: This does not distinguish between the different possible
2370 classes (text vs. binary, read vs. write vs. read/write,
2371 append-only, unbuffered). The TextIO and BinaryIO subclasses
2372 below capture the distinctions between text vs. binary, which is
2373 pervasive in the interface; however we currently do not offer a
2374 way to track the other distinctions in the type system.
2375 """
2376
Guido van Rossumd70fe632015-08-05 12:11:06 +02002377 __slots__ = ()
2378
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002379 @property
2380 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002381 def mode(self) -> str:
2382 pass
2383
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002384 @property
2385 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002386 def name(self) -> str:
2387 pass
2388
2389 @abstractmethod
2390 def close(self) -> None:
2391 pass
2392
Shantanu2e6569b2020-01-29 18:52:36 -08002393 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002394 @abstractmethod
2395 def closed(self) -> bool:
2396 pass
2397
2398 @abstractmethod
2399 def fileno(self) -> int:
2400 pass
2401
2402 @abstractmethod
2403 def flush(self) -> None:
2404 pass
2405
2406 @abstractmethod
2407 def isatty(self) -> bool:
2408 pass
2409
2410 @abstractmethod
2411 def read(self, n: int = -1) -> AnyStr:
2412 pass
2413
2414 @abstractmethod
2415 def readable(self) -> bool:
2416 pass
2417
2418 @abstractmethod
2419 def readline(self, limit: int = -1) -> AnyStr:
2420 pass
2421
2422 @abstractmethod
2423 def readlines(self, hint: int = -1) -> List[AnyStr]:
2424 pass
2425
2426 @abstractmethod
2427 def seek(self, offset: int, whence: int = 0) -> int:
2428 pass
2429
2430 @abstractmethod
2431 def seekable(self) -> bool:
2432 pass
2433
2434 @abstractmethod
2435 def tell(self) -> int:
2436 pass
2437
2438 @abstractmethod
2439 def truncate(self, size: int = None) -> int:
2440 pass
2441
2442 @abstractmethod
2443 def writable(self) -> bool:
2444 pass
2445
2446 @abstractmethod
2447 def write(self, s: AnyStr) -> int:
2448 pass
2449
2450 @abstractmethod
2451 def writelines(self, lines: List[AnyStr]) -> None:
2452 pass
2453
2454 @abstractmethod
2455 def __enter__(self) -> 'IO[AnyStr]':
2456 pass
2457
2458 @abstractmethod
2459 def __exit__(self, type, value, traceback) -> None:
2460 pass
2461
2462
2463class BinaryIO(IO[bytes]):
2464 """Typed version of the return of open() in binary mode."""
2465
Guido van Rossumd70fe632015-08-05 12:11:06 +02002466 __slots__ = ()
2467
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002468 @abstractmethod
2469 def write(self, s: Union[bytes, bytearray]) -> int:
2470 pass
2471
2472 @abstractmethod
2473 def __enter__(self) -> 'BinaryIO':
2474 pass
2475
2476
2477class TextIO(IO[str]):
2478 """Typed version of the return of open() in text mode."""
2479
Guido van Rossumd70fe632015-08-05 12:11:06 +02002480 __slots__ = ()
2481
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002482 @property
2483 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002484 def buffer(self) -> BinaryIO:
2485 pass
2486
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002487 @property
2488 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002489 def encoding(self) -> str:
2490 pass
2491
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002492 @property
2493 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002494 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002495 pass
2496
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002497 @property
2498 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002499 def line_buffering(self) -> bool:
2500 pass
2501
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002502 @property
2503 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002504 def newlines(self) -> Any:
2505 pass
2506
2507 @abstractmethod
2508 def __enter__(self) -> 'TextIO':
2509 pass
2510
2511
2512class io:
2513 """Wrapper namespace for IO generic classes."""
2514
2515 __all__ = ['IO', 'TextIO', 'BinaryIO']
2516 IO = IO
2517 TextIO = TextIO
2518 BinaryIO = BinaryIO
2519
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002520
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002521io.__name__ = __name__ + '.io'
2522sys.modules[io.__name__] = io
2523
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002524Pattern = _alias(stdlib_re.Pattern, 1)
2525Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002526
2527class re:
2528 """Wrapper namespace for re type aliases."""
2529
2530 __all__ = ['Pattern', 'Match']
2531 Pattern = Pattern
2532 Match = Match
2533
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002534
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002535re.__name__ = __name__ + '.re'
2536sys.modules[re.__name__] = re