blob: 26efe4a4600acf56ffdb6113ebcbee8e1fbf318e [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
198def _collect_type_vars(types):
kj73607be2020-12-24 12:33:48 +0800199 """Collect all type variable-like variables contained
200 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 """
204 tvars = []
205 for t in types:
kj73607be2020-12-24 12:33:48 +0800206 if isinstance(t, _TypeVarLike) and t not in tvars:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000207 tvars.append(t)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300208 if isinstance(t, (_GenericAlias, GenericAlias)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000209 tvars.extend([t for t in t.__parameters__ if t not in tvars])
210 return tuple(tvars)
211
212
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300213def _check_generic(cls, parameters, elen):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000214 """Check correct count for parameters of a generic cls (internal helper).
215 This gives a nice error message in case of count mismatch.
216 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300217 if not elen:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000218 raise TypeError(f"{cls} is not a generic class")
219 alen = len(parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000220 if alen != elen:
221 raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};"
222 f" actual {alen}, expected {elen}")
223
kj73607be2020-12-24 12:33:48 +0800224def _prepare_paramspec_params(cls, params):
225 """Prepares the parameters for a Generic containing ParamSpec
226 variables (internal helper).
227 """
228 # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612.
229 if len(cls.__parameters__) == 1 and len(params) > 1:
230 return (params,)
231 else:
232 _params = []
233 # Convert lists to tuples to help other libraries cache the results.
234 for p, tvar in zip(params, cls.__parameters__):
235 if isinstance(tvar, ParamSpec) and isinstance(p, list):
236 p = tuple(p)
237 _params.append(p)
238 return tuple(_params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000239
Yurii Karabasf03d3182020-11-17 04:23:19 +0200240def _deduplicate(params):
241 # Weed out strict duplicates, preserving the first of each occurrence.
242 all_params = set(params)
243 if len(all_params) < len(params):
244 new_params = []
245 for t in params:
246 if t in all_params:
247 new_params.append(t)
248 all_params.remove(t)
249 params = new_params
250 assert not all_params, all_params
251 return params
252
253
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000254def _remove_dups_flatten(parameters):
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700255 """An internal helper for Union creation and substitution: flatten Unions
256 among parameters, then remove duplicates.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000257 """
258 # Flatten out Union[Union[...], ...].
259 params = []
260 for p in parameters:
Maggie Moss1b4552c2020-09-09 13:23:24 -0700261 if isinstance(p, (_UnionGenericAlias, types.Union)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000262 params.extend(p.__args__)
263 elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
264 params.extend(p[1:])
265 else:
266 params.append(p)
Yurii Karabasf03d3182020-11-17 04:23:19 +0200267
268 return tuple(_deduplicate(params))
269
270
271def _flatten_literal_params(parameters):
272 """An internal helper for Literal creation: flatten Literals among parameters"""
273 params = []
274 for p in parameters:
275 if isinstance(p, _LiteralGenericAlias):
276 params.extend(p.__args__)
277 else:
278 params.append(p)
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700279 return tuple(params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000280
281
282_cleanups = []
283
284
Yurii Karabasf03d3182020-11-17 04:23:19 +0200285def _tp_cache(func=None, /, *, typed=False):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000286 """Internal wrapper caching __getitem__ of generic types with a fallback to
287 original function for non-hashable arguments.
288 """
Yurii Karabasf03d3182020-11-17 04:23:19 +0200289 def decorator(func):
290 cached = functools.lru_cache(typed=typed)(func)
291 _cleanups.append(cached.cache_clear)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000292
Yurii Karabasf03d3182020-11-17 04:23:19 +0200293 @functools.wraps(func)
294 def inner(*args, **kwds):
295 try:
296 return cached(*args, **kwds)
297 except TypeError:
298 pass # All real errors (not unhashable args) are raised below.
299 return func(*args, **kwds)
300 return inner
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000301
Yurii Karabasf03d3182020-11-17 04:23:19 +0200302 if func is not None:
303 return decorator(func)
304
305 return decorator
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000306
wyfo653f4202020-07-22 21:47:28 +0200307def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
Graham Bleaney84ef33c2020-09-08 18:41:10 -0400308 """Evaluate all forward references in the given type t.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000309 For use of globalns and localns see the docstring for get_type_hints().
wyfo653f4202020-07-22 21:47:28 +0200310 recursive_guard is used to prevent prevent infinite recursion
311 with recursive ForwardRef.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000312 """
313 if isinstance(t, ForwardRef):
wyfo653f4202020-07-22 21:47:28 +0200314 return t._evaluate(globalns, localns, recursive_guard)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300315 if isinstance(t, (_GenericAlias, GenericAlias)):
wyfo653f4202020-07-22 21:47:28 +0200316 ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000317 if ev_args == t.__args__:
318 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300319 if isinstance(t, GenericAlias):
320 return GenericAlias(t.__origin__, ev_args)
321 else:
322 return t.copy_with(ev_args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000323 return t
324
325
326class _Final:
327 """Mixin to prohibit subclassing"""
Guido van Rossum4cefe742016-09-27 15:20:12 -0700328
Guido van Rossum83ec3022017-01-17 20:43:28 -0800329 __slots__ = ('__weakref__',)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700330
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300331 def __init_subclass__(self, /, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000332 if '_root' not in kwds:
333 raise TypeError("Cannot subclass special typing classes")
334
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100335class _Immutable:
336 """Mixin to indicate that object should not be copied."""
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300337 __slots__ = ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000338
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100339 def __copy__(self):
340 return self
341
342 def __deepcopy__(self, memo):
343 return self
344
345
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300346# Internal indicator of special typing constructs.
347# See __doc__ instance attribute for specific docs.
348class _SpecialForm(_Final, _root=True):
349 __slots__ = ('_name', '__doc__', '_getitem')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000350
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300351 def __init__(self, getitem):
352 self._getitem = getitem
353 self._name = getitem.__name__
354 self.__doc__ = getitem.__doc__
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000355
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300356 def __mro_entries__(self, bases):
357 raise TypeError(f"Cannot subclass {self!r}")
Guido van Rossum4cefe742016-09-27 15:20:12 -0700358
359 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000360 return 'typing.' + self._name
361
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100362 def __reduce__(self):
363 return self._name
Guido van Rossum4cefe742016-09-27 15:20:12 -0700364
365 def __call__(self, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000366 raise TypeError(f"Cannot instantiate {self!r}")
367
368 def __instancecheck__(self, obj):
369 raise TypeError(f"{self} cannot be used with isinstance()")
370
371 def __subclasscheck__(self, cls):
372 raise TypeError(f"{self} cannot be used with issubclass()")
373
374 @_tp_cache
375 def __getitem__(self, parameters):
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300376 return self._getitem(self, parameters)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700377
Yurii Karabasf03d3182020-11-17 04:23:19 +0200378
379class _LiteralSpecialForm(_SpecialForm, _root=True):
380 @_tp_cache(typed=True)
381 def __getitem__(self, parameters):
382 return self._getitem(self, parameters)
383
384
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300385@_SpecialForm
386def Any(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000387 """Special type indicating an unconstrained type.
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700388
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000389 - Any is compatible with every type.
390 - Any assumed to have all methods.
391 - All values assumed to be instances of Any.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700392
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000393 Note that all the above statements are true from the point of view of
394 static type checkers. At runtime, Any should not be used with instance
395 or class checks.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300396 """
397 raise TypeError(f"{self} is not subscriptable")
Guido van Rossumd70fe632015-08-05 12:11:06 +0200398
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300399@_SpecialForm
400def NoReturn(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000401 """Special type indicating functions that never return.
402 Example::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700403
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000404 from typing import NoReturn
405
406 def stop() -> NoReturn:
407 raise Exception('no way')
408
409 This type is invalid in other positions, e.g., ``List[NoReturn]``
410 will fail in static type checkers.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300411 """
412 raise TypeError(f"{self} is not subscriptable")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000413
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300414@_SpecialForm
415def ClassVar(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000416 """Special type construct to mark class variables.
417
418 An annotation wrapped in ClassVar indicates that a given
419 attribute is intended to be used as a class variable and
420 should not be set on instances of that class. Usage::
421
422 class Starship:
423 stats: ClassVar[Dict[str, int]] = {} # class variable
424 damage: int = 10 # instance variable
425
426 ClassVar accepts only types and cannot be further subscribed.
427
428 Note that ClassVar is not a class itself, and should not
429 be used with isinstance() or issubclass().
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300430 """
431 item = _type_check(parameters, f'{self} accepts only single type.')
432 return _GenericAlias(self, (item,))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000433
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300434@_SpecialForm
435def Final(self, parameters):
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100436 """Special typing construct to indicate final names to type checkers.
437
438 A final name cannot be re-assigned or overridden in a subclass.
439 For example:
440
441 MAX_SIZE: Final = 9000
442 MAX_SIZE += 1 # Error reported by type checker
443
444 class Connection:
445 TIMEOUT: Final[int] = 10
446
447 class FastConnector(Connection):
448 TIMEOUT = 1 # Error reported by type checker
449
450 There is no runtime checking of these properties.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300451 """
452 item = _type_check(parameters, f'{self} accepts only single type.')
453 return _GenericAlias(self, (item,))
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100454
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300455@_SpecialForm
456def Union(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000457 """Union type; Union[X, Y] means either X or Y.
458
459 To define a union, use e.g. Union[int, str]. Details:
460 - The arguments must be types and there must be at least one.
461 - None as an argument is a special case and is replaced by
462 type(None).
463 - Unions of unions are flattened, e.g.::
464
465 Union[Union[int, str], float] == Union[int, str, float]
466
467 - Unions of a single argument vanish, e.g.::
468
469 Union[int] == int # The constructor actually returns int
470
471 - Redundant arguments are skipped, e.g.::
472
473 Union[int, str, int] == Union[int, str]
474
475 - When comparing unions, the argument order is ignored, e.g.::
476
477 Union[int, str] == Union[str, int]
478
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000479 - You cannot subclass or instantiate a union.
480 - You can use Optional[X] as a shorthand for Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300481 """
482 if parameters == ():
483 raise TypeError("Cannot take a Union of no types.")
484 if not isinstance(parameters, tuple):
485 parameters = (parameters,)
486 msg = "Union[arg, ...]: each arg must be a type."
487 parameters = tuple(_type_check(p, msg) for p in parameters)
488 parameters = _remove_dups_flatten(parameters)
489 if len(parameters) == 1:
490 return parameters[0]
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300491 return _UnionGenericAlias(self, parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000492
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300493@_SpecialForm
494def Optional(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000495 """Optional type.
496
497 Optional[X] is equivalent to Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300498 """
499 arg = _type_check(parameters, f"{self} requires a single type.")
500 return Union[arg, type(None)]
Guido van Rossumb7dedc82016-10-29 12:44:29 -0700501
Yurii Karabasf03d3182020-11-17 04:23:19 +0200502@_LiteralSpecialForm
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300503def Literal(self, parameters):
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100504 """Special typing form to define literal types (a.k.a. value types).
505
506 This form can be used to indicate to type checkers that the corresponding
507 variable or function parameter has a value equivalent to the provided
508 literal (or one of several literals):
509
510 def validate_simple(data: Any) -> Literal[True]: # always returns True
511 ...
512
513 MODE = Literal['r', 'rb', 'w', 'wb']
514 def open_helper(file: str, mode: MODE) -> str:
515 ...
516
517 open_helper('/some/path', 'r') # Passes type check
518 open_helper('/other/path', 'typo') # Error in type checker
519
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300520 Literal[...] cannot be subclassed. At runtime, an arbitrary value
521 is allowed as type argument to Literal[...], but type checkers may
522 impose restrictions.
523 """
524 # There is no '_type_check' call because arguments to Literal[...] are
525 # values, not types.
Yurii Karabasf03d3182020-11-17 04:23:19 +0200526 if not isinstance(parameters, tuple):
527 parameters = (parameters,)
528
529 parameters = _flatten_literal_params(parameters)
530
531 try:
532 parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
533 except TypeError: # unhashable parameters
534 pass
535
536 return _LiteralGenericAlias(self, parameters)
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100537
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700538
Mikhail Golubev4f3c2502020-10-08 00:44:31 +0300539@_SpecialForm
540def TypeAlias(self, parameters):
541 """Special marker indicating that an assignment should
542 be recognized as a proper type alias definition by type
543 checkers.
544
545 For example::
546
547 Predicate: TypeAlias = Callable[..., bool]
548
549 It's invalid when used anywhere except as in the example above.
550 """
551 raise TypeError(f"{self} is not subscriptable")
552
553
kj73607be2020-12-24 12:33:48 +0800554@_SpecialForm
555def Concatenate(self, parameters):
Ken Jin11276cd2021-01-02 08:45:50 +0800556 """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a
557 higher order function which adds, removes or transforms parameters of a
558 callable.
kj73607be2020-12-24 12:33:48 +0800559
560 For example::
561
562 Callable[Concatenate[int, P], int]
563
564 See PEP 612 for detailed information.
565 """
566 if parameters == ():
567 raise TypeError("Cannot take a Concatenate of no types.")
568 if not isinstance(parameters, tuple):
569 parameters = (parameters,)
570 if not isinstance(parameters[-1], ParamSpec):
571 raise TypeError("The last parameter to Concatenate should be a "
572 "ParamSpec variable.")
573 msg = "Concatenate[arg, ...]: each arg must be a type."
574 parameters = tuple(_type_check(p, msg) for p in parameters)
575 return _ConcatenateGenericAlias(self, parameters)
576
577
Ken Jin05ab4b62021-04-27 22:31:04 +0800578@_SpecialForm
579def TypeGuard(self, parameters):
580 """Special typing form used to annotate the return type of a user-defined
581 type guard function. ``TypeGuard`` only accepts a single type argument.
582 At runtime, functions marked this way should return a boolean.
583
584 ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static
585 type checkers to determine a more precise type of an expression within a
586 program's code flow. Usually type narrowing is done by analyzing
587 conditional code flow and applying the narrowing to a block of code. The
588 conditional expression here is sometimes referred to as a "type guard".
589
590 Sometimes it would be convenient to use a user-defined boolean function
591 as a type guard. Such a function should use ``TypeGuard[...]`` as its
592 return type to alert static type checkers to this intention.
593
594 Using ``-> TypeGuard`` tells the static type checker that for a given
595 function:
596
597 1. The return value is a boolean.
598 2. If the return value is ``True``, the type of its argument
599 is the type inside ``TypeGuard``.
600
601 For example::
602
603 def is_str(val: Union[str, float]):
604 # "isinstance" type guard
605 if isinstance(val, str):
606 # Type of ``val`` is narrowed to ``str``
607 ...
608 else:
609 # Else, type of ``val`` is narrowed to ``float``.
610 ...
611
612 Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower
613 form of ``TypeA`` (it can even be a wider form) and this may lead to
614 type-unsafe results. The main reason is to allow for things like
615 narrowing ``List[object]`` to ``List[str]`` even though the latter is not
616 a subtype of the former, since ``List`` is invariant. The responsibility of
617 writing type-safe type guards is left to the user.
618
619 ``TypeGuard`` also works with type variables. For more information, see
620 PEP 647 (User-Defined Type Guards).
621 """
622 item = _type_check(parameters, f'{self} accepts only single type.')
623 return _GenericAlias(self, (item,))
624
625
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000626class ForwardRef(_Final, _root=True):
Guido van Rossumb24569a2016-11-20 18:01:29 -0800627 """Internal wrapper to hold a forward reference."""
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700628
Guido van Rossum4cefe742016-09-27 15:20:12 -0700629 __slots__ = ('__forward_arg__', '__forward_code__',
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400630 '__forward_evaluated__', '__forward_value__',
631 '__forward_is_argument__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700632
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700633 def __init__(self, arg, is_argument=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700634 if not isinstance(arg, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000635 raise TypeError(f"Forward reference must be a string -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700636 try:
637 code = compile(arg, '<string>', 'eval')
638 except SyntaxError:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000639 raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700640 self.__forward_arg__ = arg
641 self.__forward_code__ = code
642 self.__forward_evaluated__ = False
643 self.__forward_value__ = None
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400644 self.__forward_is_argument__ = is_argument
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700645
wyfo653f4202020-07-22 21:47:28 +0200646 def _evaluate(self, globalns, localns, recursive_guard):
647 if self.__forward_arg__ in recursive_guard:
648 return self
Guido van Rossumdad17902016-11-10 08:29:18 -0800649 if not self.__forward_evaluated__ or localns is not globalns:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700650 if globalns is None and localns is None:
651 globalns = localns = {}
652 elif globalns is None:
653 globalns = localns
654 elif localns is None:
655 localns = globalns
wyfo653f4202020-07-22 21:47:28 +0200656 type_ =_type_check(
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700657 eval(self.__forward_code__, globalns, localns),
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400658 "Forward references must evaluate to types.",
wyfo653f4202020-07-22 21:47:28 +0200659 is_argument=self.__forward_is_argument__,
660 )
661 self.__forward_value__ = _eval_type(
662 type_, globalns, localns, recursive_guard | {self.__forward_arg__}
663 )
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700664 self.__forward_evaluated__ = True
665 return self.__forward_value__
666
Guido van Rossum4cefe742016-09-27 15:20:12 -0700667 def __eq__(self, other):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000668 if not isinstance(other, ForwardRef):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700669 return NotImplemented
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100670 if self.__forward_evaluated__ and other.__forward_evaluated__:
671 return (self.__forward_arg__ == other.__forward_arg__ and
672 self.__forward_value__ == other.__forward_value__)
673 return self.__forward_arg__ == other.__forward_arg__
Guido van Rossum4cefe742016-09-27 15:20:12 -0700674
675 def __hash__(self):
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100676 return hash(self.__forward_arg__)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700677
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700678 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000679 return f'ForwardRef({self.__forward_arg__!r})'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700680
kj73607be2020-12-24 12:33:48 +0800681class _TypeVarLike:
682 """Mixin for TypeVar-like types (TypeVar and ParamSpec)."""
683 def __init__(self, bound, covariant, contravariant):
684 """Used to setup TypeVars and ParamSpec's bound, covariant and
685 contravariant attributes.
686 """
687 if covariant and contravariant:
688 raise ValueError("Bivariant types are not supported.")
689 self.__covariant__ = bool(covariant)
690 self.__contravariant__ = bool(contravariant)
691 if bound:
692 self.__bound__ = _type_check(bound, "Bound must be a type.")
693 else:
694 self.__bound__ = None
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700695
kj73607be2020-12-24 12:33:48 +0800696 def __or__(self, right):
697 return Union[self, right]
698
Jelle Zijlstra90459192021-04-10 20:00:05 -0700699 def __ror__(self, left):
700 return Union[left, self]
kj73607be2020-12-24 12:33:48 +0800701
702 def __repr__(self):
703 if self.__covariant__:
704 prefix = '+'
705 elif self.__contravariant__:
706 prefix = '-'
707 else:
708 prefix = '~'
709 return prefix + self.__name__
710
711 def __reduce__(self):
712 return self.__name__
713
714
715class TypeVar( _Final, _Immutable, _TypeVarLike, _root=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700716 """Type variable.
717
718 Usage::
719
720 T = TypeVar('T') # Can be anything
721 A = TypeVar('A', str, bytes) # Must be str or bytes
722
723 Type variables exist primarily for the benefit of static type
724 checkers. They serve as the parameters for generic types as well
725 as for generic function definitions. See class Generic for more
726 information on generic types. Generic functions work as follows:
727
Guido van Rossumb24569a2016-11-20 18:01:29 -0800728 def repeat(x: T, n: int) -> List[T]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700729 '''Return a list containing n references to x.'''
730 return [x]*n
731
732 def longest(x: A, y: A) -> A:
733 '''Return the longest of two strings.'''
734 return x if len(x) >= len(y) else y
735
736 The latter example's signature is essentially the overloading
737 of (str, str) -> str and (bytes, bytes) -> bytes. Also note
738 that if the arguments are instances of some subclass of str,
739 the return type is still plain str.
740
Guido van Rossumb24569a2016-11-20 18:01:29 -0800741 At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700742
Guido van Rossumefa798d2016-08-23 11:01:50 -0700743 Type variables defined with covariant=True or contravariant=True
João D. Ferreira86bfed32018-07-07 16:41:20 +0100744 can be used to declare covariant or contravariant generic types.
Guido van Rossumefa798d2016-08-23 11:01:50 -0700745 See PEP 484 for more details. By default generic types are invariant
746 in all type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700747
748 Type variables can be introspected. e.g.:
749
750 T.__name__ == 'T'
751 T.__constraints__ == ()
752 T.__covariant__ == False
753 T.__contravariant__ = False
754 A.__constraints__ == (str, bytes)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100755
756 Note that only type variables defined in global scope can be pickled.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700757 """
758
Guido van Rossum4cefe742016-09-27 15:20:12 -0700759 __slots__ = ('__name__', '__bound__', '__constraints__',
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300760 '__covariant__', '__contravariant__', '__dict__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700761
762 def __init__(self, name, *constraints, bound=None,
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800763 covariant=False, contravariant=False):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700764 self.__name__ = name
kj73607be2020-12-24 12:33:48 +0800765 super().__init__(bound, covariant, contravariant)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700766 if constraints and bound is not None:
767 raise TypeError("Constraints cannot be combined with bound=...")
768 if constraints and len(constraints) == 1:
769 raise TypeError("A single constraint is not allowed")
770 msg = "TypeVar(name, constraint, ...): constraints must be types."
771 self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
HongWeipenga25a04f2020-04-21 04:01:53 +0800772 try:
773 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling
774 except (AttributeError, ValueError):
775 def_mod = None
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300776 if def_mod != 'typing':
777 self.__module__ = def_mod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700778
Maggie Moss1b4552c2020-09-09 13:23:24 -0700779
Jelle Zijlstra52243362021-04-10 19:57:05 -0700780class ParamSpecArgs(_Final, _Immutable, _root=True):
781 """The args for a ParamSpec object.
782
783 Given a ParamSpec object P, P.args is an instance of ParamSpecArgs.
784
785 ParamSpecArgs objects have a reference back to their ParamSpec:
786
787 P.args.__origin__ is P
788
789 This type is meant for runtime introspection and has no special meaning to
790 static type checkers.
791 """
792 def __init__(self, origin):
793 self.__origin__ = origin
794
795 def __repr__(self):
796 return f"{self.__origin__.__name__}.args"
797
798
799class ParamSpecKwargs(_Final, _Immutable, _root=True):
800 """The kwargs for a ParamSpec object.
801
802 Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs.
803
804 ParamSpecKwargs objects have a reference back to their ParamSpec:
805
806 P.kwargs.__origin__ is P
807
808 This type is meant for runtime introspection and has no special meaning to
809 static type checkers.
810 """
811 def __init__(self, origin):
812 self.__origin__ = origin
813
814 def __repr__(self):
815 return f"{self.__origin__.__name__}.kwargs"
816
817
kj73607be2020-12-24 12:33:48 +0800818class ParamSpec(_Final, _Immutable, _TypeVarLike, _root=True):
819 """Parameter specification variable.
Maggie Moss1b4552c2020-09-09 13:23:24 -0700820
kj73607be2020-12-24 12:33:48 +0800821 Usage::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700822
kj73607be2020-12-24 12:33:48 +0800823 P = ParamSpec('P')
824
825 Parameter specification variables exist primarily for the benefit of static
826 type checkers. They are used to forward the parameter types of one
Ken Jin11276cd2021-01-02 08:45:50 +0800827 callable to another callable, a pattern commonly found in higher order
828 functions and decorators. They are only valid when used in ``Concatenate``,
829 or s the first argument to ``Callable``, or as parameters for user-defined
830 Generics. See class Generic for more information on generic types. An
831 example for annotating a decorator::
kj73607be2020-12-24 12:33:48 +0800832
833 T = TypeVar('T')
834 P = ParamSpec('P')
835
836 def add_logging(f: Callable[P, T]) -> Callable[P, T]:
837 '''A type-safe decorator to add logging to a function.'''
838 def inner(*args: P.args, **kwargs: P.kwargs) -> T:
839 logging.info(f'{f.__name__} was called')
840 return f(*args, **kwargs)
841 return inner
842
843 @add_logging
844 def add_two(x: float, y: float) -> float:
845 '''Add two numbers together.'''
846 return x + y
847
848 Parameter specification variables defined with covariant=True or
849 contravariant=True can be used to declare covariant or contravariant
850 generic types. These keyword arguments are valid, but their actual semantics
851 are yet to be decided. See PEP 612 for details.
852
853 Parameter specification variables can be introspected. e.g.:
854
855 P.__name__ == 'T'
856 P.__bound__ == None
857 P.__covariant__ == False
858 P.__contravariant__ == False
859
860 Note that only parameter specification variables defined in global scope can
861 be pickled.
862 """
863
864 __slots__ = ('__name__', '__bound__', '__covariant__', '__contravariant__',
865 '__dict__')
866
Jelle Zijlstra52243362021-04-10 19:57:05 -0700867 @property
868 def args(self):
869 return ParamSpecArgs(self)
870
871 @property
872 def kwargs(self):
873 return ParamSpecKwargs(self)
kj73607be2020-12-24 12:33:48 +0800874
Ken Jinace008c2021-01-11 08:11:41 +0800875 def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
kj73607be2020-12-24 12:33:48 +0800876 self.__name__ = name
877 super().__init__(bound, covariant, contravariant)
878 try:
879 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
880 except (AttributeError, ValueError):
881 def_mod = None
882 if def_mod != 'typing':
883 self.__module__ = def_mod
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100884
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700885
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000886def _is_dunder(attr):
887 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800888
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300889class _BaseGenericAlias(_Final, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000890 """The central part of internal API.
891
892 This represents a generic version of type 'origin' with type arguments 'params'.
893 There are two kind of these aliases: user defined and special. The special ones
894 are wrappers around builtin collections and ABCs in collections.abc. These must
895 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
896 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700897 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300898 def __init__(self, origin, *, inst=True, name=None):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000899 self._inst = inst
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000900 self._name = name
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700901 self.__origin__ = origin
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000902 self.__slots__ = None # This is not documented.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300903
904 def __call__(self, *args, **kwargs):
905 if not self._inst:
906 raise TypeError(f"Type {self._name} cannot be instantiated; "
907 f"use {self.__origin__.__name__}() instead")
908 result = self.__origin__(*args, **kwargs)
909 try:
910 result.__orig_class__ = self
911 except AttributeError:
912 pass
913 return result
914
915 def __mro_entries__(self, bases):
916 res = []
917 if self.__origin__ not in bases:
918 res.append(self.__origin__)
919 i = bases.index(self)
920 for b in bases[i+1:]:
921 if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
922 break
923 else:
924 res.append(Generic)
925 return tuple(res)
926
927 def __getattr__(self, attr):
928 # We are careful for copy and pickle.
929 # Also for simplicity we just don't relay all dunder names
930 if '__origin__' in self.__dict__ and not _is_dunder(attr):
931 return getattr(self.__origin__, attr)
932 raise AttributeError(attr)
933
934 def __setattr__(self, attr, val):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300935 if _is_dunder(attr) or attr in ('_name', '_inst', '_nparams'):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300936 super().__setattr__(attr, val)
937 else:
938 setattr(self.__origin__, attr, val)
939
940 def __instancecheck__(self, obj):
941 return self.__subclasscheck__(type(obj))
942
943 def __subclasscheck__(self, cls):
944 raise TypeError("Subscripted generics cannot be used with"
945 " class and instance checks")
946
947
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300948# Special typing constructs Union, Optional, Generic, Callable and Tuple
949# use three special attributes for internal bookkeeping of generic types:
950# * __parameters__ is a tuple of unique free type parameters of a generic
951# type, for example, Dict[T, T].__parameters__ == (T,);
952# * __origin__ keeps a reference to a type that was subscripted,
953# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
954# the type.
955# * __args__ is a tuple of all arguments used in subscripting,
956# e.g., Dict[T, int].__args__ == (T, int).
957
958
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300959class _GenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300960 def __init__(self, origin, params, *, inst=True, name=None):
961 super().__init__(origin, inst=inst, name=name)
962 if not isinstance(params, tuple):
963 params = (params,)
964 self.__args__ = tuple(... if a is _TypingEllipsis else
965 () if a is _TypingEmpty else
966 a for a in params)
967 self.__parameters__ = _collect_type_vars(params)
968 if not name:
969 self.__module__ = origin.__module__
970
971 def __eq__(self, other):
972 if not isinstance(other, _GenericAlias):
973 return NotImplemented
974 return (self.__origin__ == other.__origin__
975 and self.__args__ == other.__args__)
976
977 def __hash__(self):
978 return hash((self.__origin__, self.__args__))
979
Maggie Moss1b4552c2020-09-09 13:23:24 -0700980 def __or__(self, right):
981 return Union[self, right]
982
983 def __ror__(self, right):
984 return Union[self, right]
985
Guido van Rossum4cefe742016-09-27 15:20:12 -0700986 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700987 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100988 if self.__origin__ in (Generic, Protocol):
989 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000990 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700991 if not isinstance(params, tuple):
992 params = (params,)
kj73607be2020-12-24 12:33:48 +0800993 params = tuple(_type_convert(p) for p in params)
994 if any(isinstance(t, ParamSpec) for t in self.__parameters__):
995 params = _prepare_paramspec_params(self, params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300996 _check_generic(self, params, len(self.__parameters__))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300997
998 subst = dict(zip(self.__parameters__, params))
999 new_args = []
1000 for arg in self.__args__:
kj73607be2020-12-24 12:33:48 +08001001 if isinstance(arg, _TypeVarLike):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001002 arg = subst[arg]
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001003 elif isinstance(arg, (_GenericAlias, GenericAlias)):
Serhiy Storchaka0122d482020-05-10 13:39:40 +03001004 subparams = arg.__parameters__
1005 if subparams:
1006 subargs = tuple(subst[x] for x in subparams)
1007 arg = arg[subargs]
kj73607be2020-12-24 12:33:48 +08001008 # Required to flatten out the args for CallableGenericAlias
1009 if self.__origin__ == collections.abc.Callable and isinstance(arg, tuple):
1010 new_args.extend(arg)
1011 else:
1012 new_args.append(arg)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001013 return self.copy_with(tuple(new_args))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001014
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001015 def copy_with(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001016 return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001017
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001018 def __repr__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001019 if self._name:
1020 name = 'typing.' + self._name
1021 else:
1022 name = _type_repr(self.__origin__)
1023 args = ", ".join([_type_repr(a) for a in self.__args__])
1024 return f'{name}[{args}]'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001025
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001026 def __reduce__(self):
1027 if self._name:
1028 origin = globals()[self._name]
1029 else:
1030 origin = self.__origin__
1031 args = tuple(self.__args__)
1032 if len(args) == 1 and not isinstance(args[0], tuple):
1033 args, = args
1034 return operator.getitem, (origin, args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001035
1036 def __mro_entries__(self, bases):
1037 if self._name: # generic version of an ABC or built-in class
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001038 return super().__mro_entries__(bases)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001039 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001040 if Protocol in bases:
1041 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001042 i = bases.index(self)
1043 for b in bases[i+1:]:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001044 if isinstance(b, _BaseGenericAlias) and b is not self:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001045 return ()
1046 return (self.__origin__,)
1047
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001048
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001049# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
1050# 1 for List and 2 for Dict. It may be -1 if variable number of
1051# parameters are accepted (needs custom __getitem__).
1052
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001053class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001054 def __init__(self, origin, nparams, *, inst=True, name=None):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001055 if name is None:
1056 name = origin.__name__
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001057 super().__init__(origin, inst=inst, name=name)
1058 self._nparams = nparams
Serhiy Storchaka2fbc57a2020-05-10 15:14:27 +03001059 if origin.__module__ == 'builtins':
1060 self.__doc__ = f'A generic version of {origin.__qualname__}.'
1061 else:
1062 self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001063
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001064 @_tp_cache
1065 def __getitem__(self, params):
1066 if not isinstance(params, tuple):
1067 params = (params,)
1068 msg = "Parameters to generic types must be types."
1069 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001070 _check_generic(self, params, self._nparams)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001071 return self.copy_with(params)
1072
1073 def copy_with(self, params):
1074 return _GenericAlias(self.__origin__, params,
1075 name=self._name, inst=self._inst)
1076
1077 def __repr__(self):
1078 return 'typing.' + self._name
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001079
1080 def __subclasscheck__(self, cls):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001081 if isinstance(cls, _SpecialGenericAlias):
1082 return issubclass(cls.__origin__, self.__origin__)
1083 if not isinstance(cls, _GenericAlias):
1084 return issubclass(cls, self.__origin__)
1085 return super().__subclasscheck__(cls)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001086
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001087 def __reduce__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001088 return self._name
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001089
Maggie Moss1b4552c2020-09-09 13:23:24 -07001090 def __or__(self, right):
1091 return Union[self, right]
1092
1093 def __ror__(self, right):
1094 return Union[self, right]
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001095
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001096class _CallableGenericAlias(_GenericAlias, _root=True):
1097 def __repr__(self):
1098 assert self._name == 'Callable'
kj73607be2020-12-24 12:33:48 +08001099 args = self.__args__
1100 if len(args) == 2 and (args[0] is Ellipsis
1101 or isinstance(args[0], (ParamSpec, _ConcatenateGenericAlias))):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001102 return super().__repr__()
1103 return (f'typing.Callable'
kj73607be2020-12-24 12:33:48 +08001104 f'[[{", ".join([_type_repr(a) for a in args[:-1]])}], '
1105 f'{_type_repr(args[-1])}]')
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001106
1107 def __reduce__(self):
1108 args = self.__args__
kj73607be2020-12-24 12:33:48 +08001109 if not (len(args) == 2 and (args[0] is Ellipsis
1110 or isinstance(args[0], (ParamSpec, _ConcatenateGenericAlias)))):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001111 args = list(args[:-1]), args[-1]
1112 return operator.getitem, (Callable, args)
1113
1114
1115class _CallableType(_SpecialGenericAlias, _root=True):
1116 def copy_with(self, params):
1117 return _CallableGenericAlias(self.__origin__, params,
1118 name=self._name, inst=self._inst)
1119
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001120 def __getitem__(self, params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001121 if not isinstance(params, tuple) or len(params) != 2:
1122 raise TypeError("Callable must be used as "
1123 "Callable[[arg, ...], result].")
1124 args, result = params
kj463c7d32020-12-14 02:38:24 +08001125 # This relaxes what args can be on purpose to allow things like
1126 # PEP 612 ParamSpec. Responsibility for whether a user is using
1127 # Callable[...] properly is deferred to static type checkers.
1128 if isinstance(args, list):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001129 params = (tuple(args), result)
kj463c7d32020-12-14 02:38:24 +08001130 else:
1131 params = (args, result)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001132 return self.__getitem_inner__(params)
1133
1134 @_tp_cache
1135 def __getitem_inner__(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001136 args, result = params
1137 msg = "Callable[args, result]: result must be a type."
1138 result = _type_check(result, msg)
1139 if args is Ellipsis:
1140 return self.copy_with((_TypingEllipsis, result))
kj463c7d32020-12-14 02:38:24 +08001141 if not isinstance(args, tuple):
1142 args = (args,)
1143 args = tuple(_type_convert(arg) for arg in args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001144 params = args + (result,)
1145 return self.copy_with(params)
1146
1147
1148class _TupleType(_SpecialGenericAlias, _root=True):
1149 @_tp_cache
1150 def __getitem__(self, params):
1151 if params == ():
1152 return self.copy_with((_TypingEmpty,))
1153 if not isinstance(params, tuple):
1154 params = (params,)
1155 if len(params) == 2 and params[1] is ...:
1156 msg = "Tuple[t, ...]: t must be a type."
1157 p = _type_check(params[0], msg)
1158 return self.copy_with((p, _TypingEllipsis))
1159 msg = "Tuple[t0, t1, ...]: each t must be a type."
1160 params = tuple(_type_check(p, msg) for p in params)
1161 return self.copy_with(params)
1162
1163
1164class _UnionGenericAlias(_GenericAlias, _root=True):
1165 def copy_with(self, params):
1166 return Union[params]
1167
1168 def __eq__(self, other):
1169 if not isinstance(other, _UnionGenericAlias):
1170 return NotImplemented
1171 return set(self.__args__) == set(other.__args__)
1172
1173 def __hash__(self):
1174 return hash(frozenset(self.__args__))
1175
1176 def __repr__(self):
1177 args = self.__args__
1178 if len(args) == 2:
1179 if args[0] is type(None):
1180 return f'typing.Optional[{_type_repr(args[1])}]'
1181 elif args[1] is type(None):
1182 return f'typing.Optional[{_type_repr(args[0])}]'
1183 return super().__repr__()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001184
Maggie Moss1b4552c2020-09-09 13:23:24 -07001185 def __instancecheck__(self, obj):
1186 return self.__subclasscheck__(type(obj))
1187
1188 def __subclasscheck__(self, cls):
1189 for arg in self.__args__:
1190 if issubclass(cls, arg):
1191 return True
1192
1193
Yurii Karabasf03d3182020-11-17 04:23:19 +02001194def _value_and_type_iter(parameters):
1195 return ((p, type(p)) for p in parameters)
1196
1197
1198class _LiteralGenericAlias(_GenericAlias, _root=True):
1199
1200 def __eq__(self, other):
1201 if not isinstance(other, _LiteralGenericAlias):
1202 return NotImplemented
1203
1204 return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__))
1205
1206 def __hash__(self):
Yurii Karabas1b540772020-11-19 18:17:38 +02001207 return hash(frozenset(_value_and_type_iter(self.__args__)))
Yurii Karabasf03d3182020-11-17 04:23:19 +02001208
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001209
kj73607be2020-12-24 12:33:48 +08001210class _ConcatenateGenericAlias(_GenericAlias, _root=True):
1211 pass
1212
1213
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001214class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001215 """Abstract base class for generic types.
1216
Guido van Rossumb24569a2016-11-20 18:01:29 -08001217 A generic type is typically declared by inheriting from
1218 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001219 For example, a generic mapping type might be defined as::
1220
1221 class Mapping(Generic[KT, VT]):
1222 def __getitem__(self, key: KT) -> VT:
1223 ...
1224 # Etc.
1225
1226 This class can then be used as follows::
1227
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001228 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001229 try:
1230 return mapping[key]
1231 except KeyError:
1232 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001233 """
Guido van Rossumd70fe632015-08-05 12:11:06 +02001234 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001235 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +02001236
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001237 @_tp_cache
1238 def __class_getitem__(cls, params):
1239 if not isinstance(params, tuple):
1240 params = (params,)
1241 if not params and cls is not Tuple:
1242 raise TypeError(
1243 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
kj73607be2020-12-24 12:33:48 +08001244 params = tuple(_type_convert(p) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001245 if cls in (Generic, Protocol):
1246 # Generic and Protocol can only be subscripted with unique type variables.
kj73607be2020-12-24 12:33:48 +08001247 if not all(isinstance(p, _TypeVarLike) for p in params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001248 raise TypeError(
kj73607be2020-12-24 12:33:48 +08001249 f"Parameters to {cls.__name__}[...] must all be type variables "
1250 f"or parameter specification variables.")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001251 if len(set(params)) != len(params):
1252 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001253 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001254 else:
1255 # Subscripting a regular Generic subclass.
kj73607be2020-12-24 12:33:48 +08001256 if any(isinstance(t, ParamSpec) for t in cls.__parameters__):
1257 params = _prepare_paramspec_params(cls, params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001258 _check_generic(cls, params, len(cls.__parameters__))
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001259 return _GenericAlias(cls, params)
1260
1261 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +01001262 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001263 tvars = []
1264 if '__orig_bases__' in cls.__dict__:
1265 error = Generic in cls.__orig_bases__
1266 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001267 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001268 if error:
1269 raise TypeError("Cannot inherit from plain Generic")
1270 if '__orig_bases__' in cls.__dict__:
1271 tvars = _collect_type_vars(cls.__orig_bases__)
1272 # Look for Generic[T1, ..., Tn].
1273 # If found, tvars must be a subset of it.
1274 # If not found, tvars is it.
1275 # Also check for and reject plain Generic,
1276 # and reject multiple Generic[...].
1277 gvars = None
1278 for base in cls.__orig_bases__:
1279 if (isinstance(base, _GenericAlias) and
1280 base.__origin__ is Generic):
1281 if gvars is not None:
1282 raise TypeError(
1283 "Cannot inherit from Generic[...] multiple types.")
1284 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001285 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001286 tvarset = set(tvars)
1287 gvarset = set(gvars)
1288 if not tvarset <= gvarset:
1289 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
1290 s_args = ', '.join(str(g) for g in gvars)
1291 raise TypeError(f"Some type variables ({s_vars}) are"
1292 f" not listed in Generic[{s_args}]")
1293 tvars = gvars
1294 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001295
1296
1297class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001298 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
1299 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001300 to sneak in where prohibited.
1301 """
1302
1303
1304class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001305 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001306
1307
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001308_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
1309 '_is_protocol', '_is_runtime_protocol']
1310
1311_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
1312 '__init__', '__module__', '__new__', '__slots__',
Guido van Rossum48b069a2020-04-07 09:50:06 -07001313 '__subclasshook__', '__weakref__', '__class_getitem__']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001314
1315# These special attributes will be not collected as protocol members.
1316EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
1317
1318
1319def _get_protocol_attrs(cls):
1320 """Collect protocol members from a protocol class objects.
1321
1322 This includes names actually defined in the class dictionary, as well
1323 as names that appear in annotations. Special names (above) are skipped.
1324 """
1325 attrs = set()
1326 for base in cls.__mro__[:-1]: # without object
1327 if base.__name__ in ('Protocol', 'Generic'):
1328 continue
1329 annotations = getattr(base, '__annotations__', {})
1330 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
1331 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
1332 attrs.add(attr)
1333 return attrs
1334
1335
1336def _is_callable_members_only(cls):
1337 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
1338 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
1339
1340
1341def _no_init(self, *args, **kwargs):
1342 if type(self)._is_protocol:
1343 raise TypeError('Protocols cannot be instantiated')
1344
1345
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001346def _allow_reckless_class_checks(depth=3):
Nickolena Fishercfaf4c02020-04-26 12:49:11 -05001347 """Allow instance and class checks for special stdlib modules.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001348
1349 The abc and functools modules indiscriminately call isinstance() and
1350 issubclass() on the whole MRO of a user class, which may contain protocols.
1351 """
1352 try:
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001353 return sys._getframe(depth).f_globals['__name__'] in ['abc', 'functools']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001354 except (AttributeError, ValueError): # For platforms without _getframe().
1355 return True
1356
1357
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001358_PROTO_ALLOWLIST = {
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001359 'collections.abc': [
1360 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
1361 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
1362 ],
1363 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1364}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001365
1366
1367class _ProtocolMeta(ABCMeta):
1368 # This metaclass is really unfortunate and exists only because of
1369 # the lack of __instancehook__.
1370 def __instancecheck__(cls, instance):
1371 # We need this method for situations where attributes are
1372 # assigned in __init__.
Miss Islington (bot)a2d94a02021-05-12 09:09:04 -07001373 if (
1374 getattr(cls, '_is_protocol', False) and
1375 not getattr(cls, '_is_runtime_protocol', False) and
1376 not _allow_reckless_class_checks(depth=2)
1377 ):
1378 raise TypeError("Instance and class checks can only be used with"
1379 " @runtime_checkable protocols")
1380
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001381 if ((not getattr(cls, '_is_protocol', False) or
1382 _is_callable_members_only(cls)) and
1383 issubclass(instance.__class__, cls)):
1384 return True
1385 if cls._is_protocol:
1386 if all(hasattr(instance, attr) and
1387 # All *methods* can be blocked by setting them to None.
1388 (not callable(getattr(cls, attr, None)) or
1389 getattr(instance, attr) is not None)
1390 for attr in _get_protocol_attrs(cls)):
1391 return True
1392 return super().__instancecheck__(instance)
1393
1394
1395class Protocol(Generic, metaclass=_ProtocolMeta):
1396 """Base class for protocol classes.
1397
1398 Protocol classes are defined as::
1399
1400 class Proto(Protocol):
1401 def meth(self) -> int:
1402 ...
1403
1404 Such classes are primarily used with static type checkers that recognize
1405 structural subtyping (static duck-typing), for example::
1406
1407 class C:
1408 def meth(self) -> int:
1409 return 0
1410
1411 def func(x: Proto) -> int:
1412 return x.meth()
1413
1414 func(C()) # Passes static type check
1415
1416 See PEP 544 for details. Protocol classes decorated with
1417 @typing.runtime_checkable act as simple-minded runtime protocols that check
1418 only the presence of given attributes, ignoring their type signatures.
1419 Protocol classes can be generic, they are defined as::
1420
1421 class GenProto(Protocol[T]):
1422 def meth(self) -> T:
1423 ...
1424 """
1425 __slots__ = ()
1426 _is_protocol = True
1427 _is_runtime_protocol = False
1428
1429 def __init_subclass__(cls, *args, **kwargs):
1430 super().__init_subclass__(*args, **kwargs)
1431
1432 # Determine if this is a protocol or a concrete subclass.
1433 if not cls.__dict__.get('_is_protocol', False):
1434 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1435
1436 # Set (or override) the protocol subclass hook.
1437 def _proto_hook(other):
1438 if not cls.__dict__.get('_is_protocol', False):
1439 return NotImplemented
1440
1441 # First, perform various sanity checks.
1442 if not getattr(cls, '_is_runtime_protocol', False):
Rossc1af1282020-12-29 11:55:28 +00001443 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001444 return NotImplemented
1445 raise TypeError("Instance and class checks can only be used with"
1446 " @runtime_checkable protocols")
1447 if not _is_callable_members_only(cls):
Rossc1af1282020-12-29 11:55:28 +00001448 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001449 return NotImplemented
1450 raise TypeError("Protocols with non-method members"
1451 " don't support issubclass()")
1452 if not isinstance(other, type):
1453 # Same error message as for issubclass(1, int).
1454 raise TypeError('issubclass() arg 1 must be a class')
1455
1456 # Second, perform the actual structural compatibility check.
1457 for attr in _get_protocol_attrs(cls):
1458 for base in other.__mro__:
1459 # Check if the members appears in the class dictionary...
1460 if attr in base.__dict__:
1461 if base.__dict__[attr] is None:
1462 return NotImplemented
1463 break
1464
1465 # ...or in annotations, if it is a sub-protocol.
1466 annotations = getattr(base, '__annotations__', {})
1467 if (isinstance(annotations, collections.abc.Mapping) and
1468 attr in annotations and
1469 issubclass(other, Generic) and other._is_protocol):
1470 break
1471 else:
1472 return NotImplemented
1473 return True
1474
1475 if '__subclasshook__' not in cls.__dict__:
1476 cls.__subclasshook__ = _proto_hook
1477
1478 # We have nothing more to do for non-protocols...
1479 if not cls._is_protocol:
1480 return
1481
1482 # ... otherwise check consistency of bases, and prohibit instantiation.
1483 for base in cls.__bases__:
1484 if not (base in (object, Generic) or
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001485 base.__module__ in _PROTO_ALLOWLIST and
1486 base.__name__ in _PROTO_ALLOWLIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001487 issubclass(base, Generic) and base._is_protocol):
1488 raise TypeError('Protocols can only inherit from other'
1489 ' protocols, got %r' % base)
1490 cls.__init__ = _no_init
1491
1492
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001493class _AnnotatedAlias(_GenericAlias, _root=True):
1494 """Runtime representation of an annotated type.
1495
1496 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1497 with extra annotations. The alias behaves like a normal typing alias,
1498 instantiating is the same as instantiating the underlying type, binding
1499 it to types is also the same.
1500 """
1501 def __init__(self, origin, metadata):
1502 if isinstance(origin, _AnnotatedAlias):
1503 metadata = origin.__metadata__ + metadata
1504 origin = origin.__origin__
1505 super().__init__(origin, origin)
1506 self.__metadata__ = metadata
1507
1508 def copy_with(self, params):
1509 assert len(params) == 1
1510 new_type = params[0]
1511 return _AnnotatedAlias(new_type, self.__metadata__)
1512
1513 def __repr__(self):
1514 return "typing.Annotated[{}, {}]".format(
1515 _type_repr(self.__origin__),
1516 ", ".join(repr(a) for a in self.__metadata__)
1517 )
1518
1519 def __reduce__(self):
1520 return operator.getitem, (
1521 Annotated, (self.__origin__,) + self.__metadata__
1522 )
1523
1524 def __eq__(self, other):
1525 if not isinstance(other, _AnnotatedAlias):
1526 return NotImplemented
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001527 return (self.__origin__ == other.__origin__
1528 and self.__metadata__ == other.__metadata__)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001529
1530 def __hash__(self):
1531 return hash((self.__origin__, self.__metadata__))
1532
1533
1534class Annotated:
1535 """Add context specific metadata to a type.
1536
1537 Example: Annotated[int, runtime_check.Unsigned] indicates to the
1538 hypothetical runtime_check module that this type is an unsigned int.
1539 Every other consumer of this type can ignore this metadata and treat
1540 this type as int.
1541
1542 The first argument to Annotated must be a valid type.
1543
1544 Details:
1545
1546 - It's an error to call `Annotated` with less than two arguments.
1547 - Nested Annotated are flattened::
1548
1549 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1550
1551 - Instantiating an annotated type is equivalent to instantiating the
1552 underlying type::
1553
1554 Annotated[C, Ann1](5) == C(5)
1555
1556 - Annotated can be used as a generic type alias::
1557
1558 Optimized = Annotated[T, runtime.Optimize()]
1559 Optimized[int] == Annotated[int, runtime.Optimize()]
1560
1561 OptimizedList = Annotated[List[T], runtime.Optimize()]
1562 OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1563 """
1564
1565 __slots__ = ()
1566
1567 def __new__(cls, *args, **kwargs):
1568 raise TypeError("Type Annotated cannot be instantiated.")
1569
1570 @_tp_cache
1571 def __class_getitem__(cls, params):
1572 if not isinstance(params, tuple) or len(params) < 2:
1573 raise TypeError("Annotated[...] should be used "
1574 "with at least two arguments (a type and an "
1575 "annotation).")
1576 msg = "Annotated[t, ...]: t must be a type."
1577 origin = _type_check(params[0], msg)
1578 metadata = tuple(params[1:])
1579 return _AnnotatedAlias(origin, metadata)
1580
1581 def __init_subclass__(cls, *args, **kwargs):
1582 raise TypeError(
1583 "Cannot subclass {}.Annotated".format(cls.__module__)
1584 )
1585
1586
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001587def runtime_checkable(cls):
1588 """Mark a protocol class as a runtime protocol.
1589
1590 Such protocol can be used with isinstance() and issubclass().
1591 Raise TypeError if applied to a non-protocol class.
1592 This allows a simple-minded structural check very similar to
1593 one trick ponies in collections.abc such as Iterable.
1594 For example::
1595
1596 @runtime_checkable
1597 class Closable(Protocol):
1598 def close(self): ...
1599
1600 assert isinstance(open('/some/file'), Closable)
1601
1602 Warning: this will check only the presence of the required methods,
1603 not their type signatures!
1604 """
1605 if not issubclass(cls, Generic) or not cls._is_protocol:
1606 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1607 ' got %r' % cls)
1608 cls._is_runtime_protocol = True
1609 return cls
1610
1611
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001612def cast(typ, val):
1613 """Cast a value to a type.
1614
1615 This returns the value unchanged. To the type checker this
1616 signals that the return value has the designated type, but at
1617 runtime we intentionally don't check anything (we want this
1618 to be as fast as possible).
1619 """
1620 return val
1621
1622
1623def _get_defaults(func):
1624 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001625 try:
1626 code = func.__code__
1627 except AttributeError:
1628 # Some built-in functions don't have __code__, __defaults__, etc.
1629 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001630 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001631 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001632 arg_names = arg_names[:pos_count]
1633 defaults = func.__defaults__ or ()
1634 kwdefaults = func.__kwdefaults__
1635 res = dict(kwdefaults) if kwdefaults else {}
1636 pos_offset = pos_count - len(defaults)
1637 for name, value in zip(arg_names[pos_offset:], defaults):
1638 assert name not in res
1639 res[name] = value
1640 return res
1641
1642
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001643_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1644 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001645 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001646
1647
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001648def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001649 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001650
Guido van Rossum991d14f2016-11-09 13:12:51 -08001651 This is often the same as obj.__annotations__, but it handles
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001652 forward references encoded as string literals, adds Optional[t] if a
1653 default value equal to None is set and recursively replaces all
1654 'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001655
Guido van Rossum991d14f2016-11-09 13:12:51 -08001656 The argument may be a module, class, method, or function. The annotations
1657 are returned as a dictionary. For classes, annotations include also
1658 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001659
Guido van Rossum991d14f2016-11-09 13:12:51 -08001660 TypeError is raised if the argument is not of a type that can contain
1661 annotations, and an empty dictionary is returned if no annotations are
1662 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001663
Guido van Rossum991d14f2016-11-09 13:12:51 -08001664 BEWARE -- the behavior of globalns and localns is counterintuitive
1665 (unless you are familiar with how eval() and exec() work). The
1666 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001667
Guido van Rossum991d14f2016-11-09 13:12:51 -08001668 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001669 globals from obj (or the respective module's globals for classes),
1670 and these are also used as the locals. If the object does not appear
Ken Jin1b1f9852021-04-27 01:31:21 +08001671 to have globals, an empty dictionary is used. For classes, the search
1672 order is globals first then locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001673
Guido van Rossum991d14f2016-11-09 13:12:51 -08001674 - If one dict argument is passed, it is used for both globals and
1675 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001676
Guido van Rossum991d14f2016-11-09 13:12:51 -08001677 - If two dict arguments are passed, they specify globals and
1678 locals, respectively.
1679 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001680
Guido van Rossum991d14f2016-11-09 13:12:51 -08001681 if getattr(obj, '__no_type_check__', None):
1682 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001683 # Classes require a special treatment.
1684 if isinstance(obj, type):
1685 hints = {}
1686 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001687 if globalns is None:
Karthikeyan Singaravelana9cf69d2021-04-12 23:47:25 +05301688 try:
1689 base_globals = sys.modules[base.__module__].__dict__
1690 except KeyError:
1691 continue
Łukasz Langaf350a262017-09-14 14:33:00 -04001692 else:
1693 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001694 ann = base.__dict__.get('__annotations__', {})
larryhastings2f2b6982021-04-29 20:09:08 -07001695 if isinstance(ann, types.GetSetDescriptorType):
1696 ann = {}
Ken Jin852150d2021-04-13 01:23:12 +08001697 base_locals = dict(vars(base)) if localns is None else localns
Ken Jin1b1f9852021-04-27 01:31:21 +08001698 if localns is None and globalns is None:
1699 # This is surprising, but required. Before Python 3.10,
1700 # get_type_hints only evaluated the globalns of
1701 # a class. To maintain backwards compatibility, we reverse
1702 # the globalns and localns order so that eval() looks into
1703 # *base_globals* first rather than *base_locals*.
1704 # This only affects ForwardRefs.
1705 base_globals, base_locals = base_locals, base_globals
Guido van Rossum991d14f2016-11-09 13:12:51 -08001706 for name, value in ann.items():
1707 if value is None:
1708 value = type(None)
1709 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001710 value = ForwardRef(value, is_argument=False)
Ken Jin852150d2021-04-13 01:23:12 +08001711 value = _eval_type(value, base_globals, base_locals)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001712 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001713 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001714
1715 if globalns is None:
1716 if isinstance(obj, types.ModuleType):
1717 globalns = obj.__dict__
1718 else:
benedwards140aca3a32019-11-21 17:24:58 +00001719 nsobj = obj
1720 # Find globalns for the unwrapped object.
1721 while hasattr(nsobj, '__wrapped__'):
1722 nsobj = nsobj.__wrapped__
1723 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001724 if localns is None:
1725 localns = globalns
1726 elif localns is None:
1727 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001728 hints = getattr(obj, '__annotations__', None)
1729 if hints is None:
1730 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001731 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001732 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001733 else:
1734 raise TypeError('{!r} is not a module, class, method, '
1735 'or function.'.format(obj))
1736 defaults = _get_defaults(obj)
1737 hints = dict(hints)
1738 for name, value in hints.items():
1739 if value is None:
1740 value = type(None)
1741 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001742 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001743 value = _eval_type(value, globalns, localns)
1744 if name in defaults and defaults[name] is None:
1745 value = Optional[value]
1746 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001747 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1748
1749
1750def _strip_annotations(t):
1751 """Strips the annotations from a given type.
1752 """
1753 if isinstance(t, _AnnotatedAlias):
1754 return _strip_annotations(t.__origin__)
1755 if isinstance(t, _GenericAlias):
1756 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1757 if stripped_args == t.__args__:
1758 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001759 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001760 if isinstance(t, GenericAlias):
1761 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1762 if stripped_args == t.__args__:
1763 return t
1764 return GenericAlias(t.__origin__, stripped_args)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001765 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001766
1767
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001768def get_origin(tp):
1769 """Get the unsubscripted version of a type.
1770
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001771 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1772 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001773
1774 get_origin(Literal[42]) is Literal
1775 get_origin(int) is None
1776 get_origin(ClassVar[int]) is ClassVar
1777 get_origin(Generic) is Generic
1778 get_origin(Generic[T]) is Generic
1779 get_origin(Union[T, int]) is Union
1780 get_origin(List[Tuple[T, T]][int]) == list
Jelle Zijlstra52243362021-04-10 19:57:05 -07001781 get_origin(P.args) is P
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001782 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001783 if isinstance(tp, _AnnotatedAlias):
1784 return Annotated
Jelle Zijlstra52243362021-04-10 19:57:05 -07001785 if isinstance(tp, (_BaseGenericAlias, GenericAlias,
1786 ParamSpecArgs, ParamSpecKwargs)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001787 return tp.__origin__
1788 if tp is Generic:
1789 return Generic
Ken Jinefb1f092020-12-29 10:26:19 +08001790 if isinstance(tp, types.Union):
1791 return types.Union
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001792 return None
1793
1794
1795def get_args(tp):
1796 """Get type arguments with all substitutions performed.
1797
1798 For unions, basic simplifications used by Union constructor are performed.
1799 Examples::
1800 get_args(Dict[str, int]) == (str, int)
1801 get_args(int) == ()
1802 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1803 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1804 get_args(Callable[[], T][int]) == ([], int)
1805 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001806 if isinstance(tp, _AnnotatedAlias):
1807 return (tp.__origin__,) + tp.__metadata__
Ken Jin4140f102020-12-29 04:06:19 +08001808 if isinstance(tp, (_GenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001809 res = tp.__args__
Ken Jinefb1f092020-12-29 10:26:19 +08001810 if (tp.__origin__ is collections.abc.Callable
1811 and not (res[0] is Ellipsis
1812 or isinstance(res[0], (ParamSpec, _ConcatenateGenericAlias)))):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001813 res = (list(res[:-1]), res[-1])
1814 return res
Ken Jinefb1f092020-12-29 10:26:19 +08001815 if isinstance(tp, types.Union):
1816 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001817 return ()
1818
1819
Patrick Reader0705ec82020-09-16 05:58:32 +01001820def is_typeddict(tp):
1821 """Check if an annotation is a TypedDict class
1822
1823 For example::
1824 class Film(TypedDict):
1825 title: str
1826 year: int
1827
1828 is_typeddict(Film) # => True
1829 is_typeddict(Union[list, str]) # => False
1830 """
1831 return isinstance(tp, _TypedDictMeta)
1832
1833
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001834def no_type_check(arg):
1835 """Decorator to indicate that annotations are not type hints.
1836
1837 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001838 applies recursively to all methods and classes defined in that class
1839 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001840
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001841 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001842 """
1843 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001844 arg_attrs = arg.__dict__.copy()
1845 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001846 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001847 arg_attrs.pop(attr)
1848 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001849 if isinstance(obj, types.FunctionType):
1850 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001851 if isinstance(obj, type):
1852 no_type_check(obj)
1853 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001854 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001855 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001856 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001857 return arg
1858
1859
1860def no_type_check_decorator(decorator):
1861 """Decorator to give another decorator the @no_type_check effect.
1862
1863 This wraps the decorator with something that wraps the decorated
1864 function in @no_type_check.
1865 """
1866
1867 @functools.wraps(decorator)
1868 def wrapped_decorator(*args, **kwds):
1869 func = decorator(*args, **kwds)
1870 func = no_type_check(func)
1871 return func
1872
1873 return wrapped_decorator
1874
1875
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001876def _overload_dummy(*args, **kwds):
1877 """Helper for @overload to raise when called."""
1878 raise NotImplementedError(
1879 "You should not call an overloaded function. "
1880 "A series of @overload-decorated functions "
1881 "outside a stub module should always be followed "
1882 "by an implementation that is not @overload-ed.")
1883
1884
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001885def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001886 """Decorator for overloaded functions/methods.
1887
1888 In a stub file, place two or more stub definitions for the same
1889 function in a row, each decorated with @overload. For example:
1890
1891 @overload
1892 def utf8(value: None) -> None: ...
1893 @overload
1894 def utf8(value: bytes) -> bytes: ...
1895 @overload
1896 def utf8(value: str) -> bytes: ...
1897
1898 In a non-stub file (i.e. a regular .py file), do the same but
1899 follow it with an implementation. The implementation should *not*
1900 be decorated with @overload. For example:
1901
1902 @overload
1903 def utf8(value: None) -> None: ...
1904 @overload
1905 def utf8(value: bytes) -> bytes: ...
1906 @overload
1907 def utf8(value: str) -> bytes: ...
1908 def utf8(value):
1909 # implementation goes here
1910 """
1911 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001912
1913
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001914def final(f):
1915 """A decorator to indicate final methods and final classes.
1916
1917 Use this decorator to indicate to type checkers that the decorated
1918 method cannot be overridden, and decorated class cannot be subclassed.
1919 For example:
1920
1921 class Base:
1922 @final
1923 def done(self) -> None:
1924 ...
1925 class Sub(Base):
1926 def done(self) -> None: # Error reported by type checker
1927 ...
1928
1929 @final
1930 class Leaf:
1931 ...
1932 class Other(Leaf): # Error reported by type checker
1933 ...
1934
1935 There is no runtime checking of these properties.
1936 """
1937 return f
1938
1939
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001940# Some unconstrained type variables. These are used by the container types.
1941# (These are not for export.)
1942T = TypeVar('T') # Any type.
1943KT = TypeVar('KT') # Key type.
1944VT = TypeVar('VT') # Value type.
1945T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
1946V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
1947VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
1948T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
1949# Internal type variable used for Type[].
1950CT_co = TypeVar('CT_co', covariant=True, bound=type)
1951
1952# A useful type variable with constraints. This represents string types.
1953# (This one *is* for export!)
1954AnyStr = TypeVar('AnyStr', bytes, str)
1955
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001956
1957# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001958_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001959
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001960Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
1961Awaitable = _alias(collections.abc.Awaitable, 1)
1962Coroutine = _alias(collections.abc.Coroutine, 3)
1963AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
1964AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
1965Iterable = _alias(collections.abc.Iterable, 1)
1966Iterator = _alias(collections.abc.Iterator, 1)
1967Reversible = _alias(collections.abc.Reversible, 1)
1968Sized = _alias(collections.abc.Sized, 0) # Not generic.
1969Container = _alias(collections.abc.Container, 1)
1970Collection = _alias(collections.abc.Collection, 1)
1971Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001972Callable.__doc__ = \
1973 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001974
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001975 The subscription syntax must always be used with exactly two
1976 values: the argument list and the return type. The argument list
1977 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001978
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001979 There is no syntax to indicate optional or keyword arguments,
1980 such function types are rarely used as callback types.
1981 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001982AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
1983MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001984# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001985Mapping = _alias(collections.abc.Mapping, 2)
1986MutableMapping = _alias(collections.abc.MutableMapping, 2)
1987Sequence = _alias(collections.abc.Sequence, 1)
1988MutableSequence = _alias(collections.abc.MutableSequence, 1)
1989ByteString = _alias(collections.abc.ByteString, 0) # Not generic
1990# Tuple accepts variable number of parameters.
1991Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001992Tuple.__doc__ = \
1993 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001994
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001995 Example: Tuple[T1, T2] is a tuple of two elements corresponding
1996 to type variables T1 and T2. Tuple[int, float, str] is a tuple
1997 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001998
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001999 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
2000 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002001List = _alias(list, 1, inst=False, name='List')
2002Deque = _alias(collections.deque, 1, name='Deque')
2003Set = _alias(set, 1, inst=False, name='Set')
2004FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
2005MappingView = _alias(collections.abc.MappingView, 1)
2006KeysView = _alias(collections.abc.KeysView, 1)
2007ItemsView = _alias(collections.abc.ItemsView, 2)
2008ValuesView = _alias(collections.abc.ValuesView, 1)
2009ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
2010AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
2011Dict = _alias(dict, 2, inst=False, name='Dict')
2012DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
2013OrderedDict = _alias(collections.OrderedDict, 2)
2014Counter = _alias(collections.Counter, 1)
2015ChainMap = _alias(collections.ChainMap, 2)
2016Generator = _alias(collections.abc.Generator, 3)
2017AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
2018Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002019Type.__doc__ = \
2020 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002021
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002022 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07002023
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002024 class User: ... # Abstract base for User classes
2025 class BasicUser(User): ...
2026 class ProUser(User): ...
2027 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08002028
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002029 And a function that takes a class argument that's a subclass of
2030 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08002031
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002032 U = TypeVar('U', bound=User)
2033 def new_user(user_class: Type[U]) -> U:
2034 user = user_class()
2035 # (Here we could write the user object to a database)
2036 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08002037
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002038 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08002039
Ivan Levkivskyid911e402018-01-20 11:23:59 +00002040 At this point the type checker knows that joe has type BasicUser.
2041 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002042
2043
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002044@runtime_checkable
2045class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002046 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002047 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002048
2049 @abstractmethod
2050 def __int__(self) -> int:
2051 pass
2052
2053
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002054@runtime_checkable
2055class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002056 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002057 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002058
2059 @abstractmethod
2060 def __float__(self) -> float:
2061 pass
2062
2063
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002064@runtime_checkable
2065class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002066 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002067 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002068
2069 @abstractmethod
2070 def __complex__(self) -> complex:
2071 pass
2072
2073
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002074@runtime_checkable
2075class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002076 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002077 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002078
2079 @abstractmethod
2080 def __bytes__(self) -> bytes:
2081 pass
2082
2083
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002084@runtime_checkable
2085class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002086 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07002087 __slots__ = ()
2088
2089 @abstractmethod
2090 def __index__(self) -> int:
2091 pass
2092
2093
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002094@runtime_checkable
2095class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002096 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002097 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002098
2099 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002100 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002101 pass
2102
2103
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002104@runtime_checkable
2105class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002106 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002107 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002108
2109 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002110 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002111 pass
2112
2113
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002114def _make_nmtuple(name, types, module, defaults = ()):
2115 fields = [n for n, t in types]
2116 types = {n: _type_check(t, f"field {n} annotation must be a type")
2117 for n, t in types}
2118 nm_tpl = collections.namedtuple(name, fields,
2119 defaults=defaults, module=module)
2120 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002121 return nm_tpl
2122
2123
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002124# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002125_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
2126 '_fields', '_field_defaults',
2127 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002128
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002129_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002130
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002131
Guido van Rossum2f841442016-11-15 09:48:06 -08002132class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002133
Guido van Rossum2f841442016-11-15 09:48:06 -08002134 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002135 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08002136 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002137 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08002138 for field_name in types:
2139 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002140 default_names.append(field_name)
2141 elif default_names:
2142 raise TypeError(f"Non-default namedtuple field {field_name} "
2143 f"cannot follow default field"
2144 f"{'s' if len(default_names) > 1 else ''} "
2145 f"{', '.join(default_names)}")
2146 nm_tpl = _make_nmtuple(typename, types.items(),
2147 defaults=[ns[n] for n in default_names],
2148 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08002149 # update from user namespace without overriding special namedtuple attributes
2150 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002151 if key in _prohibited:
2152 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
2153 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08002154 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08002155 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002156
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002157
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002158def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08002159 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002160
Guido van Rossum2f841442016-11-15 09:48:06 -08002161 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002162
Guido van Rossum2f841442016-11-15 09:48:06 -08002163 class Employee(NamedTuple):
2164 name: str
2165 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002166
Guido van Rossum2f841442016-11-15 09:48:06 -08002167 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002168
Guido van Rossum2f841442016-11-15 09:48:06 -08002169 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002170
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07002171 The resulting class has an extra __annotations__ attribute, giving a
2172 dict that maps field names to types. (The field names are also in
2173 the _fields attribute, which is part of the namedtuple API.)
2174 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002175
Guido van Rossum2f841442016-11-15 09:48:06 -08002176 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002177
Guido van Rossum2f841442016-11-15 09:48:06 -08002178 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002179
Guido van Rossum2f841442016-11-15 09:48:06 -08002180 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
2181 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002182 if fields is None:
2183 fields = kwargs.items()
2184 elif kwargs:
2185 raise TypeError("Either list of fields or keywords"
2186 " can be provided to NamedTuple, not both")
2187 try:
2188 module = sys._getframe(1).f_globals.get('__name__', '__main__')
2189 except (AttributeError, ValueError):
2190 module = None
2191 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002192
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002193_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
2194
2195def _namedtuple_mro_entries(bases):
2196 if len(bases) > 1:
2197 raise TypeError("Multiple inheritance with NamedTuple is not supported")
2198 assert bases[0] is NamedTuple
2199 return (_NamedTuple,)
2200
2201NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002202
2203
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002204class _TypedDictMeta(type):
2205 def __new__(cls, name, bases, ns, total=True):
2206 """Create new typed dict class object.
2207
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002208 This method is called when TypedDict is subclassed,
2209 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002210 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002211 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002212 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002213 for base in bases:
2214 if type(base) is not _TypedDictMeta:
2215 raise TypeError('cannot inherit from both a TypedDict type '
2216 'and a non-TypedDict base class')
2217 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002218
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002219 annotations = {}
2220 own_annotations = ns.get('__annotations__', {})
2221 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002222 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002223 own_annotations = {
2224 n: _type_check(tp, msg) for n, tp in own_annotations.items()
2225 }
2226 required_keys = set()
2227 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002228
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002229 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002230 annotations.update(base.__dict__.get('__annotations__', {}))
2231 required_keys.update(base.__dict__.get('__required_keys__', ()))
2232 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002233
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002234 annotations.update(own_annotations)
2235 if total:
2236 required_keys.update(own_annotation_keys)
2237 else:
2238 optional_keys.update(own_annotation_keys)
2239
2240 tp_dict.__annotations__ = annotations
2241 tp_dict.__required_keys__ = frozenset(required_keys)
2242 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002243 if not hasattr(tp_dict, '__total__'):
2244 tp_dict.__total__ = total
2245 return tp_dict
2246
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002247 __call__ = dict # static method
2248
2249 def __subclasscheck__(cls, other):
2250 # Typed dicts are only for static structural subtyping.
2251 raise TypeError('TypedDict does not support instance and class checks')
2252
2253 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002254
2255
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002256def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002257 """A simple typed namespace. At runtime it is equivalent to a plain dict.
2258
2259 TypedDict creates a dictionary type that expects all of its
2260 instances to have a certain set of keys, where each key is
2261 associated with a value of a consistent type. This expectation
2262 is not checked at runtime but is only enforced by type checkers.
2263 Usage::
2264
2265 class Point2D(TypedDict):
2266 x: int
2267 y: int
2268 label: str
2269
2270 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
2271 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
2272
2273 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
2274
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002275 The type info can be accessed via the Point2D.__annotations__ dict, and
2276 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
2277 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002278
2279 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
2280 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
2281
ananthan-123ab6423f2020-02-19 10:03:05 +05302282 By default, all keys must be present in a TypedDict. It is possible
2283 to override this by specifying totality.
2284 Usage::
2285
2286 class point2D(TypedDict, total=False):
2287 x: int
2288 y: int
2289
2290 This means that a point2D TypedDict can have any of the keys omitted.A type
2291 checker is only expected to support a literal False or True as the value of
2292 the total argument. True is the default, and makes all items defined in the
2293 class body be required.
2294
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002295 The class syntax is only supported in Python 3.6+, while two other
2296 syntax forms work for Python 2.7 and 3.2+
2297 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002298 if fields is None:
2299 fields = kwargs
2300 elif kwargs:
2301 raise TypeError("TypedDict takes either a dict or keyword arguments,"
2302 " but not both")
2303
Alex Grönholm67b769f2020-12-10 23:49:05 +02002304 ns = {'__annotations__': dict(fields)}
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002305 try:
2306 # Setting correct module is necessary to make typed dict classes pickleable.
2307 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
2308 except (AttributeError, ValueError):
2309 pass
2310
Alex Grönholm67b769f2020-12-10 23:49:05 +02002311 return _TypedDictMeta(typename, (), ns, total=total)
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002312
2313_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
2314TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002315
2316
Guido van Rossum91185fe2016-06-08 11:19:11 -07002317def NewType(name, tp):
2318 """NewType creates simple unique types with almost zero
2319 runtime overhead. NewType(name, tp) is considered a subtype of tp
2320 by static type checkers. At runtime, NewType(name, tp) returns
2321 a dummy function that simply returns its argument. Usage::
2322
2323 UserId = NewType('UserId', int)
2324
2325 def name_by_id(user_id: UserId) -> str:
2326 ...
2327
2328 UserId('user') # Fails type check
2329
2330 name_by_id(42) # Fails type check
2331 name_by_id(UserId(42)) # OK
2332
2333 num = UserId(5) + 1 # type: int
2334 """
2335
2336 def new_type(x):
2337 return x
2338
2339 new_type.__name__ = name
2340 new_type.__supertype__ = tp
2341 return new_type
2342
2343
Guido van Rossum0e0563c2016-04-05 14:54:25 -07002344# Python-version-specific alias (Python 2: unicode; Python 3: str)
2345Text = str
2346
2347
Guido van Rossum91185fe2016-06-08 11:19:11 -07002348# Constant that's True when type checking, but False here.
2349TYPE_CHECKING = False
2350
2351
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002352class IO(Generic[AnyStr]):
2353 """Generic base class for TextIO and BinaryIO.
2354
2355 This is an abstract, generic version of the return of open().
2356
2357 NOTE: This does not distinguish between the different possible
2358 classes (text vs. binary, read vs. write vs. read/write,
2359 append-only, unbuffered). The TextIO and BinaryIO subclasses
2360 below capture the distinctions between text vs. binary, which is
2361 pervasive in the interface; however we currently do not offer a
2362 way to track the other distinctions in the type system.
2363 """
2364
Guido van Rossumd70fe632015-08-05 12:11:06 +02002365 __slots__ = ()
2366
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002367 @property
2368 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002369 def mode(self) -> str:
2370 pass
2371
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002372 @property
2373 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002374 def name(self) -> str:
2375 pass
2376
2377 @abstractmethod
2378 def close(self) -> None:
2379 pass
2380
Shantanu2e6569b2020-01-29 18:52:36 -08002381 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002382 @abstractmethod
2383 def closed(self) -> bool:
2384 pass
2385
2386 @abstractmethod
2387 def fileno(self) -> int:
2388 pass
2389
2390 @abstractmethod
2391 def flush(self) -> None:
2392 pass
2393
2394 @abstractmethod
2395 def isatty(self) -> bool:
2396 pass
2397
2398 @abstractmethod
2399 def read(self, n: int = -1) -> AnyStr:
2400 pass
2401
2402 @abstractmethod
2403 def readable(self) -> bool:
2404 pass
2405
2406 @abstractmethod
2407 def readline(self, limit: int = -1) -> AnyStr:
2408 pass
2409
2410 @abstractmethod
2411 def readlines(self, hint: int = -1) -> List[AnyStr]:
2412 pass
2413
2414 @abstractmethod
2415 def seek(self, offset: int, whence: int = 0) -> int:
2416 pass
2417
2418 @abstractmethod
2419 def seekable(self) -> bool:
2420 pass
2421
2422 @abstractmethod
2423 def tell(self) -> int:
2424 pass
2425
2426 @abstractmethod
2427 def truncate(self, size: int = None) -> int:
2428 pass
2429
2430 @abstractmethod
2431 def writable(self) -> bool:
2432 pass
2433
2434 @abstractmethod
2435 def write(self, s: AnyStr) -> int:
2436 pass
2437
2438 @abstractmethod
2439 def writelines(self, lines: List[AnyStr]) -> None:
2440 pass
2441
2442 @abstractmethod
2443 def __enter__(self) -> 'IO[AnyStr]':
2444 pass
2445
2446 @abstractmethod
2447 def __exit__(self, type, value, traceback) -> None:
2448 pass
2449
2450
2451class BinaryIO(IO[bytes]):
2452 """Typed version of the return of open() in binary mode."""
2453
Guido van Rossumd70fe632015-08-05 12:11:06 +02002454 __slots__ = ()
2455
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002456 @abstractmethod
2457 def write(self, s: Union[bytes, bytearray]) -> int:
2458 pass
2459
2460 @abstractmethod
2461 def __enter__(self) -> 'BinaryIO':
2462 pass
2463
2464
2465class TextIO(IO[str]):
2466 """Typed version of the return of open() in text mode."""
2467
Guido van Rossumd70fe632015-08-05 12:11:06 +02002468 __slots__ = ()
2469
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002470 @property
2471 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002472 def buffer(self) -> BinaryIO:
2473 pass
2474
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002475 @property
2476 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002477 def encoding(self) -> str:
2478 pass
2479
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002480 @property
2481 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002482 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002483 pass
2484
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002485 @property
2486 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002487 def line_buffering(self) -> bool:
2488 pass
2489
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002490 @property
2491 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002492 def newlines(self) -> Any:
2493 pass
2494
2495 @abstractmethod
2496 def __enter__(self) -> 'TextIO':
2497 pass
2498
2499
2500class io:
2501 """Wrapper namespace for IO generic classes."""
2502
2503 __all__ = ['IO', 'TextIO', 'BinaryIO']
2504 IO = IO
2505 TextIO = TextIO
2506 BinaryIO = BinaryIO
2507
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002508
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002509io.__name__ = __name__ + '.io'
2510sys.modules[io.__name__] = io
2511
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002512Pattern = _alias(stdlib_re.Pattern, 1)
2513Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002514
2515class re:
2516 """Wrapper namespace for re type aliases."""
2517
2518 __all__ = ['Pattern', 'Match']
2519 Pattern = Pattern
2520 Match = Match
2521
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002522
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002523re.__name__ = __name__ + '.re'
2524sys.modules[re.__name__] = re