blob: ea66cf50a078f1c7fc4ce2a1bec29db306a64378 [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',
102
103 # One-off things.
104 'AnyStr',
105 'cast',
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100106 'final',
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +0100107 'get_args',
108 'get_origin',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700109 'get_type_hints',
Patrick Reader0705ec82020-09-16 05:58:32 +0100110 'is_typeddict',
Guido van Rossum91185fe2016-06-08 11:19:11 -0700111 'NewType',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700112 'no_type_check',
113 'no_type_check_decorator',
aetracht45738202018-03-19 14:41:32 -0400114 'NoReturn',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700115 'overload',
Jelle Zijlstra52243362021-04-10 19:57:05 -0700116 'ParamSpecArgs',
117 'ParamSpecKwargs',
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100118 'runtime_checkable',
Guido van Rossum0e0563c2016-04-05 14:54:25 -0700119 'Text',
Guido van Rossum91185fe2016-06-08 11:19:11 -0700120 'TYPE_CHECKING',
Mikhail Golubev4f3c2502020-10-08 00:44:31 +0300121 'TypeAlias',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700122]
123
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700124# The pseudo-submodules 're' and 'io' are part of the public
125# namespace, but excluded from __all__ because they might stomp on
126# legitimate imports of those modules.
127
kj463c7d32020-12-14 02:38:24 +0800128
129def _type_convert(arg):
130 """For converting None to type(None), and strings to ForwardRef."""
131 if arg is None:
132 return type(None)
133 if isinstance(arg, str):
134 return ForwardRef(arg)
135 return arg
136
137
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700138def _type_check(arg, msg, is_argument=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000139 """Check that the argument is a type, and return it (internal helper).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700140
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000141 As a special case, accept None and return type(None) instead. Also wrap strings
142 into ForwardRef instances. Consider several corner cases, for example plain
143 special forms like Union are not valid, while Union[int, str] is OK, etc.
144 The msg argument is a human-readable error message, e.g::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700145
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000146 "Union[arg, ...]: arg should be a type."
Guido van Rossum4cefe742016-09-27 15:20:12 -0700147
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000148 We append the repr() of the actual value (truncated to 100 chars).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700149 """
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100150 invalid_generic_forms = (Generic, Protocol)
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700151 if is_argument:
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100152 invalid_generic_forms = invalid_generic_forms + (ClassVar, Final)
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400153
kj463c7d32020-12-14 02:38:24 +0800154 arg = _type_convert(arg)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000155 if (isinstance(arg, _GenericAlias) and
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400156 arg.__origin__ in invalid_generic_forms):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000157 raise TypeError(f"{arg} is not valid as type argument")
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300158 if arg in (Any, NoReturn):
159 return arg
160 if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000161 raise TypeError(f"Plain {arg} is not valid as type argument")
kj73607be2020-12-24 12:33:48 +0800162 if isinstance(arg, (type, TypeVar, ForwardRef, types.Union, ParamSpec)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000163 return arg
164 if not callable(arg):
165 raise TypeError(f"{msg} Got {arg!r:.100}.")
166 return arg
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700167
168
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000169def _type_repr(obj):
170 """Return the repr() of an object, special-casing types (internal helper).
171
172 If obj is a type, we return a shorter version than the default
173 type.__repr__, based on the module and qualified name, which is
174 typically enough to uniquely identify a type. For everything
175 else, we fall back on repr(obj).
176 """
kj1f7dfb22020-11-02 02:13:38 +0800177 if isinstance(obj, types.GenericAlias):
178 return repr(obj)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000179 if isinstance(obj, type):
180 if obj.__module__ == 'builtins':
181 return obj.__qualname__
182 return f'{obj.__module__}.{obj.__qualname__}'
183 if obj is ...:
184 return('...')
185 if isinstance(obj, types.FunctionType):
186 return obj.__name__
187 return repr(obj)
188
189
190def _collect_type_vars(types):
kj73607be2020-12-24 12:33:48 +0800191 """Collect all type variable-like variables contained
192 in types in order of first appearance (lexicographic order). For example::
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000193
194 _collect_type_vars((T, List[S, T])) == (T, S)
195 """
196 tvars = []
197 for t in types:
kj73607be2020-12-24 12:33:48 +0800198 if isinstance(t, _TypeVarLike) and t not in tvars:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000199 tvars.append(t)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300200 if isinstance(t, (_GenericAlias, GenericAlias)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000201 tvars.extend([t for t in t.__parameters__ if t not in tvars])
202 return tuple(tvars)
203
204
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300205def _check_generic(cls, parameters, elen):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000206 """Check correct count for parameters of a generic cls (internal helper).
207 This gives a nice error message in case of count mismatch.
208 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300209 if not elen:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000210 raise TypeError(f"{cls} is not a generic class")
211 alen = len(parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000212 if alen != elen:
213 raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};"
214 f" actual {alen}, expected {elen}")
215
kj73607be2020-12-24 12:33:48 +0800216def _prepare_paramspec_params(cls, params):
217 """Prepares the parameters for a Generic containing ParamSpec
218 variables (internal helper).
219 """
220 # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612.
221 if len(cls.__parameters__) == 1 and len(params) > 1:
222 return (params,)
223 else:
224 _params = []
225 # Convert lists to tuples to help other libraries cache the results.
226 for p, tvar in zip(params, cls.__parameters__):
227 if isinstance(tvar, ParamSpec) and isinstance(p, list):
228 p = tuple(p)
229 _params.append(p)
230 return tuple(_params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000231
Yurii Karabasf03d3182020-11-17 04:23:19 +0200232def _deduplicate(params):
233 # Weed out strict duplicates, preserving the first of each occurrence.
234 all_params = set(params)
235 if len(all_params) < len(params):
236 new_params = []
237 for t in params:
238 if t in all_params:
239 new_params.append(t)
240 all_params.remove(t)
241 params = new_params
242 assert not all_params, all_params
243 return params
244
245
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000246def _remove_dups_flatten(parameters):
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700247 """An internal helper for Union creation and substitution: flatten Unions
248 among parameters, then remove duplicates.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000249 """
250 # Flatten out Union[Union[...], ...].
251 params = []
252 for p in parameters:
Maggie Moss1b4552c2020-09-09 13:23:24 -0700253 if isinstance(p, (_UnionGenericAlias, types.Union)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000254 params.extend(p.__args__)
255 elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
256 params.extend(p[1:])
257 else:
258 params.append(p)
Yurii Karabasf03d3182020-11-17 04:23:19 +0200259
260 return tuple(_deduplicate(params))
261
262
263def _flatten_literal_params(parameters):
264 """An internal helper for Literal creation: flatten Literals among parameters"""
265 params = []
266 for p in parameters:
267 if isinstance(p, _LiteralGenericAlias):
268 params.extend(p.__args__)
269 else:
270 params.append(p)
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700271 return tuple(params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000272
273
274_cleanups = []
275
276
Yurii Karabasf03d3182020-11-17 04:23:19 +0200277def _tp_cache(func=None, /, *, typed=False):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000278 """Internal wrapper caching __getitem__ of generic types with a fallback to
279 original function for non-hashable arguments.
280 """
Yurii Karabasf03d3182020-11-17 04:23:19 +0200281 def decorator(func):
282 cached = functools.lru_cache(typed=typed)(func)
283 _cleanups.append(cached.cache_clear)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000284
Yurii Karabasf03d3182020-11-17 04:23:19 +0200285 @functools.wraps(func)
286 def inner(*args, **kwds):
287 try:
288 return cached(*args, **kwds)
289 except TypeError:
290 pass # All real errors (not unhashable args) are raised below.
291 return func(*args, **kwds)
292 return inner
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000293
Yurii Karabasf03d3182020-11-17 04:23:19 +0200294 if func is not None:
295 return decorator(func)
296
297 return decorator
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000298
wyfo653f4202020-07-22 21:47:28 +0200299def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
Graham Bleaney84ef33c2020-09-08 18:41:10 -0400300 """Evaluate all forward references in the given type t.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000301 For use of globalns and localns see the docstring for get_type_hints().
wyfo653f4202020-07-22 21:47:28 +0200302 recursive_guard is used to prevent prevent infinite recursion
303 with recursive ForwardRef.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000304 """
305 if isinstance(t, ForwardRef):
wyfo653f4202020-07-22 21:47:28 +0200306 return t._evaluate(globalns, localns, recursive_guard)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300307 if isinstance(t, (_GenericAlias, GenericAlias)):
wyfo653f4202020-07-22 21:47:28 +0200308 ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000309 if ev_args == t.__args__:
310 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300311 if isinstance(t, GenericAlias):
312 return GenericAlias(t.__origin__, ev_args)
313 else:
314 return t.copy_with(ev_args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000315 return t
316
317
318class _Final:
319 """Mixin to prohibit subclassing"""
Guido van Rossum4cefe742016-09-27 15:20:12 -0700320
Guido van Rossum83ec3022017-01-17 20:43:28 -0800321 __slots__ = ('__weakref__',)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700322
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300323 def __init_subclass__(self, /, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000324 if '_root' not in kwds:
325 raise TypeError("Cannot subclass special typing classes")
326
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100327class _Immutable:
328 """Mixin to indicate that object should not be copied."""
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300329 __slots__ = ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000330
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100331 def __copy__(self):
332 return self
333
334 def __deepcopy__(self, memo):
335 return self
336
337
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300338# Internal indicator of special typing constructs.
339# See __doc__ instance attribute for specific docs.
340class _SpecialForm(_Final, _root=True):
341 __slots__ = ('_name', '__doc__', '_getitem')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000342
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300343 def __init__(self, getitem):
344 self._getitem = getitem
345 self._name = getitem.__name__
346 self.__doc__ = getitem.__doc__
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000347
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300348 def __mro_entries__(self, bases):
349 raise TypeError(f"Cannot subclass {self!r}")
Guido van Rossum4cefe742016-09-27 15:20:12 -0700350
351 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000352 return 'typing.' + self._name
353
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100354 def __reduce__(self):
355 return self._name
Guido van Rossum4cefe742016-09-27 15:20:12 -0700356
357 def __call__(self, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000358 raise TypeError(f"Cannot instantiate {self!r}")
359
360 def __instancecheck__(self, obj):
361 raise TypeError(f"{self} cannot be used with isinstance()")
362
363 def __subclasscheck__(self, cls):
364 raise TypeError(f"{self} cannot be used with issubclass()")
365
366 @_tp_cache
367 def __getitem__(self, parameters):
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300368 return self._getitem(self, parameters)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700369
Yurii Karabasf03d3182020-11-17 04:23:19 +0200370
371class _LiteralSpecialForm(_SpecialForm, _root=True):
372 @_tp_cache(typed=True)
373 def __getitem__(self, parameters):
374 return self._getitem(self, parameters)
375
376
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300377@_SpecialForm
378def Any(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000379 """Special type indicating an unconstrained type.
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700380
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000381 - Any is compatible with every type.
382 - Any assumed to have all methods.
383 - All values assumed to be instances of Any.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700384
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000385 Note that all the above statements are true from the point of view of
386 static type checkers. At runtime, Any should not be used with instance
387 or class checks.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300388 """
389 raise TypeError(f"{self} is not subscriptable")
Guido van Rossumd70fe632015-08-05 12:11:06 +0200390
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300391@_SpecialForm
392def NoReturn(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000393 """Special type indicating functions that never return.
394 Example::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700395
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000396 from typing import NoReturn
397
398 def stop() -> NoReturn:
399 raise Exception('no way')
400
401 This type is invalid in other positions, e.g., ``List[NoReturn]``
402 will fail in static type checkers.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300403 """
404 raise TypeError(f"{self} is not subscriptable")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000405
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300406@_SpecialForm
407def ClassVar(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000408 """Special type construct to mark class variables.
409
410 An annotation wrapped in ClassVar indicates that a given
411 attribute is intended to be used as a class variable and
412 should not be set on instances of that class. Usage::
413
414 class Starship:
415 stats: ClassVar[Dict[str, int]] = {} # class variable
416 damage: int = 10 # instance variable
417
418 ClassVar accepts only types and cannot be further subscribed.
419
420 Note that ClassVar is not a class itself, and should not
421 be used with isinstance() or issubclass().
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300422 """
423 item = _type_check(parameters, f'{self} accepts only single type.')
424 return _GenericAlias(self, (item,))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000425
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300426@_SpecialForm
427def Final(self, parameters):
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100428 """Special typing construct to indicate final names to type checkers.
429
430 A final name cannot be re-assigned or overridden in a subclass.
431 For example:
432
433 MAX_SIZE: Final = 9000
434 MAX_SIZE += 1 # Error reported by type checker
435
436 class Connection:
437 TIMEOUT: Final[int] = 10
438
439 class FastConnector(Connection):
440 TIMEOUT = 1 # Error reported by type checker
441
442 There is no runtime checking of these properties.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300443 """
444 item = _type_check(parameters, f'{self} accepts only single type.')
445 return _GenericAlias(self, (item,))
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100446
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300447@_SpecialForm
448def Union(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000449 """Union type; Union[X, Y] means either X or Y.
450
451 To define a union, use e.g. Union[int, str]. Details:
452 - The arguments must be types and there must be at least one.
453 - None as an argument is a special case and is replaced by
454 type(None).
455 - Unions of unions are flattened, e.g.::
456
457 Union[Union[int, str], float] == Union[int, str, float]
458
459 - Unions of a single argument vanish, e.g.::
460
461 Union[int] == int # The constructor actually returns int
462
463 - Redundant arguments are skipped, e.g.::
464
465 Union[int, str, int] == Union[int, str]
466
467 - When comparing unions, the argument order is ignored, e.g.::
468
469 Union[int, str] == Union[str, int]
470
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000471 - You cannot subclass or instantiate a union.
472 - You can use Optional[X] as a shorthand for Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300473 """
474 if parameters == ():
475 raise TypeError("Cannot take a Union of no types.")
476 if not isinstance(parameters, tuple):
477 parameters = (parameters,)
478 msg = "Union[arg, ...]: each arg must be a type."
479 parameters = tuple(_type_check(p, msg) for p in parameters)
480 parameters = _remove_dups_flatten(parameters)
481 if len(parameters) == 1:
482 return parameters[0]
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300483 return _UnionGenericAlias(self, parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000484
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300485@_SpecialForm
486def Optional(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000487 """Optional type.
488
489 Optional[X] is equivalent to Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300490 """
491 arg = _type_check(parameters, f"{self} requires a single type.")
492 return Union[arg, type(None)]
Guido van Rossumb7dedc82016-10-29 12:44:29 -0700493
Yurii Karabasf03d3182020-11-17 04:23:19 +0200494@_LiteralSpecialForm
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300495def Literal(self, parameters):
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100496 """Special typing form to define literal types (a.k.a. value types).
497
498 This form can be used to indicate to type checkers that the corresponding
499 variable or function parameter has a value equivalent to the provided
500 literal (or one of several literals):
501
502 def validate_simple(data: Any) -> Literal[True]: # always returns True
503 ...
504
505 MODE = Literal['r', 'rb', 'w', 'wb']
506 def open_helper(file: str, mode: MODE) -> str:
507 ...
508
509 open_helper('/some/path', 'r') # Passes type check
510 open_helper('/other/path', 'typo') # Error in type checker
511
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300512 Literal[...] cannot be subclassed. At runtime, an arbitrary value
513 is allowed as type argument to Literal[...], but type checkers may
514 impose restrictions.
515 """
516 # There is no '_type_check' call because arguments to Literal[...] are
517 # values, not types.
Yurii Karabasf03d3182020-11-17 04:23:19 +0200518 if not isinstance(parameters, tuple):
519 parameters = (parameters,)
520
521 parameters = _flatten_literal_params(parameters)
522
523 try:
524 parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
525 except TypeError: # unhashable parameters
526 pass
527
528 return _LiteralGenericAlias(self, parameters)
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100529
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700530
Mikhail Golubev4f3c2502020-10-08 00:44:31 +0300531@_SpecialForm
532def TypeAlias(self, parameters):
533 """Special marker indicating that an assignment should
534 be recognized as a proper type alias definition by type
535 checkers.
536
537 For example::
538
539 Predicate: TypeAlias = Callable[..., bool]
540
541 It's invalid when used anywhere except as in the example above.
542 """
543 raise TypeError(f"{self} is not subscriptable")
544
545
kj73607be2020-12-24 12:33:48 +0800546@_SpecialForm
547def Concatenate(self, parameters):
Ken Jin11276cd2021-01-02 08:45:50 +0800548 """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a
549 higher order function which adds, removes or transforms parameters of a
550 callable.
kj73607be2020-12-24 12:33:48 +0800551
552 For example::
553
554 Callable[Concatenate[int, P], int]
555
556 See PEP 612 for detailed information.
557 """
558 if parameters == ():
559 raise TypeError("Cannot take a Concatenate of no types.")
560 if not isinstance(parameters, tuple):
561 parameters = (parameters,)
562 if not isinstance(parameters[-1], ParamSpec):
563 raise TypeError("The last parameter to Concatenate should be a "
564 "ParamSpec variable.")
565 msg = "Concatenate[arg, ...]: each arg must be a type."
566 parameters = tuple(_type_check(p, msg) for p in parameters)
567 return _ConcatenateGenericAlias(self, parameters)
568
569
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000570class ForwardRef(_Final, _root=True):
Guido van Rossumb24569a2016-11-20 18:01:29 -0800571 """Internal wrapper to hold a forward reference."""
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700572
Guido van Rossum4cefe742016-09-27 15:20:12 -0700573 __slots__ = ('__forward_arg__', '__forward_code__',
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400574 '__forward_evaluated__', '__forward_value__',
575 '__forward_is_argument__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700576
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700577 def __init__(self, arg, is_argument=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700578 if not isinstance(arg, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000579 raise TypeError(f"Forward reference must be a string -- got {arg!r}")
Batuhan Taskaya044a1042020-10-06 23:03:02 +0300580
581 # Double-stringified forward references is a result of activating
582 # the 'annotations' future by default. This way, we eliminate them in
583 # the runtime.
584 if arg.startswith(("'", '\"')) and arg.endswith(("'", '"')):
585 arg = arg[1:-1]
586
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700587 try:
588 code = compile(arg, '<string>', 'eval')
589 except SyntaxError:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000590 raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700591 self.__forward_arg__ = arg
592 self.__forward_code__ = code
593 self.__forward_evaluated__ = False
594 self.__forward_value__ = None
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400595 self.__forward_is_argument__ = is_argument
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700596
wyfo653f4202020-07-22 21:47:28 +0200597 def _evaluate(self, globalns, localns, recursive_guard):
598 if self.__forward_arg__ in recursive_guard:
599 return self
Guido van Rossumdad17902016-11-10 08:29:18 -0800600 if not self.__forward_evaluated__ or localns is not globalns:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700601 if globalns is None and localns is None:
602 globalns = localns = {}
603 elif globalns is None:
604 globalns = localns
605 elif localns is None:
606 localns = globalns
wyfo653f4202020-07-22 21:47:28 +0200607 type_ =_type_check(
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700608 eval(self.__forward_code__, globalns, localns),
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400609 "Forward references must evaluate to types.",
wyfo653f4202020-07-22 21:47:28 +0200610 is_argument=self.__forward_is_argument__,
611 )
612 self.__forward_value__ = _eval_type(
613 type_, globalns, localns, recursive_guard | {self.__forward_arg__}
614 )
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700615 self.__forward_evaluated__ = True
616 return self.__forward_value__
617
Guido van Rossum4cefe742016-09-27 15:20:12 -0700618 def __eq__(self, other):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000619 if not isinstance(other, ForwardRef):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700620 return NotImplemented
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100621 if self.__forward_evaluated__ and other.__forward_evaluated__:
622 return (self.__forward_arg__ == other.__forward_arg__ and
623 self.__forward_value__ == other.__forward_value__)
624 return self.__forward_arg__ == other.__forward_arg__
Guido van Rossum4cefe742016-09-27 15:20:12 -0700625
626 def __hash__(self):
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100627 return hash(self.__forward_arg__)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700628
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700629 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000630 return f'ForwardRef({self.__forward_arg__!r})'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700631
kj73607be2020-12-24 12:33:48 +0800632class _TypeVarLike:
633 """Mixin for TypeVar-like types (TypeVar and ParamSpec)."""
634 def __init__(self, bound, covariant, contravariant):
635 """Used to setup TypeVars and ParamSpec's bound, covariant and
636 contravariant attributes.
637 """
638 if covariant and contravariant:
639 raise ValueError("Bivariant types are not supported.")
640 self.__covariant__ = bool(covariant)
641 self.__contravariant__ = bool(contravariant)
642 if bound:
643 self.__bound__ = _type_check(bound, "Bound must be a type.")
644 else:
645 self.__bound__ = None
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700646
kj73607be2020-12-24 12:33:48 +0800647 def __or__(self, right):
648 return Union[self, right]
649
Jelle Zijlstra90459192021-04-10 20:00:05 -0700650 def __ror__(self, left):
651 return Union[left, self]
kj73607be2020-12-24 12:33:48 +0800652
653 def __repr__(self):
654 if self.__covariant__:
655 prefix = '+'
656 elif self.__contravariant__:
657 prefix = '-'
658 else:
659 prefix = '~'
660 return prefix + self.__name__
661
662 def __reduce__(self):
663 return self.__name__
664
665
666class TypeVar( _Final, _Immutable, _TypeVarLike, _root=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700667 """Type variable.
668
669 Usage::
670
671 T = TypeVar('T') # Can be anything
672 A = TypeVar('A', str, bytes) # Must be str or bytes
673
674 Type variables exist primarily for the benefit of static type
675 checkers. They serve as the parameters for generic types as well
676 as for generic function definitions. See class Generic for more
677 information on generic types. Generic functions work as follows:
678
Guido van Rossumb24569a2016-11-20 18:01:29 -0800679 def repeat(x: T, n: int) -> List[T]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700680 '''Return a list containing n references to x.'''
681 return [x]*n
682
683 def longest(x: A, y: A) -> A:
684 '''Return the longest of two strings.'''
685 return x if len(x) >= len(y) else y
686
687 The latter example's signature is essentially the overloading
688 of (str, str) -> str and (bytes, bytes) -> bytes. Also note
689 that if the arguments are instances of some subclass of str,
690 the return type is still plain str.
691
Guido van Rossumb24569a2016-11-20 18:01:29 -0800692 At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700693
Guido van Rossumefa798d2016-08-23 11:01:50 -0700694 Type variables defined with covariant=True or contravariant=True
João D. Ferreira86bfed32018-07-07 16:41:20 +0100695 can be used to declare covariant or contravariant generic types.
Guido van Rossumefa798d2016-08-23 11:01:50 -0700696 See PEP 484 for more details. By default generic types are invariant
697 in all type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700698
699 Type variables can be introspected. e.g.:
700
701 T.__name__ == 'T'
702 T.__constraints__ == ()
703 T.__covariant__ == False
704 T.__contravariant__ = False
705 A.__constraints__ == (str, bytes)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100706
707 Note that only type variables defined in global scope can be pickled.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700708 """
709
Guido van Rossum4cefe742016-09-27 15:20:12 -0700710 __slots__ = ('__name__', '__bound__', '__constraints__',
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300711 '__covariant__', '__contravariant__', '__dict__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700712
713 def __init__(self, name, *constraints, bound=None,
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800714 covariant=False, contravariant=False):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700715 self.__name__ = name
kj73607be2020-12-24 12:33:48 +0800716 super().__init__(bound, covariant, contravariant)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700717 if constraints and bound is not None:
718 raise TypeError("Constraints cannot be combined with bound=...")
719 if constraints and len(constraints) == 1:
720 raise TypeError("A single constraint is not allowed")
721 msg = "TypeVar(name, constraint, ...): constraints must be types."
722 self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
HongWeipenga25a04f2020-04-21 04:01:53 +0800723 try:
724 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling
725 except (AttributeError, ValueError):
726 def_mod = None
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300727 if def_mod != 'typing':
728 self.__module__ = def_mod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700729
Maggie Moss1b4552c2020-09-09 13:23:24 -0700730
Jelle Zijlstra52243362021-04-10 19:57:05 -0700731class ParamSpecArgs(_Final, _Immutable, _root=True):
732 """The args for a ParamSpec object.
733
734 Given a ParamSpec object P, P.args is an instance of ParamSpecArgs.
735
736 ParamSpecArgs objects have a reference back to their ParamSpec:
737
738 P.args.__origin__ is P
739
740 This type is meant for runtime introspection and has no special meaning to
741 static type checkers.
742 """
743 def __init__(self, origin):
744 self.__origin__ = origin
745
746 def __repr__(self):
747 return f"{self.__origin__.__name__}.args"
748
749
750class ParamSpecKwargs(_Final, _Immutable, _root=True):
751 """The kwargs for a ParamSpec object.
752
753 Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs.
754
755 ParamSpecKwargs objects have a reference back to their ParamSpec:
756
757 P.kwargs.__origin__ is P
758
759 This type is meant for runtime introspection and has no special meaning to
760 static type checkers.
761 """
762 def __init__(self, origin):
763 self.__origin__ = origin
764
765 def __repr__(self):
766 return f"{self.__origin__.__name__}.kwargs"
767
768
kj73607be2020-12-24 12:33:48 +0800769class ParamSpec(_Final, _Immutable, _TypeVarLike, _root=True):
770 """Parameter specification variable.
Maggie Moss1b4552c2020-09-09 13:23:24 -0700771
kj73607be2020-12-24 12:33:48 +0800772 Usage::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700773
kj73607be2020-12-24 12:33:48 +0800774 P = ParamSpec('P')
775
776 Parameter specification variables exist primarily for the benefit of static
777 type checkers. They are used to forward the parameter types of one
Ken Jin11276cd2021-01-02 08:45:50 +0800778 callable to another callable, a pattern commonly found in higher order
779 functions and decorators. They are only valid when used in ``Concatenate``,
780 or s the first argument to ``Callable``, or as parameters for user-defined
781 Generics. See class Generic for more information on generic types. An
782 example for annotating a decorator::
kj73607be2020-12-24 12:33:48 +0800783
784 T = TypeVar('T')
785 P = ParamSpec('P')
786
787 def add_logging(f: Callable[P, T]) -> Callable[P, T]:
788 '''A type-safe decorator to add logging to a function.'''
789 def inner(*args: P.args, **kwargs: P.kwargs) -> T:
790 logging.info(f'{f.__name__} was called')
791 return f(*args, **kwargs)
792 return inner
793
794 @add_logging
795 def add_two(x: float, y: float) -> float:
796 '''Add two numbers together.'''
797 return x + y
798
799 Parameter specification variables defined with covariant=True or
800 contravariant=True can be used to declare covariant or contravariant
801 generic types. These keyword arguments are valid, but their actual semantics
802 are yet to be decided. See PEP 612 for details.
803
804 Parameter specification variables can be introspected. e.g.:
805
806 P.__name__ == 'T'
807 P.__bound__ == None
808 P.__covariant__ == False
809 P.__contravariant__ == False
810
811 Note that only parameter specification variables defined in global scope can
812 be pickled.
813 """
814
815 __slots__ = ('__name__', '__bound__', '__covariant__', '__contravariant__',
816 '__dict__')
817
Jelle Zijlstra52243362021-04-10 19:57:05 -0700818 @property
819 def args(self):
820 return ParamSpecArgs(self)
821
822 @property
823 def kwargs(self):
824 return ParamSpecKwargs(self)
kj73607be2020-12-24 12:33:48 +0800825
Ken Jinace008c2021-01-11 08:11:41 +0800826 def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
kj73607be2020-12-24 12:33:48 +0800827 self.__name__ = name
828 super().__init__(bound, covariant, contravariant)
829 try:
830 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
831 except (AttributeError, ValueError):
832 def_mod = None
833 if def_mod != 'typing':
834 self.__module__ = def_mod
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100835
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700836
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000837def _is_dunder(attr):
838 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800839
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300840class _BaseGenericAlias(_Final, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000841 """The central part of internal API.
842
843 This represents a generic version of type 'origin' with type arguments 'params'.
844 There are two kind of these aliases: user defined and special. The special ones
845 are wrappers around builtin collections and ABCs in collections.abc. These must
846 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
847 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700848 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300849 def __init__(self, origin, *, inst=True, name=None):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000850 self._inst = inst
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000851 self._name = name
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700852 self.__origin__ = origin
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000853 self.__slots__ = None # This is not documented.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300854
855 def __call__(self, *args, **kwargs):
856 if not self._inst:
857 raise TypeError(f"Type {self._name} cannot be instantiated; "
858 f"use {self.__origin__.__name__}() instead")
859 result = self.__origin__(*args, **kwargs)
860 try:
861 result.__orig_class__ = self
862 except AttributeError:
863 pass
864 return result
865
866 def __mro_entries__(self, bases):
867 res = []
868 if self.__origin__ not in bases:
869 res.append(self.__origin__)
870 i = bases.index(self)
871 for b in bases[i+1:]:
872 if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
873 break
874 else:
875 res.append(Generic)
876 return tuple(res)
877
878 def __getattr__(self, attr):
879 # We are careful for copy and pickle.
880 # Also for simplicity we just don't relay all dunder names
881 if '__origin__' in self.__dict__ and not _is_dunder(attr):
882 return getattr(self.__origin__, attr)
883 raise AttributeError(attr)
884
885 def __setattr__(self, attr, val):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300886 if _is_dunder(attr) or attr in ('_name', '_inst', '_nparams'):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300887 super().__setattr__(attr, val)
888 else:
889 setattr(self.__origin__, attr, val)
890
891 def __instancecheck__(self, obj):
892 return self.__subclasscheck__(type(obj))
893
894 def __subclasscheck__(self, cls):
895 raise TypeError("Subscripted generics cannot be used with"
896 " class and instance checks")
897
898
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300899# Special typing constructs Union, Optional, Generic, Callable and Tuple
900# use three special attributes for internal bookkeeping of generic types:
901# * __parameters__ is a tuple of unique free type parameters of a generic
902# type, for example, Dict[T, T].__parameters__ == (T,);
903# * __origin__ keeps a reference to a type that was subscripted,
904# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
905# the type.
906# * __args__ is a tuple of all arguments used in subscripting,
907# e.g., Dict[T, int].__args__ == (T, int).
908
909
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300910class _GenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300911 def __init__(self, origin, params, *, inst=True, name=None):
912 super().__init__(origin, inst=inst, name=name)
913 if not isinstance(params, tuple):
914 params = (params,)
915 self.__args__ = tuple(... if a is _TypingEllipsis else
916 () if a is _TypingEmpty else
917 a for a in params)
918 self.__parameters__ = _collect_type_vars(params)
919 if not name:
920 self.__module__ = origin.__module__
921
922 def __eq__(self, other):
923 if not isinstance(other, _GenericAlias):
924 return NotImplemented
925 return (self.__origin__ == other.__origin__
926 and self.__args__ == other.__args__)
927
928 def __hash__(self):
929 return hash((self.__origin__, self.__args__))
930
Maggie Moss1b4552c2020-09-09 13:23:24 -0700931 def __or__(self, right):
932 return Union[self, right]
933
934 def __ror__(self, right):
935 return Union[self, right]
936
Guido van Rossum4cefe742016-09-27 15:20:12 -0700937 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700938 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100939 if self.__origin__ in (Generic, Protocol):
940 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000941 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700942 if not isinstance(params, tuple):
943 params = (params,)
kj73607be2020-12-24 12:33:48 +0800944 params = tuple(_type_convert(p) for p in params)
945 if any(isinstance(t, ParamSpec) for t in self.__parameters__):
946 params = _prepare_paramspec_params(self, params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300947 _check_generic(self, params, len(self.__parameters__))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300948
949 subst = dict(zip(self.__parameters__, params))
950 new_args = []
951 for arg in self.__args__:
kj73607be2020-12-24 12:33:48 +0800952 if isinstance(arg, _TypeVarLike):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300953 arg = subst[arg]
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300954 elif isinstance(arg, (_GenericAlias, GenericAlias)):
Serhiy Storchaka0122d482020-05-10 13:39:40 +0300955 subparams = arg.__parameters__
956 if subparams:
957 subargs = tuple(subst[x] for x in subparams)
958 arg = arg[subargs]
kj73607be2020-12-24 12:33:48 +0800959 # Required to flatten out the args for CallableGenericAlias
960 if self.__origin__ == collections.abc.Callable and isinstance(arg, tuple):
961 new_args.extend(arg)
962 else:
963 new_args.append(arg)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300964 return self.copy_with(tuple(new_args))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100965
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000966 def copy_with(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300967 return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700968
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000969 def __repr__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300970 if self._name:
971 name = 'typing.' + self._name
972 else:
973 name = _type_repr(self.__origin__)
974 args = ", ".join([_type_repr(a) for a in self.__args__])
975 return f'{name}[{args}]'
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000976
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300977 def __reduce__(self):
978 if self._name:
979 origin = globals()[self._name]
980 else:
981 origin = self.__origin__
982 args = tuple(self.__args__)
983 if len(args) == 1 and not isinstance(args[0], tuple):
984 args, = args
985 return operator.getitem, (origin, args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000986
987 def __mro_entries__(self, bases):
988 if self._name: # generic version of an ABC or built-in class
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300989 return super().__mro_entries__(bases)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000990 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100991 if Protocol in bases:
992 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000993 i = bases.index(self)
994 for b in bases[i+1:]:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300995 if isinstance(b, _BaseGenericAlias) and b is not self:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000996 return ()
997 return (self.__origin__,)
998
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000999
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001000# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
1001# 1 for List and 2 for Dict. It may be -1 if variable number of
1002# parameters are accepted (needs custom __getitem__).
1003
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001004class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001005 def __init__(self, origin, nparams, *, inst=True, name=None):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001006 if name is None:
1007 name = origin.__name__
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001008 super().__init__(origin, inst=inst, name=name)
1009 self._nparams = nparams
Serhiy Storchaka2fbc57a2020-05-10 15:14:27 +03001010 if origin.__module__ == 'builtins':
1011 self.__doc__ = f'A generic version of {origin.__qualname__}.'
1012 else:
1013 self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001014
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001015 @_tp_cache
1016 def __getitem__(self, params):
1017 if not isinstance(params, tuple):
1018 params = (params,)
1019 msg = "Parameters to generic types must be types."
1020 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001021 _check_generic(self, params, self._nparams)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001022 return self.copy_with(params)
1023
1024 def copy_with(self, params):
1025 return _GenericAlias(self.__origin__, params,
1026 name=self._name, inst=self._inst)
1027
1028 def __repr__(self):
1029 return 'typing.' + self._name
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001030
1031 def __subclasscheck__(self, cls):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001032 if isinstance(cls, _SpecialGenericAlias):
1033 return issubclass(cls.__origin__, self.__origin__)
1034 if not isinstance(cls, _GenericAlias):
1035 return issubclass(cls, self.__origin__)
1036 return super().__subclasscheck__(cls)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001037
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001038 def __reduce__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001039 return self._name
Ivan Levkivskyi83494032018-03-26 23:01:12 +01001040
Maggie Moss1b4552c2020-09-09 13:23:24 -07001041 def __or__(self, right):
1042 return Union[self, right]
1043
1044 def __ror__(self, right):
1045 return Union[self, right]
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001046
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001047class _CallableGenericAlias(_GenericAlias, _root=True):
1048 def __repr__(self):
1049 assert self._name == 'Callable'
kj73607be2020-12-24 12:33:48 +08001050 args = self.__args__
1051 if len(args) == 2 and (args[0] is Ellipsis
1052 or isinstance(args[0], (ParamSpec, _ConcatenateGenericAlias))):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001053 return super().__repr__()
1054 return (f'typing.Callable'
kj73607be2020-12-24 12:33:48 +08001055 f'[[{", ".join([_type_repr(a) for a in args[:-1]])}], '
1056 f'{_type_repr(args[-1])}]')
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001057
1058 def __reduce__(self):
1059 args = self.__args__
kj73607be2020-12-24 12:33:48 +08001060 if not (len(args) == 2 and (args[0] is Ellipsis
1061 or isinstance(args[0], (ParamSpec, _ConcatenateGenericAlias)))):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001062 args = list(args[:-1]), args[-1]
1063 return operator.getitem, (Callable, args)
1064
1065
1066class _CallableType(_SpecialGenericAlias, _root=True):
1067 def copy_with(self, params):
1068 return _CallableGenericAlias(self.__origin__, params,
1069 name=self._name, inst=self._inst)
1070
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001071 def __getitem__(self, params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001072 if not isinstance(params, tuple) or len(params) != 2:
1073 raise TypeError("Callable must be used as "
1074 "Callable[[arg, ...], result].")
1075 args, result = params
kj463c7d32020-12-14 02:38:24 +08001076 # This relaxes what args can be on purpose to allow things like
1077 # PEP 612 ParamSpec. Responsibility for whether a user is using
1078 # Callable[...] properly is deferred to static type checkers.
1079 if isinstance(args, list):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001080 params = (tuple(args), result)
kj463c7d32020-12-14 02:38:24 +08001081 else:
1082 params = (args, result)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001083 return self.__getitem_inner__(params)
1084
1085 @_tp_cache
1086 def __getitem_inner__(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001087 args, result = params
1088 msg = "Callable[args, result]: result must be a type."
1089 result = _type_check(result, msg)
1090 if args is Ellipsis:
1091 return self.copy_with((_TypingEllipsis, result))
kj463c7d32020-12-14 02:38:24 +08001092 if not isinstance(args, tuple):
1093 args = (args,)
1094 args = tuple(_type_convert(arg) for arg in args)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001095 params = args + (result,)
1096 return self.copy_with(params)
1097
1098
1099class _TupleType(_SpecialGenericAlias, _root=True):
1100 @_tp_cache
1101 def __getitem__(self, params):
1102 if params == ():
1103 return self.copy_with((_TypingEmpty,))
1104 if not isinstance(params, tuple):
1105 params = (params,)
1106 if len(params) == 2 and params[1] is ...:
1107 msg = "Tuple[t, ...]: t must be a type."
1108 p = _type_check(params[0], msg)
1109 return self.copy_with((p, _TypingEllipsis))
1110 msg = "Tuple[t0, t1, ...]: each t must be a type."
1111 params = tuple(_type_check(p, msg) for p in params)
1112 return self.copy_with(params)
1113
1114
1115class _UnionGenericAlias(_GenericAlias, _root=True):
1116 def copy_with(self, params):
1117 return Union[params]
1118
1119 def __eq__(self, other):
1120 if not isinstance(other, _UnionGenericAlias):
1121 return NotImplemented
1122 return set(self.__args__) == set(other.__args__)
1123
1124 def __hash__(self):
1125 return hash(frozenset(self.__args__))
1126
1127 def __repr__(self):
1128 args = self.__args__
1129 if len(args) == 2:
1130 if args[0] is type(None):
1131 return f'typing.Optional[{_type_repr(args[1])}]'
1132 elif args[1] is type(None):
1133 return f'typing.Optional[{_type_repr(args[0])}]'
1134 return super().__repr__()
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001135
Maggie Moss1b4552c2020-09-09 13:23:24 -07001136 def __instancecheck__(self, obj):
1137 return self.__subclasscheck__(type(obj))
1138
1139 def __subclasscheck__(self, cls):
1140 for arg in self.__args__:
1141 if issubclass(cls, arg):
1142 return True
1143
1144
Yurii Karabasf03d3182020-11-17 04:23:19 +02001145def _value_and_type_iter(parameters):
1146 return ((p, type(p)) for p in parameters)
1147
1148
1149class _LiteralGenericAlias(_GenericAlias, _root=True):
1150
1151 def __eq__(self, other):
1152 if not isinstance(other, _LiteralGenericAlias):
1153 return NotImplemented
1154
1155 return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__))
1156
1157 def __hash__(self):
Yurii Karabas1b540772020-11-19 18:17:38 +02001158 return hash(frozenset(_value_and_type_iter(self.__args__)))
Yurii Karabasf03d3182020-11-17 04:23:19 +02001159
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001160
kj73607be2020-12-24 12:33:48 +08001161class _ConcatenateGenericAlias(_GenericAlias, _root=True):
1162 pass
1163
1164
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001165class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001166 """Abstract base class for generic types.
1167
Guido van Rossumb24569a2016-11-20 18:01:29 -08001168 A generic type is typically declared by inheriting from
1169 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001170 For example, a generic mapping type might be defined as::
1171
1172 class Mapping(Generic[KT, VT]):
1173 def __getitem__(self, key: KT) -> VT:
1174 ...
1175 # Etc.
1176
1177 This class can then be used as follows::
1178
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001179 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001180 try:
1181 return mapping[key]
1182 except KeyError:
1183 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001184 """
Guido van Rossumd70fe632015-08-05 12:11:06 +02001185 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001186 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +02001187
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001188 @_tp_cache
1189 def __class_getitem__(cls, params):
1190 if not isinstance(params, tuple):
1191 params = (params,)
1192 if not params and cls is not Tuple:
1193 raise TypeError(
1194 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
kj73607be2020-12-24 12:33:48 +08001195 params = tuple(_type_convert(p) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001196 if cls in (Generic, Protocol):
1197 # Generic and Protocol can only be subscripted with unique type variables.
kj73607be2020-12-24 12:33:48 +08001198 if not all(isinstance(p, _TypeVarLike) for p in params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001199 raise TypeError(
kj73607be2020-12-24 12:33:48 +08001200 f"Parameters to {cls.__name__}[...] must all be type variables "
1201 f"or parameter specification variables.")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001202 if len(set(params)) != len(params):
1203 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001204 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001205 else:
1206 # Subscripting a regular Generic subclass.
kj73607be2020-12-24 12:33:48 +08001207 if any(isinstance(t, ParamSpec) for t in cls.__parameters__):
1208 params = _prepare_paramspec_params(cls, params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001209 _check_generic(cls, params, len(cls.__parameters__))
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001210 return _GenericAlias(cls, params)
1211
1212 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +01001213 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001214 tvars = []
1215 if '__orig_bases__' in cls.__dict__:
1216 error = Generic in cls.__orig_bases__
1217 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001218 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001219 if error:
1220 raise TypeError("Cannot inherit from plain Generic")
1221 if '__orig_bases__' in cls.__dict__:
1222 tvars = _collect_type_vars(cls.__orig_bases__)
1223 # Look for Generic[T1, ..., Tn].
1224 # If found, tvars must be a subset of it.
1225 # If not found, tvars is it.
1226 # Also check for and reject plain Generic,
1227 # and reject multiple Generic[...].
1228 gvars = None
1229 for base in cls.__orig_bases__:
1230 if (isinstance(base, _GenericAlias) and
1231 base.__origin__ is Generic):
1232 if gvars is not None:
1233 raise TypeError(
1234 "Cannot inherit from Generic[...] multiple types.")
1235 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001236 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001237 tvarset = set(tvars)
1238 gvarset = set(gvars)
1239 if not tvarset <= gvarset:
1240 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
1241 s_args = ', '.join(str(g) for g in gvars)
1242 raise TypeError(f"Some type variables ({s_vars}) are"
1243 f" not listed in Generic[{s_args}]")
1244 tvars = gvars
1245 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001246
1247
1248class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001249 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
1250 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001251 to sneak in where prohibited.
1252 """
1253
1254
1255class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -08001256 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -07001257
1258
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001259_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
1260 '_is_protocol', '_is_runtime_protocol']
1261
1262_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
1263 '__init__', '__module__', '__new__', '__slots__',
Guido van Rossum48b069a2020-04-07 09:50:06 -07001264 '__subclasshook__', '__weakref__', '__class_getitem__']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001265
1266# These special attributes will be not collected as protocol members.
1267EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
1268
1269
1270def _get_protocol_attrs(cls):
1271 """Collect protocol members from a protocol class objects.
1272
1273 This includes names actually defined in the class dictionary, as well
1274 as names that appear in annotations. Special names (above) are skipped.
1275 """
1276 attrs = set()
1277 for base in cls.__mro__[:-1]: # without object
1278 if base.__name__ in ('Protocol', 'Generic'):
1279 continue
1280 annotations = getattr(base, '__annotations__', {})
1281 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
1282 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
1283 attrs.add(attr)
1284 return attrs
1285
1286
1287def _is_callable_members_only(cls):
1288 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
1289 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
1290
1291
1292def _no_init(self, *args, **kwargs):
1293 if type(self)._is_protocol:
1294 raise TypeError('Protocols cannot be instantiated')
1295
1296
Rossc1af1282020-12-29 11:55:28 +00001297def _allow_reckless_class_checks():
Nickolena Fishercfaf4c02020-04-26 12:49:11 -05001298 """Allow instance and class checks for special stdlib modules.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001299
1300 The abc and functools modules indiscriminately call isinstance() and
1301 issubclass() on the whole MRO of a user class, which may contain protocols.
1302 """
1303 try:
1304 return sys._getframe(3).f_globals['__name__'] in ['abc', 'functools']
1305 except (AttributeError, ValueError): # For platforms without _getframe().
1306 return True
1307
1308
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001309_PROTO_ALLOWLIST = {
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001310 'collections.abc': [
1311 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
1312 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
1313 ],
1314 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1315}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001316
1317
1318class _ProtocolMeta(ABCMeta):
1319 # This metaclass is really unfortunate and exists only because of
1320 # the lack of __instancehook__.
1321 def __instancecheck__(cls, instance):
1322 # We need this method for situations where attributes are
1323 # assigned in __init__.
1324 if ((not getattr(cls, '_is_protocol', False) or
1325 _is_callable_members_only(cls)) and
1326 issubclass(instance.__class__, cls)):
1327 return True
1328 if cls._is_protocol:
1329 if all(hasattr(instance, attr) and
1330 # All *methods* can be blocked by setting them to None.
1331 (not callable(getattr(cls, attr, None)) or
1332 getattr(instance, attr) is not None)
1333 for attr in _get_protocol_attrs(cls)):
1334 return True
1335 return super().__instancecheck__(instance)
1336
1337
1338class Protocol(Generic, metaclass=_ProtocolMeta):
1339 """Base class for protocol classes.
1340
1341 Protocol classes are defined as::
1342
1343 class Proto(Protocol):
1344 def meth(self) -> int:
1345 ...
1346
1347 Such classes are primarily used with static type checkers that recognize
1348 structural subtyping (static duck-typing), for example::
1349
1350 class C:
1351 def meth(self) -> int:
1352 return 0
1353
1354 def func(x: Proto) -> int:
1355 return x.meth()
1356
1357 func(C()) # Passes static type check
1358
1359 See PEP 544 for details. Protocol classes decorated with
1360 @typing.runtime_checkable act as simple-minded runtime protocols that check
1361 only the presence of given attributes, ignoring their type signatures.
1362 Protocol classes can be generic, they are defined as::
1363
1364 class GenProto(Protocol[T]):
1365 def meth(self) -> T:
1366 ...
1367 """
1368 __slots__ = ()
1369 _is_protocol = True
1370 _is_runtime_protocol = False
1371
1372 def __init_subclass__(cls, *args, **kwargs):
1373 super().__init_subclass__(*args, **kwargs)
1374
1375 # Determine if this is a protocol or a concrete subclass.
1376 if not cls.__dict__.get('_is_protocol', False):
1377 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1378
1379 # Set (or override) the protocol subclass hook.
1380 def _proto_hook(other):
1381 if not cls.__dict__.get('_is_protocol', False):
1382 return NotImplemented
1383
1384 # First, perform various sanity checks.
1385 if not getattr(cls, '_is_runtime_protocol', False):
Rossc1af1282020-12-29 11:55:28 +00001386 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001387 return NotImplemented
1388 raise TypeError("Instance and class checks can only be used with"
1389 " @runtime_checkable protocols")
1390 if not _is_callable_members_only(cls):
Rossc1af1282020-12-29 11:55:28 +00001391 if _allow_reckless_class_checks():
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001392 return NotImplemented
1393 raise TypeError("Protocols with non-method members"
1394 " don't support issubclass()")
1395 if not isinstance(other, type):
1396 # Same error message as for issubclass(1, int).
1397 raise TypeError('issubclass() arg 1 must be a class')
1398
1399 # Second, perform the actual structural compatibility check.
1400 for attr in _get_protocol_attrs(cls):
1401 for base in other.__mro__:
1402 # Check if the members appears in the class dictionary...
1403 if attr in base.__dict__:
1404 if base.__dict__[attr] is None:
1405 return NotImplemented
1406 break
1407
1408 # ...or in annotations, if it is a sub-protocol.
1409 annotations = getattr(base, '__annotations__', {})
1410 if (isinstance(annotations, collections.abc.Mapping) and
1411 attr in annotations and
1412 issubclass(other, Generic) and other._is_protocol):
1413 break
1414 else:
1415 return NotImplemented
1416 return True
1417
1418 if '__subclasshook__' not in cls.__dict__:
1419 cls.__subclasshook__ = _proto_hook
1420
1421 # We have nothing more to do for non-protocols...
1422 if not cls._is_protocol:
1423 return
1424
1425 # ... otherwise check consistency of bases, and prohibit instantiation.
1426 for base in cls.__bases__:
1427 if not (base in (object, Generic) or
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001428 base.__module__ in _PROTO_ALLOWLIST and
1429 base.__name__ in _PROTO_ALLOWLIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001430 issubclass(base, Generic) and base._is_protocol):
1431 raise TypeError('Protocols can only inherit from other'
1432 ' protocols, got %r' % base)
1433 cls.__init__ = _no_init
1434
1435
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001436class _AnnotatedAlias(_GenericAlias, _root=True):
1437 """Runtime representation of an annotated type.
1438
1439 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1440 with extra annotations. The alias behaves like a normal typing alias,
1441 instantiating is the same as instantiating the underlying type, binding
1442 it to types is also the same.
1443 """
1444 def __init__(self, origin, metadata):
1445 if isinstance(origin, _AnnotatedAlias):
1446 metadata = origin.__metadata__ + metadata
1447 origin = origin.__origin__
1448 super().__init__(origin, origin)
1449 self.__metadata__ = metadata
1450
1451 def copy_with(self, params):
1452 assert len(params) == 1
1453 new_type = params[0]
1454 return _AnnotatedAlias(new_type, self.__metadata__)
1455
1456 def __repr__(self):
1457 return "typing.Annotated[{}, {}]".format(
1458 _type_repr(self.__origin__),
1459 ", ".join(repr(a) for a in self.__metadata__)
1460 )
1461
1462 def __reduce__(self):
1463 return operator.getitem, (
1464 Annotated, (self.__origin__,) + self.__metadata__
1465 )
1466
1467 def __eq__(self, other):
1468 if not isinstance(other, _AnnotatedAlias):
1469 return NotImplemented
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001470 return (self.__origin__ == other.__origin__
1471 and self.__metadata__ == other.__metadata__)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001472
1473 def __hash__(self):
1474 return hash((self.__origin__, self.__metadata__))
1475
1476
1477class Annotated:
1478 """Add context specific metadata to a type.
1479
1480 Example: Annotated[int, runtime_check.Unsigned] indicates to the
1481 hypothetical runtime_check module that this type is an unsigned int.
1482 Every other consumer of this type can ignore this metadata and treat
1483 this type as int.
1484
1485 The first argument to Annotated must be a valid type.
1486
1487 Details:
1488
1489 - It's an error to call `Annotated` with less than two arguments.
1490 - Nested Annotated are flattened::
1491
1492 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1493
1494 - Instantiating an annotated type is equivalent to instantiating the
1495 underlying type::
1496
1497 Annotated[C, Ann1](5) == C(5)
1498
1499 - Annotated can be used as a generic type alias::
1500
1501 Optimized = Annotated[T, runtime.Optimize()]
1502 Optimized[int] == Annotated[int, runtime.Optimize()]
1503
1504 OptimizedList = Annotated[List[T], runtime.Optimize()]
1505 OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1506 """
1507
1508 __slots__ = ()
1509
1510 def __new__(cls, *args, **kwargs):
1511 raise TypeError("Type Annotated cannot be instantiated.")
1512
1513 @_tp_cache
1514 def __class_getitem__(cls, params):
1515 if not isinstance(params, tuple) or len(params) < 2:
1516 raise TypeError("Annotated[...] should be used "
1517 "with at least two arguments (a type and an "
1518 "annotation).")
1519 msg = "Annotated[t, ...]: t must be a type."
1520 origin = _type_check(params[0], msg)
1521 metadata = tuple(params[1:])
1522 return _AnnotatedAlias(origin, metadata)
1523
1524 def __init_subclass__(cls, *args, **kwargs):
1525 raise TypeError(
1526 "Cannot subclass {}.Annotated".format(cls.__module__)
1527 )
1528
1529
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001530def runtime_checkable(cls):
1531 """Mark a protocol class as a runtime protocol.
1532
1533 Such protocol can be used with isinstance() and issubclass().
1534 Raise TypeError if applied to a non-protocol class.
1535 This allows a simple-minded structural check very similar to
1536 one trick ponies in collections.abc such as Iterable.
1537 For example::
1538
1539 @runtime_checkable
1540 class Closable(Protocol):
1541 def close(self): ...
1542
1543 assert isinstance(open('/some/file'), Closable)
1544
1545 Warning: this will check only the presence of the required methods,
1546 not their type signatures!
1547 """
1548 if not issubclass(cls, Generic) or not cls._is_protocol:
1549 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1550 ' got %r' % cls)
1551 cls._is_runtime_protocol = True
1552 return cls
1553
1554
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001555def cast(typ, val):
1556 """Cast a value to a type.
1557
1558 This returns the value unchanged. To the type checker this
1559 signals that the return value has the designated type, but at
1560 runtime we intentionally don't check anything (we want this
1561 to be as fast as possible).
1562 """
1563 return val
1564
1565
1566def _get_defaults(func):
1567 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001568 try:
1569 code = func.__code__
1570 except AttributeError:
1571 # Some built-in functions don't have __code__, __defaults__, etc.
1572 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001573 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001574 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001575 arg_names = arg_names[:pos_count]
1576 defaults = func.__defaults__ or ()
1577 kwdefaults = func.__kwdefaults__
1578 res = dict(kwdefaults) if kwdefaults else {}
1579 pos_offset = pos_count - len(defaults)
1580 for name, value in zip(arg_names[pos_offset:], defaults):
1581 assert name not in res
1582 res[name] = value
1583 return res
1584
1585
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001586_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1587 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001588 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001589
1590
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001591def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001592 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001593
Guido van Rossum991d14f2016-11-09 13:12:51 -08001594 This is often the same as obj.__annotations__, but it handles
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001595 forward references encoded as string literals, adds Optional[t] if a
1596 default value equal to None is set and recursively replaces all
1597 'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001598
Guido van Rossum991d14f2016-11-09 13:12:51 -08001599 The argument may be a module, class, method, or function. The annotations
1600 are returned as a dictionary. For classes, annotations include also
1601 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001602
Guido van Rossum991d14f2016-11-09 13:12:51 -08001603 TypeError is raised if the argument is not of a type that can contain
1604 annotations, and an empty dictionary is returned if no annotations are
1605 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001606
Guido van Rossum991d14f2016-11-09 13:12:51 -08001607 BEWARE -- the behavior of globalns and localns is counterintuitive
1608 (unless you are familiar with how eval() and exec() work). The
1609 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001610
Guido van Rossum991d14f2016-11-09 13:12:51 -08001611 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001612 globals from obj (or the respective module's globals for classes),
1613 and these are also used as the locals. If the object does not appear
1614 to have globals, an empty dictionary is used.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001615
Guido van Rossum991d14f2016-11-09 13:12:51 -08001616 - If one dict argument is passed, it is used for both globals and
1617 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001618
Guido van Rossum991d14f2016-11-09 13:12:51 -08001619 - If two dict arguments are passed, they specify globals and
1620 locals, respectively.
1621 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001622
Guido van Rossum991d14f2016-11-09 13:12:51 -08001623 if getattr(obj, '__no_type_check__', None):
1624 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001625 # Classes require a special treatment.
1626 if isinstance(obj, type):
1627 hints = {}
1628 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001629 if globalns is None:
Karthikeyan Singaravelana9cf69d2021-04-12 23:47:25 +05301630 try:
1631 base_globals = sys.modules[base.__module__].__dict__
1632 except KeyError:
1633 continue
Łukasz Langaf350a262017-09-14 14:33:00 -04001634 else:
1635 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001636 ann = base.__dict__.get('__annotations__', {})
Ken Jin852150d2021-04-13 01:23:12 +08001637 base_locals = dict(vars(base)) if localns is None else localns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001638 for name, value in ann.items():
1639 if value is None:
1640 value = type(None)
1641 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001642 value = ForwardRef(value, is_argument=False)
Ken Jin852150d2021-04-13 01:23:12 +08001643 value = _eval_type(value, base_globals, base_locals)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001644 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001645 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001646
1647 if globalns is None:
1648 if isinstance(obj, types.ModuleType):
1649 globalns = obj.__dict__
1650 else:
benedwards140aca3a32019-11-21 17:24:58 +00001651 nsobj = obj
1652 # Find globalns for the unwrapped object.
1653 while hasattr(nsobj, '__wrapped__'):
1654 nsobj = nsobj.__wrapped__
1655 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001656 if localns is None:
1657 localns = globalns
1658 elif localns is None:
1659 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001660 hints = getattr(obj, '__annotations__', None)
1661 if hints is None:
1662 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001663 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001664 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001665 else:
1666 raise TypeError('{!r} is not a module, class, method, '
1667 'or function.'.format(obj))
1668 defaults = _get_defaults(obj)
1669 hints = dict(hints)
1670 for name, value in hints.items():
1671 if value is None:
1672 value = type(None)
1673 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001674 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001675 value = _eval_type(value, globalns, localns)
1676 if name in defaults and defaults[name] is None:
1677 value = Optional[value]
1678 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001679 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1680
1681
1682def _strip_annotations(t):
1683 """Strips the annotations from a given type.
1684 """
1685 if isinstance(t, _AnnotatedAlias):
1686 return _strip_annotations(t.__origin__)
1687 if isinstance(t, _GenericAlias):
1688 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1689 if stripped_args == t.__args__:
1690 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001691 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001692 if isinstance(t, GenericAlias):
1693 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1694 if stripped_args == t.__args__:
1695 return t
1696 return GenericAlias(t.__origin__, stripped_args)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001697 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001698
1699
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001700def get_origin(tp):
1701 """Get the unsubscripted version of a type.
1702
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001703 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1704 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001705
1706 get_origin(Literal[42]) is Literal
1707 get_origin(int) is None
1708 get_origin(ClassVar[int]) is ClassVar
1709 get_origin(Generic) is Generic
1710 get_origin(Generic[T]) is Generic
1711 get_origin(Union[T, int]) is Union
1712 get_origin(List[Tuple[T, T]][int]) == list
Jelle Zijlstra52243362021-04-10 19:57:05 -07001713 get_origin(P.args) is P
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001714 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001715 if isinstance(tp, _AnnotatedAlias):
1716 return Annotated
Jelle Zijlstra52243362021-04-10 19:57:05 -07001717 if isinstance(tp, (_BaseGenericAlias, GenericAlias,
1718 ParamSpecArgs, ParamSpecKwargs)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001719 return tp.__origin__
1720 if tp is Generic:
1721 return Generic
Ken Jinefb1f092020-12-29 10:26:19 +08001722 if isinstance(tp, types.Union):
1723 return types.Union
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001724 return None
1725
1726
1727def get_args(tp):
1728 """Get type arguments with all substitutions performed.
1729
1730 For unions, basic simplifications used by Union constructor are performed.
1731 Examples::
1732 get_args(Dict[str, int]) == (str, int)
1733 get_args(int) == ()
1734 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1735 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1736 get_args(Callable[[], T][int]) == ([], int)
1737 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001738 if isinstance(tp, _AnnotatedAlias):
1739 return (tp.__origin__,) + tp.__metadata__
Ken Jin4140f102020-12-29 04:06:19 +08001740 if isinstance(tp, (_GenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001741 res = tp.__args__
Ken Jinefb1f092020-12-29 10:26:19 +08001742 if (tp.__origin__ is collections.abc.Callable
1743 and not (res[0] is Ellipsis
1744 or isinstance(res[0], (ParamSpec, _ConcatenateGenericAlias)))):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001745 res = (list(res[:-1]), res[-1])
1746 return res
Ken Jinefb1f092020-12-29 10:26:19 +08001747 if isinstance(tp, types.Union):
1748 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001749 return ()
1750
1751
Patrick Reader0705ec82020-09-16 05:58:32 +01001752def is_typeddict(tp):
1753 """Check if an annotation is a TypedDict class
1754
1755 For example::
1756 class Film(TypedDict):
1757 title: str
1758 year: int
1759
1760 is_typeddict(Film) # => True
1761 is_typeddict(Union[list, str]) # => False
1762 """
1763 return isinstance(tp, _TypedDictMeta)
1764
1765
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001766def no_type_check(arg):
1767 """Decorator to indicate that annotations are not type hints.
1768
1769 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001770 applies recursively to all methods and classes defined in that class
1771 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001772
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001773 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001774 """
1775 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001776 arg_attrs = arg.__dict__.copy()
1777 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001778 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001779 arg_attrs.pop(attr)
1780 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001781 if isinstance(obj, types.FunctionType):
1782 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001783 if isinstance(obj, type):
1784 no_type_check(obj)
1785 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001786 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001787 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001788 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001789 return arg
1790
1791
1792def no_type_check_decorator(decorator):
1793 """Decorator to give another decorator the @no_type_check effect.
1794
1795 This wraps the decorator with something that wraps the decorated
1796 function in @no_type_check.
1797 """
1798
1799 @functools.wraps(decorator)
1800 def wrapped_decorator(*args, **kwds):
1801 func = decorator(*args, **kwds)
1802 func = no_type_check(func)
1803 return func
1804
1805 return wrapped_decorator
1806
1807
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001808def _overload_dummy(*args, **kwds):
1809 """Helper for @overload to raise when called."""
1810 raise NotImplementedError(
1811 "You should not call an overloaded function. "
1812 "A series of @overload-decorated functions "
1813 "outside a stub module should always be followed "
1814 "by an implementation that is not @overload-ed.")
1815
1816
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001817def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001818 """Decorator for overloaded functions/methods.
1819
1820 In a stub file, place two or more stub definitions for the same
1821 function in a row, each decorated with @overload. For example:
1822
1823 @overload
1824 def utf8(value: None) -> None: ...
1825 @overload
1826 def utf8(value: bytes) -> bytes: ...
1827 @overload
1828 def utf8(value: str) -> bytes: ...
1829
1830 In a non-stub file (i.e. a regular .py file), do the same but
1831 follow it with an implementation. The implementation should *not*
1832 be decorated with @overload. For example:
1833
1834 @overload
1835 def utf8(value: None) -> None: ...
1836 @overload
1837 def utf8(value: bytes) -> bytes: ...
1838 @overload
1839 def utf8(value: str) -> bytes: ...
1840 def utf8(value):
1841 # implementation goes here
1842 """
1843 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001844
1845
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001846def final(f):
1847 """A decorator to indicate final methods and final classes.
1848
1849 Use this decorator to indicate to type checkers that the decorated
1850 method cannot be overridden, and decorated class cannot be subclassed.
1851 For example:
1852
1853 class Base:
1854 @final
1855 def done(self) -> None:
1856 ...
1857 class Sub(Base):
1858 def done(self) -> None: # Error reported by type checker
1859 ...
1860
1861 @final
1862 class Leaf:
1863 ...
1864 class Other(Leaf): # Error reported by type checker
1865 ...
1866
1867 There is no runtime checking of these properties.
1868 """
1869 return f
1870
1871
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001872# Some unconstrained type variables. These are used by the container types.
1873# (These are not for export.)
1874T = TypeVar('T') # Any type.
1875KT = TypeVar('KT') # Key type.
1876VT = TypeVar('VT') # Value type.
1877T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
1878V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
1879VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
1880T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
1881# Internal type variable used for Type[].
1882CT_co = TypeVar('CT_co', covariant=True, bound=type)
1883
1884# A useful type variable with constraints. This represents string types.
1885# (This one *is* for export!)
1886AnyStr = TypeVar('AnyStr', bytes, str)
1887
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001888
1889# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001890_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001891
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001892Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
1893Awaitable = _alias(collections.abc.Awaitable, 1)
1894Coroutine = _alias(collections.abc.Coroutine, 3)
1895AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
1896AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
1897Iterable = _alias(collections.abc.Iterable, 1)
1898Iterator = _alias(collections.abc.Iterator, 1)
1899Reversible = _alias(collections.abc.Reversible, 1)
1900Sized = _alias(collections.abc.Sized, 0) # Not generic.
1901Container = _alias(collections.abc.Container, 1)
1902Collection = _alias(collections.abc.Collection, 1)
1903Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001904Callable.__doc__ = \
1905 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001906
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001907 The subscription syntax must always be used with exactly two
1908 values: the argument list and the return type. The argument list
1909 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001910
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001911 There is no syntax to indicate optional or keyword arguments,
1912 such function types are rarely used as callback types.
1913 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001914AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
1915MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001916# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001917Mapping = _alias(collections.abc.Mapping, 2)
1918MutableMapping = _alias(collections.abc.MutableMapping, 2)
1919Sequence = _alias(collections.abc.Sequence, 1)
1920MutableSequence = _alias(collections.abc.MutableSequence, 1)
1921ByteString = _alias(collections.abc.ByteString, 0) # Not generic
1922# Tuple accepts variable number of parameters.
1923Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001924Tuple.__doc__ = \
1925 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001926
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001927 Example: Tuple[T1, T2] is a tuple of two elements corresponding
1928 to type variables T1 and T2. Tuple[int, float, str] is a tuple
1929 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001930
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001931 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
1932 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001933List = _alias(list, 1, inst=False, name='List')
1934Deque = _alias(collections.deque, 1, name='Deque')
1935Set = _alias(set, 1, inst=False, name='Set')
1936FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
1937MappingView = _alias(collections.abc.MappingView, 1)
1938KeysView = _alias(collections.abc.KeysView, 1)
1939ItemsView = _alias(collections.abc.ItemsView, 2)
1940ValuesView = _alias(collections.abc.ValuesView, 1)
1941ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
1942AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
1943Dict = _alias(dict, 2, inst=False, name='Dict')
1944DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
1945OrderedDict = _alias(collections.OrderedDict, 2)
1946Counter = _alias(collections.Counter, 1)
1947ChainMap = _alias(collections.ChainMap, 2)
1948Generator = _alias(collections.abc.Generator, 3)
1949AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
1950Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001951Type.__doc__ = \
1952 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001953
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001954 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001955
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001956 class User: ... # Abstract base for User classes
1957 class BasicUser(User): ...
1958 class ProUser(User): ...
1959 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08001960
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001961 And a function that takes a class argument that's a subclass of
1962 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08001963
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001964 U = TypeVar('U', bound=User)
1965 def new_user(user_class: Type[U]) -> U:
1966 user = user_class()
1967 # (Here we could write the user object to a database)
1968 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08001969
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001970 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08001971
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001972 At this point the type checker knows that joe has type BasicUser.
1973 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001974
1975
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001976@runtime_checkable
1977class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001978 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001979 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001980
1981 @abstractmethod
1982 def __int__(self) -> int:
1983 pass
1984
1985
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001986@runtime_checkable
1987class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001988 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001989 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001990
1991 @abstractmethod
1992 def __float__(self) -> float:
1993 pass
1994
1995
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001996@runtime_checkable
1997class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001998 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001999 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002000
2001 @abstractmethod
2002 def __complex__(self) -> complex:
2003 pass
2004
2005
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002006@runtime_checkable
2007class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002008 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002009 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002010
2011 @abstractmethod
2012 def __bytes__(self) -> bytes:
2013 pass
2014
2015
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002016@runtime_checkable
2017class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002018 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07002019 __slots__ = ()
2020
2021 @abstractmethod
2022 def __index__(self) -> int:
2023 pass
2024
2025
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002026@runtime_checkable
2027class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002028 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002029 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002030
2031 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002032 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002033 pass
2034
2035
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01002036@runtime_checkable
2037class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03002038 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02002039 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002040
2041 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02002042 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002043 pass
2044
2045
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002046def _make_nmtuple(name, types, module, defaults = ()):
2047 fields = [n for n, t in types]
2048 types = {n: _type_check(t, f"field {n} annotation must be a type")
2049 for n, t in types}
2050 nm_tpl = collections.namedtuple(name, fields,
2051 defaults=defaults, module=module)
2052 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002053 return nm_tpl
2054
2055
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002056# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002057_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
2058 '_fields', '_field_defaults',
2059 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002060
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002061_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002062
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002063
Guido van Rossum2f841442016-11-15 09:48:06 -08002064class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002065
Guido van Rossum2f841442016-11-15 09:48:06 -08002066 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002067 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08002068 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002069 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08002070 for field_name in types:
2071 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002072 default_names.append(field_name)
2073 elif default_names:
2074 raise TypeError(f"Non-default namedtuple field {field_name} "
2075 f"cannot follow default field"
2076 f"{'s' if len(default_names) > 1 else ''} "
2077 f"{', '.join(default_names)}")
2078 nm_tpl = _make_nmtuple(typename, types.items(),
2079 defaults=[ns[n] for n in default_names],
2080 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08002081 # update from user namespace without overriding special namedtuple attributes
2082 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01002083 if key in _prohibited:
2084 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
2085 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08002086 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08002087 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002088
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002089
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002090def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08002091 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002092
Guido van Rossum2f841442016-11-15 09:48:06 -08002093 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002094
Guido van Rossum2f841442016-11-15 09:48:06 -08002095 class Employee(NamedTuple):
2096 name: str
2097 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002098
Guido van Rossum2f841442016-11-15 09:48:06 -08002099 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002100
Guido van Rossum2f841442016-11-15 09:48:06 -08002101 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002102
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07002103 The resulting class has an extra __annotations__ attribute, giving a
2104 dict that maps field names to types. (The field names are also in
2105 the _fields attribute, which is part of the namedtuple API.)
2106 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002107
Guido van Rossum2f841442016-11-15 09:48:06 -08002108 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002109
Guido van Rossum2f841442016-11-15 09:48:06 -08002110 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002111
Guido van Rossum2f841442016-11-15 09:48:06 -08002112 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
2113 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002114 if fields is None:
2115 fields = kwargs.items()
2116 elif kwargs:
2117 raise TypeError("Either list of fields or keywords"
2118 " can be provided to NamedTuple, not both")
2119 try:
2120 module = sys._getframe(1).f_globals.get('__name__', '__main__')
2121 except (AttributeError, ValueError):
2122 module = None
2123 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07002124
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03002125_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
2126
2127def _namedtuple_mro_entries(bases):
2128 if len(bases) > 1:
2129 raise TypeError("Multiple inheritance with NamedTuple is not supported")
2130 assert bases[0] is NamedTuple
2131 return (_NamedTuple,)
2132
2133NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002134
2135
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002136class _TypedDictMeta(type):
2137 def __new__(cls, name, bases, ns, total=True):
2138 """Create new typed dict class object.
2139
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002140 This method is called when TypedDict is subclassed,
2141 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002142 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002143 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002144 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002145 for base in bases:
2146 if type(base) is not _TypedDictMeta:
2147 raise TypeError('cannot inherit from both a TypedDict type '
2148 'and a non-TypedDict base class')
2149 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002150
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002151 annotations = {}
2152 own_annotations = ns.get('__annotations__', {})
2153 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002154 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002155 own_annotations = {
2156 n: _type_check(tp, msg) for n, tp in own_annotations.items()
2157 }
2158 required_keys = set()
2159 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002160
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002161 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002162 annotations.update(base.__dict__.get('__annotations__', {}))
2163 required_keys.update(base.__dict__.get('__required_keys__', ()))
2164 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002165
Vlad Emelianov10e87e52020-02-13 20:53:29 +01002166 annotations.update(own_annotations)
2167 if total:
2168 required_keys.update(own_annotation_keys)
2169 else:
2170 optional_keys.update(own_annotation_keys)
2171
2172 tp_dict.__annotations__ = annotations
2173 tp_dict.__required_keys__ = frozenset(required_keys)
2174 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002175 if not hasattr(tp_dict, '__total__'):
2176 tp_dict.__total__ = total
2177 return tp_dict
2178
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002179 __call__ = dict # static method
2180
2181 def __subclasscheck__(cls, other):
2182 # Typed dicts are only for static structural subtyping.
2183 raise TypeError('TypedDict does not support instance and class checks')
2184
2185 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002186
2187
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002188def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002189 """A simple typed namespace. At runtime it is equivalent to a plain dict.
2190
2191 TypedDict creates a dictionary type that expects all of its
2192 instances to have a certain set of keys, where each key is
2193 associated with a value of a consistent type. This expectation
2194 is not checked at runtime but is only enforced by type checkers.
2195 Usage::
2196
2197 class Point2D(TypedDict):
2198 x: int
2199 y: int
2200 label: str
2201
2202 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
2203 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
2204
2205 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
2206
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11002207 The type info can be accessed via the Point2D.__annotations__ dict, and
2208 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
2209 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002210
2211 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
2212 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
2213
ananthan-123ab6423f2020-02-19 10:03:05 +05302214 By default, all keys must be present in a TypedDict. It is possible
2215 to override this by specifying totality.
2216 Usage::
2217
2218 class point2D(TypedDict, total=False):
2219 x: int
2220 y: int
2221
2222 This means that a point2D TypedDict can have any of the keys omitted.A type
2223 checker is only expected to support a literal False or True as the value of
2224 the total argument. True is the default, and makes all items defined in the
2225 class body be required.
2226
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002227 The class syntax is only supported in Python 3.6+, while two other
2228 syntax forms work for Python 2.7 and 3.2+
2229 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002230 if fields is None:
2231 fields = kwargs
2232 elif kwargs:
2233 raise TypeError("TypedDict takes either a dict or keyword arguments,"
2234 " but not both")
2235
Alex Grönholm67b769f2020-12-10 23:49:05 +02002236 ns = {'__annotations__': dict(fields)}
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002237 try:
2238 # Setting correct module is necessary to make typed dict classes pickleable.
2239 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
2240 except (AttributeError, ValueError):
2241 pass
2242
Alex Grönholm67b769f2020-12-10 23:49:05 +02002243 return _TypedDictMeta(typename, (), ns, total=total)
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03002244
2245_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
2246TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01002247
2248
Guido van Rossum91185fe2016-06-08 11:19:11 -07002249def NewType(name, tp):
2250 """NewType creates simple unique types with almost zero
2251 runtime overhead. NewType(name, tp) is considered a subtype of tp
2252 by static type checkers. At runtime, NewType(name, tp) returns
2253 a dummy function that simply returns its argument. Usage::
2254
2255 UserId = NewType('UserId', int)
2256
2257 def name_by_id(user_id: UserId) -> str:
2258 ...
2259
2260 UserId('user') # Fails type check
2261
2262 name_by_id(42) # Fails type check
2263 name_by_id(UserId(42)) # OK
2264
2265 num = UserId(5) + 1 # type: int
2266 """
2267
2268 def new_type(x):
2269 return x
2270
2271 new_type.__name__ = name
2272 new_type.__supertype__ = tp
2273 return new_type
2274
2275
Guido van Rossum0e0563c2016-04-05 14:54:25 -07002276# Python-version-specific alias (Python 2: unicode; Python 3: str)
2277Text = str
2278
2279
Guido van Rossum91185fe2016-06-08 11:19:11 -07002280# Constant that's True when type checking, but False here.
2281TYPE_CHECKING = False
2282
2283
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002284class IO(Generic[AnyStr]):
2285 """Generic base class for TextIO and BinaryIO.
2286
2287 This is an abstract, generic version of the return of open().
2288
2289 NOTE: This does not distinguish between the different possible
2290 classes (text vs. binary, read vs. write vs. read/write,
2291 append-only, unbuffered). The TextIO and BinaryIO subclasses
2292 below capture the distinctions between text vs. binary, which is
2293 pervasive in the interface; however we currently do not offer a
2294 way to track the other distinctions in the type system.
2295 """
2296
Guido van Rossumd70fe632015-08-05 12:11:06 +02002297 __slots__ = ()
2298
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002299 @property
2300 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002301 def mode(self) -> str:
2302 pass
2303
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002304 @property
2305 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002306 def name(self) -> str:
2307 pass
2308
2309 @abstractmethod
2310 def close(self) -> None:
2311 pass
2312
Shantanu2e6569b2020-01-29 18:52:36 -08002313 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002314 @abstractmethod
2315 def closed(self) -> bool:
2316 pass
2317
2318 @abstractmethod
2319 def fileno(self) -> int:
2320 pass
2321
2322 @abstractmethod
2323 def flush(self) -> None:
2324 pass
2325
2326 @abstractmethod
2327 def isatty(self) -> bool:
2328 pass
2329
2330 @abstractmethod
2331 def read(self, n: int = -1) -> AnyStr:
2332 pass
2333
2334 @abstractmethod
2335 def readable(self) -> bool:
2336 pass
2337
2338 @abstractmethod
2339 def readline(self, limit: int = -1) -> AnyStr:
2340 pass
2341
2342 @abstractmethod
2343 def readlines(self, hint: int = -1) -> List[AnyStr]:
2344 pass
2345
2346 @abstractmethod
2347 def seek(self, offset: int, whence: int = 0) -> int:
2348 pass
2349
2350 @abstractmethod
2351 def seekable(self) -> bool:
2352 pass
2353
2354 @abstractmethod
2355 def tell(self) -> int:
2356 pass
2357
2358 @abstractmethod
2359 def truncate(self, size: int = None) -> int:
2360 pass
2361
2362 @abstractmethod
2363 def writable(self) -> bool:
2364 pass
2365
2366 @abstractmethod
2367 def write(self, s: AnyStr) -> int:
2368 pass
2369
2370 @abstractmethod
2371 def writelines(self, lines: List[AnyStr]) -> None:
2372 pass
2373
2374 @abstractmethod
2375 def __enter__(self) -> 'IO[AnyStr]':
2376 pass
2377
2378 @abstractmethod
2379 def __exit__(self, type, value, traceback) -> None:
2380 pass
2381
2382
2383class BinaryIO(IO[bytes]):
2384 """Typed version of the return of open() in binary mode."""
2385
Guido van Rossumd70fe632015-08-05 12:11:06 +02002386 __slots__ = ()
2387
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002388 @abstractmethod
2389 def write(self, s: Union[bytes, bytearray]) -> int:
2390 pass
2391
2392 @abstractmethod
2393 def __enter__(self) -> 'BinaryIO':
2394 pass
2395
2396
2397class TextIO(IO[str]):
2398 """Typed version of the return of open() in text mode."""
2399
Guido van Rossumd70fe632015-08-05 12:11:06 +02002400 __slots__ = ()
2401
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002402 @property
2403 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002404 def buffer(self) -> BinaryIO:
2405 pass
2406
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002407 @property
2408 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002409 def encoding(self) -> str:
2410 pass
2411
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002412 @property
2413 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002414 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002415 pass
2416
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002417 @property
2418 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002419 def line_buffering(self) -> bool:
2420 pass
2421
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002422 @property
2423 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002424 def newlines(self) -> Any:
2425 pass
2426
2427 @abstractmethod
2428 def __enter__(self) -> 'TextIO':
2429 pass
2430
2431
2432class io:
2433 """Wrapper namespace for IO generic classes."""
2434
2435 __all__ = ['IO', 'TextIO', 'BinaryIO']
2436 IO = IO
2437 TextIO = TextIO
2438 BinaryIO = BinaryIO
2439
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002440
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002441io.__name__ = __name__ + '.io'
2442sys.modules[io.__name__] = io
2443
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002444Pattern = _alias(stdlib_re.Pattern, 1)
2445Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002446
2447class re:
2448 """Wrapper namespace for re type aliases."""
2449
2450 __all__ = ['Pattern', 'Match']
2451 Pattern = Pattern
2452 Match = Match
2453
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002454
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002455re.__name__ = __name__ + '.re'
2456sys.modules[re.__name__] = re