blob: 5da032bbee8f1e871885d921a7e51082f217128b [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.
7* _SpecialForm and its instances (special forms): Any, NoReturn, ClassVar, Union, Optional
8* Two classes whose instances can be type arguments in addition to types: ForwardRef and TypeVar
9* The core of internal generics API: _GenericAlias and _VariadicGenericAlias, the latter is
10 currently only used by Tuple and Callable. All subscripted types like X[int], Union[int, str],
11 etc., are instances of either of these classes.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +010012* The public counterpart of the generics API consists of two classes: Generic and Protocol.
Ivan Levkivskyid911e402018-01-20 11:23:59 +000013* Public helper functions: get_type_hints, overload, cast, no_type_check,
14 no_type_check_decorator.
15* Generic aliases for collections.abc ABCs and few additional protocols.
ananthan-123ab6423f2020-02-19 10:03:05 +053016* Special types: NewType, NamedTuple, TypedDict.
Ivan Levkivskyid911e402018-01-20 11:23:59 +000017* Wrapper submodules for re and io related types.
18"""
19
HongWeipeng6ce03ec2019-09-27 15:54:26 +080020from abc import abstractmethod, ABCMeta
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070021import collections
Ivan Levkivskyid911e402018-01-20 11:23:59 +000022import collections.abc
Brett Cannonf3ad0422016-04-15 10:51:30 -070023import contextlib
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070024import functools
Serhiy Storchaka09f32212018-05-26 21:19:26 +030025import operator
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070026import re as stdlib_re # Avoid confusion with the re we export.
27import sys
28import types
Guido van Rossum48b069a2020-04-07 09:50:06 -070029from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType, GenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070030
31# Please keep __all__ alphabetized within each category.
32__all__ = [
33 # Super-special typing primitives.
Jakub Stasiakcf5b1092020-02-05 02:10:19 +010034 'Annotated',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070035 'Any',
36 'Callable',
Guido van Rossum0a6976d2016-09-11 15:34:56 -070037 'ClassVar',
Ivan Levkivskyif3672422019-05-26 09:37:07 +010038 'Final',
Anthony Sottiled30da5d2019-05-29 11:19:38 -070039 'ForwardRef',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070040 'Generic',
Ivan Levkivskyib891c462019-05-26 09:37:48 +010041 'Literal',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070042 'Optional',
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +010043 'Protocol',
Guido van Rossumeb9aca32016-05-24 16:38:22 -070044 'Tuple',
45 'Type',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070046 'TypeVar',
47 'Union',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070048
49 # ABCs (from collections.abc).
50 'AbstractSet', # collections.abc.Set.
51 'ByteString',
52 'Container',
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +020053 'ContextManager',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070054 'Hashable',
55 'ItemsView',
56 'Iterable',
57 'Iterator',
58 'KeysView',
59 'Mapping',
60 'MappingView',
61 'MutableMapping',
62 'MutableSequence',
63 'MutableSet',
64 'Sequence',
65 'Sized',
66 'ValuesView',
Ivan Levkivskyid911e402018-01-20 11:23:59 +000067 'Awaitable',
68 'AsyncIterator',
69 'AsyncIterable',
70 'Coroutine',
71 'Collection',
72 'AsyncGenerator',
73 'AsyncContextManager',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070074
75 # Structural checks, a.k.a. protocols.
76 'Reversible',
77 'SupportsAbs',
Ivan Levkivskyif06e0212017-05-02 19:14:07 +020078 'SupportsBytes',
79 'SupportsComplex',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070080 'SupportsFloat',
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -070081 'SupportsIndex',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070082 'SupportsInt',
83 'SupportsRound',
84
85 # Concrete collection types.
Anthony Sottiled30da5d2019-05-29 11:19:38 -070086 'ChainMap',
Ivan Levkivskyib692dc82017-02-13 22:50:14 +010087 'Counter',
Raymond Hettinger80490522017-01-16 22:42:37 -080088 'Deque',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070089 'Dict',
Guido van Rossumbd5b9a02016-04-05 08:28:52 -070090 'DefaultDict',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070091 'List',
Anthony Sottiled30da5d2019-05-29 11:19:38 -070092 'OrderedDict',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070093 'Set',
Guido van Rossumefa798d2016-08-23 11:01:50 -070094 'FrozenSet',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070095 'NamedTuple', # Not really a type.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +010096 'TypedDict', # Not really a type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070097 'Generator',
98
99 # One-off things.
100 'AnyStr',
101 'cast',
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100102 'final',
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +0100103 'get_args',
104 'get_origin',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700105 'get_type_hints',
Guido van Rossum91185fe2016-06-08 11:19:11 -0700106 'NewType',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700107 'no_type_check',
108 'no_type_check_decorator',
aetracht45738202018-03-19 14:41:32 -0400109 'NoReturn',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700110 'overload',
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100111 'runtime_checkable',
Guido van Rossum0e0563c2016-04-05 14:54:25 -0700112 'Text',
Guido van Rossum91185fe2016-06-08 11:19:11 -0700113 'TYPE_CHECKING',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700114]
115
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700116# The pseudo-submodules 're' and 'io' are part of the public
117# namespace, but excluded from __all__ because they might stomp on
118# legitimate imports of those modules.
119
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700120
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700121def _type_check(arg, msg, is_argument=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000122 """Check that the argument is a type, and return it (internal helper).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700123
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000124 As a special case, accept None and return type(None) instead. Also wrap strings
125 into ForwardRef instances. Consider several corner cases, for example plain
126 special forms like Union are not valid, while Union[int, str] is OK, etc.
127 The msg argument is a human-readable error message, e.g::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700128
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000129 "Union[arg, ...]: arg should be a type."
Guido van Rossum4cefe742016-09-27 15:20:12 -0700130
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000131 We append the repr() of the actual value (truncated to 100 chars).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700132 """
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100133 invalid_generic_forms = (Generic, Protocol)
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700134 if is_argument:
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100135 invalid_generic_forms = invalid_generic_forms + (ClassVar, Final)
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400136
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000137 if arg is None:
138 return type(None)
139 if isinstance(arg, str):
140 return ForwardRef(arg)
141 if (isinstance(arg, _GenericAlias) and
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400142 arg.__origin__ in invalid_generic_forms):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000143 raise TypeError(f"{arg} is not valid as type argument")
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300144 if arg in (Any, NoReturn):
145 return arg
146 if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000147 raise TypeError(f"Plain {arg} is not valid as type argument")
148 if isinstance(arg, (type, TypeVar, ForwardRef)):
149 return arg
150 if not callable(arg):
151 raise TypeError(f"{msg} Got {arg!r:.100}.")
152 return arg
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700153
154
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000155def _type_repr(obj):
156 """Return the repr() of an object, special-casing types (internal helper).
157
158 If obj is a type, we return a shorter version than the default
159 type.__repr__, based on the module and qualified name, which is
160 typically enough to uniquely identify a type. For everything
161 else, we fall back on repr(obj).
162 """
163 if isinstance(obj, type):
164 if obj.__module__ == 'builtins':
165 return obj.__qualname__
166 return f'{obj.__module__}.{obj.__qualname__}'
167 if obj is ...:
168 return('...')
169 if isinstance(obj, types.FunctionType):
170 return obj.__name__
171 return repr(obj)
172
173
174def _collect_type_vars(types):
175 """Collect all type variable contained in types in order of
176 first appearance (lexicographic order). For example::
177
178 _collect_type_vars((T, List[S, T])) == (T, S)
179 """
180 tvars = []
181 for t in types:
182 if isinstance(t, TypeVar) and t not in tvars:
183 tvars.append(t)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300184 if isinstance(t, (_GenericAlias, GenericAlias)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000185 tvars.extend([t for t in t.__parameters__ if t not in tvars])
186 return tuple(tvars)
187
188
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300189def _check_generic(cls, parameters, elen):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000190 """Check correct count for parameters of a generic cls (internal helper).
191 This gives a nice error message in case of count mismatch.
192 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300193 if not elen:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000194 raise TypeError(f"{cls} is not a generic class")
195 alen = len(parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000196 if alen != elen:
197 raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};"
198 f" actual {alen}, expected {elen}")
199
200
201def _remove_dups_flatten(parameters):
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700202 """An internal helper for Union creation and substitution: flatten Unions
203 among parameters, then remove duplicates.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000204 """
205 # Flatten out Union[Union[...], ...].
206 params = []
207 for p in parameters:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300208 if isinstance(p, _UnionGenericAlias):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000209 params.extend(p.__args__)
210 elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
211 params.extend(p[1:])
212 else:
213 params.append(p)
214 # Weed out strict duplicates, preserving the first of each occurrence.
215 all_params = set(params)
216 if len(all_params) < len(params):
217 new_params = []
218 for t in params:
219 if t in all_params:
220 new_params.append(t)
221 all_params.remove(t)
222 params = new_params
223 assert not all_params, all_params
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700224 return tuple(params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000225
226
227_cleanups = []
228
229
230def _tp_cache(func):
231 """Internal wrapper caching __getitem__ of generic types with a fallback to
232 original function for non-hashable arguments.
233 """
234 cached = functools.lru_cache()(func)
235 _cleanups.append(cached.cache_clear)
236
237 @functools.wraps(func)
238 def inner(*args, **kwds):
239 try:
240 return cached(*args, **kwds)
241 except TypeError:
242 pass # All real errors (not unhashable args) are raised below.
243 return func(*args, **kwds)
244 return inner
245
246
Miss Islington (bot)41d1c042020-07-26 08:31:24 -0700247def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000248 """Evaluate all forward reverences in the given type t.
249 For use of globalns and localns see the docstring for get_type_hints().
Miss Islington (bot)41d1c042020-07-26 08:31:24 -0700250 recursive_guard is used to prevent prevent infinite recursion
251 with recursive ForwardRef.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000252 """
253 if isinstance(t, ForwardRef):
Miss Islington (bot)41d1c042020-07-26 08:31:24 -0700254 return t._evaluate(globalns, localns, recursive_guard)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300255 if isinstance(t, (_GenericAlias, GenericAlias)):
Miss Islington (bot)41d1c042020-07-26 08:31:24 -0700256 ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000257 if ev_args == t.__args__:
258 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300259 if isinstance(t, GenericAlias):
260 return GenericAlias(t.__origin__, ev_args)
261 else:
262 return t.copy_with(ev_args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000263 return t
264
265
266class _Final:
267 """Mixin to prohibit subclassing"""
Guido van Rossum4cefe742016-09-27 15:20:12 -0700268
Guido van Rossum83ec3022017-01-17 20:43:28 -0800269 __slots__ = ('__weakref__',)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700270
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300271 def __init_subclass__(self, /, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000272 if '_root' not in kwds:
273 raise TypeError("Cannot subclass special typing classes")
274
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100275class _Immutable:
276 """Mixin to indicate that object should not be copied."""
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300277 __slots__ = ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000278
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100279 def __copy__(self):
280 return self
281
282 def __deepcopy__(self, memo):
283 return self
284
285
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300286# Internal indicator of special typing constructs.
287# See __doc__ instance attribute for specific docs.
288class _SpecialForm(_Final, _root=True):
289 __slots__ = ('_name', '__doc__', '_getitem')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000290
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300291 def __init__(self, getitem):
292 self._getitem = getitem
293 self._name = getitem.__name__
294 self.__doc__ = getitem.__doc__
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000295
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300296 def __mro_entries__(self, bases):
297 raise TypeError(f"Cannot subclass {self!r}")
Guido van Rossum4cefe742016-09-27 15:20:12 -0700298
299 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000300 return 'typing.' + self._name
301
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100302 def __reduce__(self):
303 return self._name
Guido van Rossum4cefe742016-09-27 15:20:12 -0700304
305 def __call__(self, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000306 raise TypeError(f"Cannot instantiate {self!r}")
307
308 def __instancecheck__(self, obj):
309 raise TypeError(f"{self} cannot be used with isinstance()")
310
311 def __subclasscheck__(self, cls):
312 raise TypeError(f"{self} cannot be used with issubclass()")
313
314 @_tp_cache
315 def __getitem__(self, parameters):
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300316 return self._getitem(self, parameters)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700317
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300318@_SpecialForm
319def Any(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000320 """Special type indicating an unconstrained type.
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700321
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000322 - Any is compatible with every type.
323 - Any assumed to have all methods.
324 - All values assumed to be instances of Any.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700325
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000326 Note that all the above statements are true from the point of view of
327 static type checkers. At runtime, Any should not be used with instance
328 or class checks.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300329 """
330 raise TypeError(f"{self} is not subscriptable")
Guido van Rossumd70fe632015-08-05 12:11:06 +0200331
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300332@_SpecialForm
333def NoReturn(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000334 """Special type indicating functions that never return.
335 Example::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700336
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000337 from typing import NoReturn
338
339 def stop() -> NoReturn:
340 raise Exception('no way')
341
342 This type is invalid in other positions, e.g., ``List[NoReturn]``
343 will fail in static type checkers.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300344 """
345 raise TypeError(f"{self} is not subscriptable")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000346
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300347@_SpecialForm
348def ClassVar(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000349 """Special type construct to mark class variables.
350
351 An annotation wrapped in ClassVar indicates that a given
352 attribute is intended to be used as a class variable and
353 should not be set on instances of that class. Usage::
354
355 class Starship:
356 stats: ClassVar[Dict[str, int]] = {} # class variable
357 damage: int = 10 # instance variable
358
359 ClassVar accepts only types and cannot be further subscribed.
360
361 Note that ClassVar is not a class itself, and should not
362 be used with isinstance() or issubclass().
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300363 """
364 item = _type_check(parameters, f'{self} accepts only single type.')
365 return _GenericAlias(self, (item,))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000366
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300367@_SpecialForm
368def Final(self, parameters):
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100369 """Special typing construct to indicate final names to type checkers.
370
371 A final name cannot be re-assigned or overridden in a subclass.
372 For example:
373
374 MAX_SIZE: Final = 9000
375 MAX_SIZE += 1 # Error reported by type checker
376
377 class Connection:
378 TIMEOUT: Final[int] = 10
379
380 class FastConnector(Connection):
381 TIMEOUT = 1 # Error reported by type checker
382
383 There is no runtime checking of these properties.
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300384 """
385 item = _type_check(parameters, f'{self} accepts only single type.')
386 return _GenericAlias(self, (item,))
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100387
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300388@_SpecialForm
389def Union(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000390 """Union type; Union[X, Y] means either X or Y.
391
392 To define a union, use e.g. Union[int, str]. Details:
393 - The arguments must be types and there must be at least one.
394 - None as an argument is a special case and is replaced by
395 type(None).
396 - Unions of unions are flattened, e.g.::
397
398 Union[Union[int, str], float] == Union[int, str, float]
399
400 - Unions of a single argument vanish, e.g.::
401
402 Union[int] == int # The constructor actually returns int
403
404 - Redundant arguments are skipped, e.g.::
405
406 Union[int, str, int] == Union[int, str]
407
408 - When comparing unions, the argument order is ignored, e.g.::
409
410 Union[int, str] == Union[str, int]
411
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000412 - You cannot subclass or instantiate a union.
413 - You can use Optional[X] as a shorthand for Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300414 """
415 if parameters == ():
416 raise TypeError("Cannot take a Union of no types.")
417 if not isinstance(parameters, tuple):
418 parameters = (parameters,)
419 msg = "Union[arg, ...]: each arg must be a type."
420 parameters = tuple(_type_check(p, msg) for p in parameters)
421 parameters = _remove_dups_flatten(parameters)
422 if len(parameters) == 1:
423 return parameters[0]
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300424 return _UnionGenericAlias(self, parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000425
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300426@_SpecialForm
427def Optional(self, parameters):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000428 """Optional type.
429
430 Optional[X] is equivalent to Union[X, None].
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300431 """
432 arg = _type_check(parameters, f"{self} requires a single type.")
433 return Union[arg, type(None)]
Guido van Rossumb7dedc82016-10-29 12:44:29 -0700434
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300435@_SpecialForm
436def Literal(self, parameters):
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100437 """Special typing form to define literal types (a.k.a. value types).
438
439 This form can be used to indicate to type checkers that the corresponding
440 variable or function parameter has a value equivalent to the provided
441 literal (or one of several literals):
442
443 def validate_simple(data: Any) -> Literal[True]: # always returns True
444 ...
445
446 MODE = Literal['r', 'rb', 'w', 'wb']
447 def open_helper(file: str, mode: MODE) -> str:
448 ...
449
450 open_helper('/some/path', 'r') # Passes type check
451 open_helper('/other/path', 'typo') # Error in type checker
452
Serhiy Storchaka40ded942020-04-23 21:26:48 +0300453 Literal[...] cannot be subclassed. At runtime, an arbitrary value
454 is allowed as type argument to Literal[...], but type checkers may
455 impose restrictions.
456 """
457 # There is no '_type_check' call because arguments to Literal[...] are
458 # values, not types.
459 return _GenericAlias(self, parameters)
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100460
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700461
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000462class ForwardRef(_Final, _root=True):
Guido van Rossumb24569a2016-11-20 18:01:29 -0800463 """Internal wrapper to hold a forward reference."""
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700464
Guido van Rossum4cefe742016-09-27 15:20:12 -0700465 __slots__ = ('__forward_arg__', '__forward_code__',
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400466 '__forward_evaluated__', '__forward_value__',
467 '__forward_is_argument__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700468
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700469 def __init__(self, arg, is_argument=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700470 if not isinstance(arg, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000471 raise TypeError(f"Forward reference must be a string -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700472 try:
473 code = compile(arg, '<string>', 'eval')
474 except SyntaxError:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000475 raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700476 self.__forward_arg__ = arg
477 self.__forward_code__ = code
478 self.__forward_evaluated__ = False
479 self.__forward_value__ = None
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400480 self.__forward_is_argument__ = is_argument
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700481
Miss Islington (bot)41d1c042020-07-26 08:31:24 -0700482 def _evaluate(self, globalns, localns, recursive_guard):
483 if self.__forward_arg__ in recursive_guard:
484 return self
Guido van Rossumdad17902016-11-10 08:29:18 -0800485 if not self.__forward_evaluated__ or localns is not globalns:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700486 if globalns is None and localns is None:
487 globalns = localns = {}
488 elif globalns is None:
489 globalns = localns
490 elif localns is None:
491 localns = globalns
Miss Islington (bot)41d1c042020-07-26 08:31:24 -0700492 type_ =_type_check(
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700493 eval(self.__forward_code__, globalns, localns),
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400494 "Forward references must evaluate to types.",
Miss Islington (bot)41d1c042020-07-26 08:31:24 -0700495 is_argument=self.__forward_is_argument__,
496 )
497 self.__forward_value__ = _eval_type(
498 type_, globalns, localns, recursive_guard | {self.__forward_arg__}
499 )
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700500 self.__forward_evaluated__ = True
501 return self.__forward_value__
502
Guido van Rossum4cefe742016-09-27 15:20:12 -0700503 def __eq__(self, other):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000504 if not isinstance(other, ForwardRef):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700505 return NotImplemented
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100506 if self.__forward_evaluated__ and other.__forward_evaluated__:
507 return (self.__forward_arg__ == other.__forward_arg__ and
508 self.__forward_value__ == other.__forward_value__)
509 return self.__forward_arg__ == other.__forward_arg__
Guido van Rossum4cefe742016-09-27 15:20:12 -0700510
511 def __hash__(self):
plokmijnuhbye082e7c2019-09-13 20:40:54 +0100512 return hash(self.__forward_arg__)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700513
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700514 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000515 return f'ForwardRef({self.__forward_arg__!r})'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700516
517
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100518class TypeVar(_Final, _Immutable, _root=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700519 """Type variable.
520
521 Usage::
522
523 T = TypeVar('T') # Can be anything
524 A = TypeVar('A', str, bytes) # Must be str or bytes
525
526 Type variables exist primarily for the benefit of static type
527 checkers. They serve as the parameters for generic types as well
528 as for generic function definitions. See class Generic for more
529 information on generic types. Generic functions work as follows:
530
Guido van Rossumb24569a2016-11-20 18:01:29 -0800531 def repeat(x: T, n: int) -> List[T]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700532 '''Return a list containing n references to x.'''
533 return [x]*n
534
535 def longest(x: A, y: A) -> A:
536 '''Return the longest of two strings.'''
537 return x if len(x) >= len(y) else y
538
539 The latter example's signature is essentially the overloading
540 of (str, str) -> str and (bytes, bytes) -> bytes. Also note
541 that if the arguments are instances of some subclass of str,
542 the return type is still plain str.
543
Guido van Rossumb24569a2016-11-20 18:01:29 -0800544 At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700545
Guido van Rossumefa798d2016-08-23 11:01:50 -0700546 Type variables defined with covariant=True or contravariant=True
João D. Ferreira86bfed32018-07-07 16:41:20 +0100547 can be used to declare covariant or contravariant generic types.
Guido van Rossumefa798d2016-08-23 11:01:50 -0700548 See PEP 484 for more details. By default generic types are invariant
549 in all type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700550
551 Type variables can be introspected. e.g.:
552
553 T.__name__ == 'T'
554 T.__constraints__ == ()
555 T.__covariant__ == False
556 T.__contravariant__ = False
557 A.__constraints__ == (str, bytes)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100558
559 Note that only type variables defined in global scope can be pickled.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700560 """
561
Guido van Rossum4cefe742016-09-27 15:20:12 -0700562 __slots__ = ('__name__', '__bound__', '__constraints__',
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300563 '__covariant__', '__contravariant__', '__dict__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700564
565 def __init__(self, name, *constraints, bound=None,
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800566 covariant=False, contravariant=False):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700567 self.__name__ = name
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700568 if covariant and contravariant:
Guido van Rossumefa798d2016-08-23 11:01:50 -0700569 raise ValueError("Bivariant types are not supported.")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700570 self.__covariant__ = bool(covariant)
571 self.__contravariant__ = bool(contravariant)
572 if constraints and bound is not None:
573 raise TypeError("Constraints cannot be combined with bound=...")
574 if constraints and len(constraints) == 1:
575 raise TypeError("A single constraint is not allowed")
576 msg = "TypeVar(name, constraint, ...): constraints must be types."
577 self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
578 if bound:
579 self.__bound__ = _type_check(bound, "Bound must be a type.")
580 else:
581 self.__bound__ = None
HongWeipenga25a04f2020-04-21 04:01:53 +0800582 try:
583 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling
584 except (AttributeError, ValueError):
585 def_mod = None
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300586 if def_mod != 'typing':
587 self.__module__ = def_mod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700588
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700589 def __repr__(self):
590 if self.__covariant__:
591 prefix = '+'
592 elif self.__contravariant__:
593 prefix = '-'
594 else:
595 prefix = '~'
596 return prefix + self.__name__
597
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100598 def __reduce__(self):
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300599 return self.__name__
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100600
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700601
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000602def _is_dunder(attr):
603 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800604
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300605class _BaseGenericAlias(_Final, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000606 """The central part of internal API.
607
608 This represents a generic version of type 'origin' with type arguments 'params'.
609 There are two kind of these aliases: user defined and special. The special ones
610 are wrappers around builtin collections and ABCs in collections.abc. These must
611 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
612 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700613 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300614 def __init__(self, origin, *, inst=True, name=None):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000615 self._inst = inst
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000616 self._name = name
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700617 self.__origin__ = origin
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000618 self.__slots__ = None # This is not documented.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300619
620 def __call__(self, *args, **kwargs):
621 if not self._inst:
622 raise TypeError(f"Type {self._name} cannot be instantiated; "
623 f"use {self.__origin__.__name__}() instead")
624 result = self.__origin__(*args, **kwargs)
625 try:
626 result.__orig_class__ = self
627 except AttributeError:
628 pass
629 return result
630
631 def __mro_entries__(self, bases):
632 res = []
633 if self.__origin__ not in bases:
634 res.append(self.__origin__)
635 i = bases.index(self)
636 for b in bases[i+1:]:
637 if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
638 break
639 else:
640 res.append(Generic)
641 return tuple(res)
642
643 def __getattr__(self, attr):
644 # We are careful for copy and pickle.
645 # Also for simplicity we just don't relay all dunder names
646 if '__origin__' in self.__dict__ and not _is_dunder(attr):
647 return getattr(self.__origin__, attr)
648 raise AttributeError(attr)
649
650 def __setattr__(self, attr, val):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300651 if _is_dunder(attr) or attr in ('_name', '_inst', '_nparams'):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300652 super().__setattr__(attr, val)
653 else:
654 setattr(self.__origin__, attr, val)
655
656 def __instancecheck__(self, obj):
657 return self.__subclasscheck__(type(obj))
658
659 def __subclasscheck__(self, cls):
660 raise TypeError("Subscripted generics cannot be used with"
661 " class and instance checks")
662
663
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300664# Special typing constructs Union, Optional, Generic, Callable and Tuple
665# use three special attributes for internal bookkeeping of generic types:
666# * __parameters__ is a tuple of unique free type parameters of a generic
667# type, for example, Dict[T, T].__parameters__ == (T,);
668# * __origin__ keeps a reference to a type that was subscripted,
669# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
670# the type.
671# * __args__ is a tuple of all arguments used in subscripting,
672# e.g., Dict[T, int].__args__ == (T, int).
673
674
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300675class _GenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300676 def __init__(self, origin, params, *, inst=True, name=None):
677 super().__init__(origin, inst=inst, name=name)
678 if not isinstance(params, tuple):
679 params = (params,)
680 self.__args__ = tuple(... if a is _TypingEllipsis else
681 () if a is _TypingEmpty else
682 a for a in params)
683 self.__parameters__ = _collect_type_vars(params)
684 if not name:
685 self.__module__ = origin.__module__
686
687 def __eq__(self, other):
688 if not isinstance(other, _GenericAlias):
689 return NotImplemented
690 return (self.__origin__ == other.__origin__
691 and self.__args__ == other.__args__)
692
693 def __hash__(self):
694 return hash((self.__origin__, self.__args__))
695
Guido van Rossum4cefe742016-09-27 15:20:12 -0700696 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700697 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100698 if self.__origin__ in (Generic, Protocol):
699 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000700 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700701 if not isinstance(params, tuple):
702 params = (params,)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700703 msg = "Parameters to generic types must be types."
704 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300705 _check_generic(self, params, len(self.__parameters__))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300706
707 subst = dict(zip(self.__parameters__, params))
708 new_args = []
709 for arg in self.__args__:
710 if isinstance(arg, TypeVar):
711 arg = subst[arg]
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300712 elif isinstance(arg, (_GenericAlias, GenericAlias)):
Serhiy Storchaka0122d482020-05-10 13:39:40 +0300713 subparams = arg.__parameters__
714 if subparams:
715 subargs = tuple(subst[x] for x in subparams)
716 arg = arg[subargs]
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300717 new_args.append(arg)
718 return self.copy_with(tuple(new_args))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100719
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000720 def copy_with(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300721 return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700722
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000723 def __repr__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300724 if self._name:
725 name = 'typing.' + self._name
726 else:
727 name = _type_repr(self.__origin__)
728 args = ", ".join([_type_repr(a) for a in self.__args__])
729 return f'{name}[{args}]'
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000730
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300731 def __reduce__(self):
732 if self._name:
733 origin = globals()[self._name]
734 else:
735 origin = self.__origin__
736 args = tuple(self.__args__)
737 if len(args) == 1 and not isinstance(args[0], tuple):
738 args, = args
739 return operator.getitem, (origin, args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000740
741 def __mro_entries__(self, bases):
742 if self._name: # generic version of an ABC or built-in class
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300743 return super().__mro_entries__(bases)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000744 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100745 if Protocol in bases:
746 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000747 i = bases.index(self)
748 for b in bases[i+1:]:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300749 if isinstance(b, _BaseGenericAlias) and b is not self:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000750 return ()
751 return (self.__origin__,)
752
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000753
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300754# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
755# 1 for List and 2 for Dict. It may be -1 if variable number of
756# parameters are accepted (needs custom __getitem__).
757
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300758class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300759 def __init__(self, origin, nparams, *, inst=True, name=None):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300760 if name is None:
761 name = origin.__name__
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300762 super().__init__(origin, inst=inst, name=name)
763 self._nparams = nparams
Serhiy Storchaka2fbc57a2020-05-10 15:14:27 +0300764 if origin.__module__ == 'builtins':
765 self.__doc__ = f'A generic version of {origin.__qualname__}.'
766 else:
767 self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000768
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300769 @_tp_cache
770 def __getitem__(self, params):
771 if not isinstance(params, tuple):
772 params = (params,)
773 msg = "Parameters to generic types must be types."
774 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300775 _check_generic(self, params, self._nparams)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300776 return self.copy_with(params)
777
778 def copy_with(self, params):
779 return _GenericAlias(self.__origin__, params,
780 name=self._name, inst=self._inst)
781
782 def __repr__(self):
783 return 'typing.' + self._name
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000784
785 def __subclasscheck__(self, cls):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300786 if isinstance(cls, _SpecialGenericAlias):
787 return issubclass(cls.__origin__, self.__origin__)
788 if not isinstance(cls, _GenericAlias):
789 return issubclass(cls, self.__origin__)
790 return super().__subclasscheck__(cls)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700791
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100792 def __reduce__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300793 return self._name
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100794
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700795
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300796class _CallableGenericAlias(_GenericAlias, _root=True):
797 def __repr__(self):
798 assert self._name == 'Callable'
799 if len(self.__args__) == 2 and self.__args__[0] is Ellipsis:
800 return super().__repr__()
801 return (f'typing.Callable'
802 f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], '
803 f'{_type_repr(self.__args__[-1])}]')
804
805 def __reduce__(self):
806 args = self.__args__
807 if not (len(args) == 2 and args[0] is ...):
808 args = list(args[:-1]), args[-1]
809 return operator.getitem, (Callable, args)
810
811
812class _CallableType(_SpecialGenericAlias, _root=True):
813 def copy_with(self, params):
814 return _CallableGenericAlias(self.__origin__, params,
815 name=self._name, inst=self._inst)
816
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000817 def __getitem__(self, params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000818 if not isinstance(params, tuple) or len(params) != 2:
819 raise TypeError("Callable must be used as "
820 "Callable[[arg, ...], result].")
821 args, result = params
822 if args is Ellipsis:
823 params = (Ellipsis, result)
824 else:
825 if not isinstance(args, list):
826 raise TypeError(f"Callable[args, result]: args must be a list."
827 f" Got {args}")
828 params = (tuple(args), result)
829 return self.__getitem_inner__(params)
830
831 @_tp_cache
832 def __getitem_inner__(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300833 args, result = params
834 msg = "Callable[args, result]: result must be a type."
835 result = _type_check(result, msg)
836 if args is Ellipsis:
837 return self.copy_with((_TypingEllipsis, result))
838 msg = "Callable[[arg, ...], result]: each arg must be a type."
839 args = tuple(_type_check(arg, msg) for arg in args)
840 params = args + (result,)
841 return self.copy_with(params)
842
843
844class _TupleType(_SpecialGenericAlias, _root=True):
845 @_tp_cache
846 def __getitem__(self, params):
847 if params == ():
848 return self.copy_with((_TypingEmpty,))
849 if not isinstance(params, tuple):
850 params = (params,)
851 if len(params) == 2 and params[1] is ...:
852 msg = "Tuple[t, ...]: t must be a type."
853 p = _type_check(params[0], msg)
854 return self.copy_with((p, _TypingEllipsis))
855 msg = "Tuple[t0, t1, ...]: each t must be a type."
856 params = tuple(_type_check(p, msg) for p in params)
857 return self.copy_with(params)
858
859
860class _UnionGenericAlias(_GenericAlias, _root=True):
861 def copy_with(self, params):
862 return Union[params]
863
864 def __eq__(self, other):
865 if not isinstance(other, _UnionGenericAlias):
866 return NotImplemented
867 return set(self.__args__) == set(other.__args__)
868
869 def __hash__(self):
870 return hash(frozenset(self.__args__))
871
872 def __repr__(self):
873 args = self.__args__
874 if len(args) == 2:
875 if args[0] is type(None):
876 return f'typing.Optional[{_type_repr(args[1])}]'
877 elif args[1] is type(None):
878 return f'typing.Optional[{_type_repr(args[0])}]'
879 return super().__repr__()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000880
881
882class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700883 """Abstract base class for generic types.
884
Guido van Rossumb24569a2016-11-20 18:01:29 -0800885 A generic type is typically declared by inheriting from
886 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700887 For example, a generic mapping type might be defined as::
888
889 class Mapping(Generic[KT, VT]):
890 def __getitem__(self, key: KT) -> VT:
891 ...
892 # Etc.
893
894 This class can then be used as follows::
895
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700896 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700897 try:
898 return mapping[key]
899 except KeyError:
900 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700901 """
Guido van Rossumd70fe632015-08-05 12:11:06 +0200902 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100903 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +0200904
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000905 @_tp_cache
906 def __class_getitem__(cls, params):
907 if not isinstance(params, tuple):
908 params = (params,)
909 if not params and cls is not Tuple:
910 raise TypeError(
911 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
912 msg = "Parameters to generic types must be types."
913 params = tuple(_type_check(p, msg) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100914 if cls in (Generic, Protocol):
915 # Generic and Protocol can only be subscripted with unique type variables.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000916 if not all(isinstance(p, TypeVar) for p in params):
917 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100918 f"Parameters to {cls.__name__}[...] must all be type variables")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000919 if len(set(params)) != len(params):
920 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100921 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000922 else:
923 # Subscripting a regular Generic subclass.
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300924 _check_generic(cls, params, len(cls.__parameters__))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000925 return _GenericAlias(cls, params)
926
927 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +0100928 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000929 tvars = []
930 if '__orig_bases__' in cls.__dict__:
931 error = Generic in cls.__orig_bases__
932 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100933 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000934 if error:
935 raise TypeError("Cannot inherit from plain Generic")
936 if '__orig_bases__' in cls.__dict__:
937 tvars = _collect_type_vars(cls.__orig_bases__)
938 # Look for Generic[T1, ..., Tn].
939 # If found, tvars must be a subset of it.
940 # If not found, tvars is it.
941 # Also check for and reject plain Generic,
942 # and reject multiple Generic[...].
943 gvars = None
944 for base in cls.__orig_bases__:
945 if (isinstance(base, _GenericAlias) and
946 base.__origin__ is Generic):
947 if gvars is not None:
948 raise TypeError(
949 "Cannot inherit from Generic[...] multiple types.")
950 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100951 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000952 tvarset = set(tvars)
953 gvarset = set(gvars)
954 if not tvarset <= gvarset:
955 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
956 s_args = ', '.join(str(g) for g in gvars)
957 raise TypeError(f"Some type variables ({s_vars}) are"
958 f" not listed in Generic[{s_args}]")
959 tvars = gvars
960 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700961
962
963class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -0800964 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
965 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700966 to sneak in where prohibited.
967 """
968
969
970class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -0800971 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700972
973
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100974_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
975 '_is_protocol', '_is_runtime_protocol']
976
977_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
978 '__init__', '__module__', '__new__', '__slots__',
Guido van Rossum48b069a2020-04-07 09:50:06 -0700979 '__subclasshook__', '__weakref__', '__class_getitem__']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100980
981# These special attributes will be not collected as protocol members.
982EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
983
984
985def _get_protocol_attrs(cls):
986 """Collect protocol members from a protocol class objects.
987
988 This includes names actually defined in the class dictionary, as well
989 as names that appear in annotations. Special names (above) are skipped.
990 """
991 attrs = set()
992 for base in cls.__mro__[:-1]: # without object
993 if base.__name__ in ('Protocol', 'Generic'):
994 continue
995 annotations = getattr(base, '__annotations__', {})
996 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
997 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
998 attrs.add(attr)
999 return attrs
1000
1001
1002def _is_callable_members_only(cls):
1003 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
1004 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
1005
1006
1007def _no_init(self, *args, **kwargs):
1008 if type(self)._is_protocol:
1009 raise TypeError('Protocols cannot be instantiated')
1010
1011
1012def _allow_reckless_class_cheks():
Nickolena Fishercfaf4c02020-04-26 12:49:11 -05001013 """Allow instance and class checks for special stdlib modules.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001014
1015 The abc and functools modules indiscriminately call isinstance() and
1016 issubclass() on the whole MRO of a user class, which may contain protocols.
1017 """
1018 try:
1019 return sys._getframe(3).f_globals['__name__'] in ['abc', 'functools']
1020 except (AttributeError, ValueError): # For platforms without _getframe().
1021 return True
1022
1023
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001024_PROTO_WHITELIST = {
1025 'collections.abc': [
1026 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
1027 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
1028 ],
1029 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1030}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001031
1032
1033class _ProtocolMeta(ABCMeta):
1034 # This metaclass is really unfortunate and exists only because of
1035 # the lack of __instancehook__.
1036 def __instancecheck__(cls, instance):
1037 # We need this method for situations where attributes are
1038 # assigned in __init__.
1039 if ((not getattr(cls, '_is_protocol', False) or
1040 _is_callable_members_only(cls)) and
1041 issubclass(instance.__class__, cls)):
1042 return True
1043 if cls._is_protocol:
1044 if all(hasattr(instance, attr) and
1045 # All *methods* can be blocked by setting them to None.
1046 (not callable(getattr(cls, attr, None)) or
1047 getattr(instance, attr) is not None)
1048 for attr in _get_protocol_attrs(cls)):
1049 return True
1050 return super().__instancecheck__(instance)
1051
1052
1053class Protocol(Generic, metaclass=_ProtocolMeta):
1054 """Base class for protocol classes.
1055
1056 Protocol classes are defined as::
1057
1058 class Proto(Protocol):
1059 def meth(self) -> int:
1060 ...
1061
1062 Such classes are primarily used with static type checkers that recognize
1063 structural subtyping (static duck-typing), for example::
1064
1065 class C:
1066 def meth(self) -> int:
1067 return 0
1068
1069 def func(x: Proto) -> int:
1070 return x.meth()
1071
1072 func(C()) # Passes static type check
1073
1074 See PEP 544 for details. Protocol classes decorated with
1075 @typing.runtime_checkable act as simple-minded runtime protocols that check
1076 only the presence of given attributes, ignoring their type signatures.
1077 Protocol classes can be generic, they are defined as::
1078
1079 class GenProto(Protocol[T]):
1080 def meth(self) -> T:
1081 ...
1082 """
1083 __slots__ = ()
1084 _is_protocol = True
1085 _is_runtime_protocol = False
1086
1087 def __init_subclass__(cls, *args, **kwargs):
1088 super().__init_subclass__(*args, **kwargs)
1089
1090 # Determine if this is a protocol or a concrete subclass.
1091 if not cls.__dict__.get('_is_protocol', False):
1092 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1093
1094 # Set (or override) the protocol subclass hook.
1095 def _proto_hook(other):
1096 if not cls.__dict__.get('_is_protocol', False):
1097 return NotImplemented
1098
1099 # First, perform various sanity checks.
1100 if not getattr(cls, '_is_runtime_protocol', False):
1101 if _allow_reckless_class_cheks():
1102 return NotImplemented
1103 raise TypeError("Instance and class checks can only be used with"
1104 " @runtime_checkable protocols")
1105 if not _is_callable_members_only(cls):
1106 if _allow_reckless_class_cheks():
1107 return NotImplemented
1108 raise TypeError("Protocols with non-method members"
1109 " don't support issubclass()")
1110 if not isinstance(other, type):
1111 # Same error message as for issubclass(1, int).
1112 raise TypeError('issubclass() arg 1 must be a class')
1113
1114 # Second, perform the actual structural compatibility check.
1115 for attr in _get_protocol_attrs(cls):
1116 for base in other.__mro__:
1117 # Check if the members appears in the class dictionary...
1118 if attr in base.__dict__:
1119 if base.__dict__[attr] is None:
1120 return NotImplemented
1121 break
1122
1123 # ...or in annotations, if it is a sub-protocol.
1124 annotations = getattr(base, '__annotations__', {})
1125 if (isinstance(annotations, collections.abc.Mapping) and
1126 attr in annotations and
1127 issubclass(other, Generic) and other._is_protocol):
1128 break
1129 else:
1130 return NotImplemented
1131 return True
1132
1133 if '__subclasshook__' not in cls.__dict__:
1134 cls.__subclasshook__ = _proto_hook
1135
1136 # We have nothing more to do for non-protocols...
1137 if not cls._is_protocol:
1138 return
1139
1140 # ... otherwise check consistency of bases, and prohibit instantiation.
1141 for base in cls.__bases__:
1142 if not (base in (object, Generic) or
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001143 base.__module__ in _PROTO_WHITELIST and
1144 base.__name__ in _PROTO_WHITELIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001145 issubclass(base, Generic) and base._is_protocol):
1146 raise TypeError('Protocols can only inherit from other'
1147 ' protocols, got %r' % base)
1148 cls.__init__ = _no_init
1149
1150
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001151class _AnnotatedAlias(_GenericAlias, _root=True):
1152 """Runtime representation of an annotated type.
1153
1154 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1155 with extra annotations. The alias behaves like a normal typing alias,
1156 instantiating is the same as instantiating the underlying type, binding
1157 it to types is also the same.
1158 """
1159 def __init__(self, origin, metadata):
1160 if isinstance(origin, _AnnotatedAlias):
1161 metadata = origin.__metadata__ + metadata
1162 origin = origin.__origin__
1163 super().__init__(origin, origin)
1164 self.__metadata__ = metadata
1165
1166 def copy_with(self, params):
1167 assert len(params) == 1
1168 new_type = params[0]
1169 return _AnnotatedAlias(new_type, self.__metadata__)
1170
1171 def __repr__(self):
1172 return "typing.Annotated[{}, {}]".format(
1173 _type_repr(self.__origin__),
1174 ", ".join(repr(a) for a in self.__metadata__)
1175 )
1176
1177 def __reduce__(self):
1178 return operator.getitem, (
1179 Annotated, (self.__origin__,) + self.__metadata__
1180 )
1181
1182 def __eq__(self, other):
1183 if not isinstance(other, _AnnotatedAlias):
1184 return NotImplemented
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001185 return (self.__origin__ == other.__origin__
1186 and self.__metadata__ == other.__metadata__)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001187
1188 def __hash__(self):
1189 return hash((self.__origin__, self.__metadata__))
1190
1191
1192class Annotated:
1193 """Add context specific metadata to a type.
1194
1195 Example: Annotated[int, runtime_check.Unsigned] indicates to the
1196 hypothetical runtime_check module that this type is an unsigned int.
1197 Every other consumer of this type can ignore this metadata and treat
1198 this type as int.
1199
1200 The first argument to Annotated must be a valid type.
1201
1202 Details:
1203
1204 - It's an error to call `Annotated` with less than two arguments.
1205 - Nested Annotated are flattened::
1206
1207 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1208
1209 - Instantiating an annotated type is equivalent to instantiating the
1210 underlying type::
1211
1212 Annotated[C, Ann1](5) == C(5)
1213
1214 - Annotated can be used as a generic type alias::
1215
1216 Optimized = Annotated[T, runtime.Optimize()]
1217 Optimized[int] == Annotated[int, runtime.Optimize()]
1218
1219 OptimizedList = Annotated[List[T], runtime.Optimize()]
1220 OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1221 """
1222
1223 __slots__ = ()
1224
1225 def __new__(cls, *args, **kwargs):
1226 raise TypeError("Type Annotated cannot be instantiated.")
1227
1228 @_tp_cache
1229 def __class_getitem__(cls, params):
1230 if not isinstance(params, tuple) or len(params) < 2:
1231 raise TypeError("Annotated[...] should be used "
1232 "with at least two arguments (a type and an "
1233 "annotation).")
1234 msg = "Annotated[t, ...]: t must be a type."
1235 origin = _type_check(params[0], msg)
1236 metadata = tuple(params[1:])
1237 return _AnnotatedAlias(origin, metadata)
1238
1239 def __init_subclass__(cls, *args, **kwargs):
1240 raise TypeError(
1241 "Cannot subclass {}.Annotated".format(cls.__module__)
1242 )
1243
1244
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001245def runtime_checkable(cls):
1246 """Mark a protocol class as a runtime protocol.
1247
1248 Such protocol can be used with isinstance() and issubclass().
1249 Raise TypeError if applied to a non-protocol class.
1250 This allows a simple-minded structural check very similar to
1251 one trick ponies in collections.abc such as Iterable.
1252 For example::
1253
1254 @runtime_checkable
1255 class Closable(Protocol):
1256 def close(self): ...
1257
1258 assert isinstance(open('/some/file'), Closable)
1259
1260 Warning: this will check only the presence of the required methods,
1261 not their type signatures!
1262 """
1263 if not issubclass(cls, Generic) or not cls._is_protocol:
1264 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1265 ' got %r' % cls)
1266 cls._is_runtime_protocol = True
1267 return cls
1268
1269
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001270def cast(typ, val):
1271 """Cast a value to a type.
1272
1273 This returns the value unchanged. To the type checker this
1274 signals that the return value has the designated type, but at
1275 runtime we intentionally don't check anything (we want this
1276 to be as fast as possible).
1277 """
1278 return val
1279
1280
1281def _get_defaults(func):
1282 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001283 try:
1284 code = func.__code__
1285 except AttributeError:
1286 # Some built-in functions don't have __code__, __defaults__, etc.
1287 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001288 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001289 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001290 arg_names = arg_names[:pos_count]
1291 defaults = func.__defaults__ or ()
1292 kwdefaults = func.__kwdefaults__
1293 res = dict(kwdefaults) if kwdefaults else {}
1294 pos_offset = pos_count - len(defaults)
1295 for name, value in zip(arg_names[pos_offset:], defaults):
1296 assert name not in res
1297 res[name] = value
1298 return res
1299
1300
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001301_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1302 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001303 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001304
1305
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001306def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001307 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001308
Guido van Rossum991d14f2016-11-09 13:12:51 -08001309 This is often the same as obj.__annotations__, but it handles
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001310 forward references encoded as string literals, adds Optional[t] if a
1311 default value equal to None is set and recursively replaces all
1312 'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001313
Guido van Rossum991d14f2016-11-09 13:12:51 -08001314 The argument may be a module, class, method, or function. The annotations
1315 are returned as a dictionary. For classes, annotations include also
1316 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001317
Guido van Rossum991d14f2016-11-09 13:12:51 -08001318 TypeError is raised if the argument is not of a type that can contain
1319 annotations, and an empty dictionary is returned if no annotations are
1320 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001321
Guido van Rossum991d14f2016-11-09 13:12:51 -08001322 BEWARE -- the behavior of globalns and localns is counterintuitive
1323 (unless you are familiar with how eval() and exec() work). The
1324 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001325
Guido van Rossum991d14f2016-11-09 13:12:51 -08001326 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001327 globals from obj (or the respective module's globals for classes),
1328 and these are also used as the locals. If the object does not appear
1329 to have globals, an empty dictionary is used.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001330
Guido van Rossum991d14f2016-11-09 13:12:51 -08001331 - If one dict argument is passed, it is used for both globals and
1332 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001333
Guido van Rossum991d14f2016-11-09 13:12:51 -08001334 - If two dict arguments are passed, they specify globals and
1335 locals, respectively.
1336 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001337
Guido van Rossum991d14f2016-11-09 13:12:51 -08001338 if getattr(obj, '__no_type_check__', None):
1339 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001340 # Classes require a special treatment.
1341 if isinstance(obj, type):
1342 hints = {}
1343 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001344 if globalns is None:
1345 base_globals = sys.modules[base.__module__].__dict__
1346 else:
1347 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001348 ann = base.__dict__.get('__annotations__', {})
1349 for name, value in ann.items():
1350 if value is None:
1351 value = type(None)
1352 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001353 value = ForwardRef(value, is_argument=False)
Łukasz Langaf350a262017-09-14 14:33:00 -04001354 value = _eval_type(value, base_globals, localns)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001355 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001356 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001357
1358 if globalns is None:
1359 if isinstance(obj, types.ModuleType):
1360 globalns = obj.__dict__
1361 else:
benedwards140aca3a32019-11-21 17:24:58 +00001362 nsobj = obj
1363 # Find globalns for the unwrapped object.
1364 while hasattr(nsobj, '__wrapped__'):
1365 nsobj = nsobj.__wrapped__
1366 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001367 if localns is None:
1368 localns = globalns
1369 elif localns is None:
1370 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001371 hints = getattr(obj, '__annotations__', None)
1372 if hints is None:
1373 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001374 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001375 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001376 else:
1377 raise TypeError('{!r} is not a module, class, method, '
1378 'or function.'.format(obj))
1379 defaults = _get_defaults(obj)
1380 hints = dict(hints)
1381 for name, value in hints.items():
1382 if value is None:
1383 value = type(None)
1384 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001385 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001386 value = _eval_type(value, globalns, localns)
1387 if name in defaults and defaults[name] is None:
1388 value = Optional[value]
1389 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001390 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1391
1392
1393def _strip_annotations(t):
1394 """Strips the annotations from a given type.
1395 """
1396 if isinstance(t, _AnnotatedAlias):
1397 return _strip_annotations(t.__origin__)
1398 if isinstance(t, _GenericAlias):
1399 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1400 if stripped_args == t.__args__:
1401 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001402 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001403 if isinstance(t, GenericAlias):
1404 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1405 if stripped_args == t.__args__:
1406 return t
1407 return GenericAlias(t.__origin__, stripped_args)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001408 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001409
1410
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001411def get_origin(tp):
1412 """Get the unsubscripted version of a type.
1413
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001414 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1415 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001416
1417 get_origin(Literal[42]) is Literal
1418 get_origin(int) is None
1419 get_origin(ClassVar[int]) is ClassVar
1420 get_origin(Generic) is Generic
1421 get_origin(Generic[T]) is Generic
1422 get_origin(Union[T, int]) is Union
1423 get_origin(List[Tuple[T, T]][int]) == list
1424 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001425 if isinstance(tp, _AnnotatedAlias):
1426 return Annotated
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001427 if isinstance(tp, (_BaseGenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001428 return tp.__origin__
1429 if tp is Generic:
1430 return Generic
1431 return None
1432
1433
1434def get_args(tp):
1435 """Get type arguments with all substitutions performed.
1436
1437 For unions, basic simplifications used by Union constructor are performed.
1438 Examples::
1439 get_args(Dict[str, int]) == (str, int)
1440 get_args(int) == ()
1441 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1442 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1443 get_args(Callable[[], T][int]) == ([], int)
1444 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001445 if isinstance(tp, _AnnotatedAlias):
1446 return (tp.__origin__,) + tp.__metadata__
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001447 if isinstance(tp, _GenericAlias):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001448 res = tp.__args__
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001449 if tp.__origin__ is collections.abc.Callable and res[0] is not Ellipsis:
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001450 res = (list(res[:-1]), res[-1])
1451 return res
Serhiy Storchaka6292be72020-04-27 10:27:21 +03001452 if isinstance(tp, GenericAlias):
1453 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001454 return ()
1455
1456
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001457def no_type_check(arg):
1458 """Decorator to indicate that annotations are not type hints.
1459
1460 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001461 applies recursively to all methods and classes defined in that class
1462 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001463
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001464 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001465 """
1466 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001467 arg_attrs = arg.__dict__.copy()
1468 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001469 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001470 arg_attrs.pop(attr)
1471 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001472 if isinstance(obj, types.FunctionType):
1473 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001474 if isinstance(obj, type):
1475 no_type_check(obj)
1476 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001477 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001478 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001479 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001480 return arg
1481
1482
1483def no_type_check_decorator(decorator):
1484 """Decorator to give another decorator the @no_type_check effect.
1485
1486 This wraps the decorator with something that wraps the decorated
1487 function in @no_type_check.
1488 """
1489
1490 @functools.wraps(decorator)
1491 def wrapped_decorator(*args, **kwds):
1492 func = decorator(*args, **kwds)
1493 func = no_type_check(func)
1494 return func
1495
1496 return wrapped_decorator
1497
1498
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001499def _overload_dummy(*args, **kwds):
1500 """Helper for @overload to raise when called."""
1501 raise NotImplementedError(
1502 "You should not call an overloaded function. "
1503 "A series of @overload-decorated functions "
1504 "outside a stub module should always be followed "
1505 "by an implementation that is not @overload-ed.")
1506
1507
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001508def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001509 """Decorator for overloaded functions/methods.
1510
1511 In a stub file, place two or more stub definitions for the same
1512 function in a row, each decorated with @overload. For example:
1513
1514 @overload
1515 def utf8(value: None) -> None: ...
1516 @overload
1517 def utf8(value: bytes) -> bytes: ...
1518 @overload
1519 def utf8(value: str) -> bytes: ...
1520
1521 In a non-stub file (i.e. a regular .py file), do the same but
1522 follow it with an implementation. The implementation should *not*
1523 be decorated with @overload. For example:
1524
1525 @overload
1526 def utf8(value: None) -> None: ...
1527 @overload
1528 def utf8(value: bytes) -> bytes: ...
1529 @overload
1530 def utf8(value: str) -> bytes: ...
1531 def utf8(value):
1532 # implementation goes here
1533 """
1534 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001535
1536
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001537def final(f):
1538 """A decorator to indicate final methods and final classes.
1539
1540 Use this decorator to indicate to type checkers that the decorated
1541 method cannot be overridden, and decorated class cannot be subclassed.
1542 For example:
1543
1544 class Base:
1545 @final
1546 def done(self) -> None:
1547 ...
1548 class Sub(Base):
1549 def done(self) -> None: # Error reported by type checker
1550 ...
1551
1552 @final
1553 class Leaf:
1554 ...
1555 class Other(Leaf): # Error reported by type checker
1556 ...
1557
1558 There is no runtime checking of these properties.
1559 """
1560 return f
1561
1562
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001563# Some unconstrained type variables. These are used by the container types.
1564# (These are not for export.)
1565T = TypeVar('T') # Any type.
1566KT = TypeVar('KT') # Key type.
1567VT = TypeVar('VT') # Value type.
1568T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
1569V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
1570VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
1571T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
1572# Internal type variable used for Type[].
1573CT_co = TypeVar('CT_co', covariant=True, bound=type)
1574
1575# A useful type variable with constraints. This represents string types.
1576# (This one *is* for export!)
1577AnyStr = TypeVar('AnyStr', bytes, str)
1578
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001579
1580# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001581_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001582
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001583Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
1584Awaitable = _alias(collections.abc.Awaitable, 1)
1585Coroutine = _alias(collections.abc.Coroutine, 3)
1586AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
1587AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
1588Iterable = _alias(collections.abc.Iterable, 1)
1589Iterator = _alias(collections.abc.Iterator, 1)
1590Reversible = _alias(collections.abc.Reversible, 1)
1591Sized = _alias(collections.abc.Sized, 0) # Not generic.
1592Container = _alias(collections.abc.Container, 1)
1593Collection = _alias(collections.abc.Collection, 1)
1594Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001595Callable.__doc__ = \
1596 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001597
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001598 The subscription syntax must always be used with exactly two
1599 values: the argument list and the return type. The argument list
1600 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001601
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001602 There is no syntax to indicate optional or keyword arguments,
1603 such function types are rarely used as callback types.
1604 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001605AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
1606MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001607# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001608Mapping = _alias(collections.abc.Mapping, 2)
1609MutableMapping = _alias(collections.abc.MutableMapping, 2)
1610Sequence = _alias(collections.abc.Sequence, 1)
1611MutableSequence = _alias(collections.abc.MutableSequence, 1)
1612ByteString = _alias(collections.abc.ByteString, 0) # Not generic
1613# Tuple accepts variable number of parameters.
1614Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001615Tuple.__doc__ = \
1616 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001617
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001618 Example: Tuple[T1, T2] is a tuple of two elements corresponding
1619 to type variables T1 and T2. Tuple[int, float, str] is a tuple
1620 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001621
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001622 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
1623 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001624List = _alias(list, 1, inst=False, name='List')
1625Deque = _alias(collections.deque, 1, name='Deque')
1626Set = _alias(set, 1, inst=False, name='Set')
1627FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
1628MappingView = _alias(collections.abc.MappingView, 1)
1629KeysView = _alias(collections.abc.KeysView, 1)
1630ItemsView = _alias(collections.abc.ItemsView, 2)
1631ValuesView = _alias(collections.abc.ValuesView, 1)
1632ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
1633AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
1634Dict = _alias(dict, 2, inst=False, name='Dict')
1635DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
1636OrderedDict = _alias(collections.OrderedDict, 2)
1637Counter = _alias(collections.Counter, 1)
1638ChainMap = _alias(collections.ChainMap, 2)
1639Generator = _alias(collections.abc.Generator, 3)
1640AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
1641Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001642Type.__doc__ = \
1643 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001644
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001645 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001646
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001647 class User: ... # Abstract base for User classes
1648 class BasicUser(User): ...
1649 class ProUser(User): ...
1650 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08001651
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001652 And a function that takes a class argument that's a subclass of
1653 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08001654
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001655 U = TypeVar('U', bound=User)
1656 def new_user(user_class: Type[U]) -> U:
1657 user = user_class()
1658 # (Here we could write the user object to a database)
1659 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08001660
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001661 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08001662
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001663 At this point the type checker knows that joe has type BasicUser.
1664 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001665
1666
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001667@runtime_checkable
1668class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001669 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001670 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001671
1672 @abstractmethod
1673 def __int__(self) -> int:
1674 pass
1675
1676
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001677@runtime_checkable
1678class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001679 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001680 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001681
1682 @abstractmethod
1683 def __float__(self) -> float:
1684 pass
1685
1686
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001687@runtime_checkable
1688class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001689 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001690 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001691
1692 @abstractmethod
1693 def __complex__(self) -> complex:
1694 pass
1695
1696
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001697@runtime_checkable
1698class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001699 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001700 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001701
1702 @abstractmethod
1703 def __bytes__(self) -> bytes:
1704 pass
1705
1706
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001707@runtime_checkable
1708class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001709 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07001710 __slots__ = ()
1711
1712 @abstractmethod
1713 def __index__(self) -> int:
1714 pass
1715
1716
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001717@runtime_checkable
1718class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001719 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001720 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001721
1722 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02001723 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001724 pass
1725
1726
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001727@runtime_checkable
1728class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001729 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001730 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001731
1732 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02001733 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001734 pass
1735
1736
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001737def _make_nmtuple(name, types, module, defaults = ()):
1738 fields = [n for n, t in types]
1739 types = {n: _type_check(t, f"field {n} annotation must be a type")
1740 for n, t in types}
1741 nm_tpl = collections.namedtuple(name, fields,
1742 defaults=defaults, module=module)
1743 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001744 return nm_tpl
1745
1746
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001747# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001748_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
1749 '_fields', '_field_defaults',
1750 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001751
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001752_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001753
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001754
Guido van Rossum2f841442016-11-15 09:48:06 -08001755class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001756
Guido van Rossum2f841442016-11-15 09:48:06 -08001757 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001758 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08001759 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001760 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08001761 for field_name in types:
1762 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001763 default_names.append(field_name)
1764 elif default_names:
1765 raise TypeError(f"Non-default namedtuple field {field_name} "
1766 f"cannot follow default field"
1767 f"{'s' if len(default_names) > 1 else ''} "
1768 f"{', '.join(default_names)}")
1769 nm_tpl = _make_nmtuple(typename, types.items(),
1770 defaults=[ns[n] for n in default_names],
1771 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08001772 # update from user namespace without overriding special namedtuple attributes
1773 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001774 if key in _prohibited:
1775 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
1776 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08001777 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08001778 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001779
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001780
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001781def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08001782 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001783
Guido van Rossum2f841442016-11-15 09:48:06 -08001784 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001785
Guido van Rossum2f841442016-11-15 09:48:06 -08001786 class Employee(NamedTuple):
1787 name: str
1788 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001789
Guido van Rossum2f841442016-11-15 09:48:06 -08001790 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001791
Guido van Rossum2f841442016-11-15 09:48:06 -08001792 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001793
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07001794 The resulting class has an extra __annotations__ attribute, giving a
1795 dict that maps field names to types. (The field names are also in
1796 the _fields attribute, which is part of the namedtuple API.)
1797 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001798
Guido van Rossum2f841442016-11-15 09:48:06 -08001799 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001800
Guido van Rossum2f841442016-11-15 09:48:06 -08001801 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001802
Guido van Rossum2f841442016-11-15 09:48:06 -08001803 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
1804 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001805 if fields is None:
1806 fields = kwargs.items()
1807 elif kwargs:
1808 raise TypeError("Either list of fields or keywords"
1809 " can be provided to NamedTuple, not both")
1810 try:
1811 module = sys._getframe(1).f_globals.get('__name__', '__main__')
1812 except (AttributeError, ValueError):
1813 module = None
1814 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001815
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001816_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
1817
1818def _namedtuple_mro_entries(bases):
1819 if len(bases) > 1:
1820 raise TypeError("Multiple inheritance with NamedTuple is not supported")
1821 assert bases[0] is NamedTuple
1822 return (_NamedTuple,)
1823
1824NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001825
1826
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001827class _TypedDictMeta(type):
1828 def __new__(cls, name, bases, ns, total=True):
1829 """Create new typed dict class object.
1830
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001831 This method is called when TypedDict is subclassed,
1832 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001833 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001834 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001835 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001836 for base in bases:
1837 if type(base) is not _TypedDictMeta:
1838 raise TypeError('cannot inherit from both a TypedDict type '
1839 'and a non-TypedDict base class')
1840 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001841
Vlad Emelianov10e87e52020-02-13 20:53:29 +01001842 annotations = {}
1843 own_annotations = ns.get('__annotations__', {})
1844 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001845 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01001846 own_annotations = {
1847 n: _type_check(tp, msg) for n, tp in own_annotations.items()
1848 }
1849 required_keys = set()
1850 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11001851
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001852 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01001853 annotations.update(base.__dict__.get('__annotations__', {}))
1854 required_keys.update(base.__dict__.get('__required_keys__', ()))
1855 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11001856
Vlad Emelianov10e87e52020-02-13 20:53:29 +01001857 annotations.update(own_annotations)
1858 if total:
1859 required_keys.update(own_annotation_keys)
1860 else:
1861 optional_keys.update(own_annotation_keys)
1862
1863 tp_dict.__annotations__ = annotations
1864 tp_dict.__required_keys__ = frozenset(required_keys)
1865 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001866 if not hasattr(tp_dict, '__total__'):
1867 tp_dict.__total__ = total
1868 return tp_dict
1869
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001870 __call__ = dict # static method
1871
1872 def __subclasscheck__(cls, other):
1873 # Typed dicts are only for static structural subtyping.
1874 raise TypeError('TypedDict does not support instance and class checks')
1875
1876 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001877
1878
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001879def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001880 """A simple typed namespace. At runtime it is equivalent to a plain dict.
1881
1882 TypedDict creates a dictionary type that expects all of its
1883 instances to have a certain set of keys, where each key is
1884 associated with a value of a consistent type. This expectation
1885 is not checked at runtime but is only enforced by type checkers.
1886 Usage::
1887
1888 class Point2D(TypedDict):
1889 x: int
1890 y: int
1891 label: str
1892
1893 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
1894 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
1895
1896 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
1897
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11001898 The type info can be accessed via the Point2D.__annotations__ dict, and
1899 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
1900 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001901
1902 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
1903 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
1904
ananthan-123ab6423f2020-02-19 10:03:05 +05301905 By default, all keys must be present in a TypedDict. It is possible
1906 to override this by specifying totality.
1907 Usage::
1908
1909 class point2D(TypedDict, total=False):
1910 x: int
1911 y: int
1912
1913 This means that a point2D TypedDict can have any of the keys omitted.A type
1914 checker is only expected to support a literal False or True as the value of
1915 the total argument. True is the default, and makes all items defined in the
1916 class body be required.
1917
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001918 The class syntax is only supported in Python 3.6+, while two other
1919 syntax forms work for Python 2.7 and 3.2+
1920 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001921 if fields is None:
1922 fields = kwargs
1923 elif kwargs:
1924 raise TypeError("TypedDict takes either a dict or keyword arguments,"
1925 " but not both")
1926
1927 ns = {'__annotations__': dict(fields), '__total__': total}
1928 try:
1929 # Setting correct module is necessary to make typed dict classes pickleable.
1930 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
1931 except (AttributeError, ValueError):
1932 pass
1933
1934 return _TypedDictMeta(typename, (), ns)
1935
1936_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
1937TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001938
1939
Guido van Rossum91185fe2016-06-08 11:19:11 -07001940def NewType(name, tp):
1941 """NewType creates simple unique types with almost zero
1942 runtime overhead. NewType(name, tp) is considered a subtype of tp
1943 by static type checkers. At runtime, NewType(name, tp) returns
1944 a dummy function that simply returns its argument. Usage::
1945
1946 UserId = NewType('UserId', int)
1947
1948 def name_by_id(user_id: UserId) -> str:
1949 ...
1950
1951 UserId('user') # Fails type check
1952
1953 name_by_id(42) # Fails type check
1954 name_by_id(UserId(42)) # OK
1955
1956 num = UserId(5) + 1 # type: int
1957 """
1958
1959 def new_type(x):
1960 return x
1961
1962 new_type.__name__ = name
1963 new_type.__supertype__ = tp
1964 return new_type
1965
1966
Guido van Rossum0e0563c2016-04-05 14:54:25 -07001967# Python-version-specific alias (Python 2: unicode; Python 3: str)
1968Text = str
1969
1970
Guido van Rossum91185fe2016-06-08 11:19:11 -07001971# Constant that's True when type checking, but False here.
1972TYPE_CHECKING = False
1973
1974
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001975class IO(Generic[AnyStr]):
1976 """Generic base class for TextIO and BinaryIO.
1977
1978 This is an abstract, generic version of the return of open().
1979
1980 NOTE: This does not distinguish between the different possible
1981 classes (text vs. binary, read vs. write vs. read/write,
1982 append-only, unbuffered). The TextIO and BinaryIO subclasses
1983 below capture the distinctions between text vs. binary, which is
1984 pervasive in the interface; however we currently do not offer a
1985 way to track the other distinctions in the type system.
1986 """
1987
Guido van Rossumd70fe632015-08-05 12:11:06 +02001988 __slots__ = ()
1989
HongWeipeng6ce03ec2019-09-27 15:54:26 +08001990 @property
1991 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001992 def mode(self) -> str:
1993 pass
1994
HongWeipeng6ce03ec2019-09-27 15:54:26 +08001995 @property
1996 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001997 def name(self) -> str:
1998 pass
1999
2000 @abstractmethod
2001 def close(self) -> None:
2002 pass
2003
Shantanu2e6569b2020-01-29 18:52:36 -08002004 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002005 @abstractmethod
2006 def closed(self) -> bool:
2007 pass
2008
2009 @abstractmethod
2010 def fileno(self) -> int:
2011 pass
2012
2013 @abstractmethod
2014 def flush(self) -> None:
2015 pass
2016
2017 @abstractmethod
2018 def isatty(self) -> bool:
2019 pass
2020
2021 @abstractmethod
2022 def read(self, n: int = -1) -> AnyStr:
2023 pass
2024
2025 @abstractmethod
2026 def readable(self) -> bool:
2027 pass
2028
2029 @abstractmethod
2030 def readline(self, limit: int = -1) -> AnyStr:
2031 pass
2032
2033 @abstractmethod
2034 def readlines(self, hint: int = -1) -> List[AnyStr]:
2035 pass
2036
2037 @abstractmethod
2038 def seek(self, offset: int, whence: int = 0) -> int:
2039 pass
2040
2041 @abstractmethod
2042 def seekable(self) -> bool:
2043 pass
2044
2045 @abstractmethod
2046 def tell(self) -> int:
2047 pass
2048
2049 @abstractmethod
2050 def truncate(self, size: int = None) -> int:
2051 pass
2052
2053 @abstractmethod
2054 def writable(self) -> bool:
2055 pass
2056
2057 @abstractmethod
2058 def write(self, s: AnyStr) -> int:
2059 pass
2060
2061 @abstractmethod
2062 def writelines(self, lines: List[AnyStr]) -> None:
2063 pass
2064
2065 @abstractmethod
2066 def __enter__(self) -> 'IO[AnyStr]':
2067 pass
2068
2069 @abstractmethod
2070 def __exit__(self, type, value, traceback) -> None:
2071 pass
2072
2073
2074class BinaryIO(IO[bytes]):
2075 """Typed version of the return of open() in binary mode."""
2076
Guido van Rossumd70fe632015-08-05 12:11:06 +02002077 __slots__ = ()
2078
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002079 @abstractmethod
2080 def write(self, s: Union[bytes, bytearray]) -> int:
2081 pass
2082
2083 @abstractmethod
2084 def __enter__(self) -> 'BinaryIO':
2085 pass
2086
2087
2088class TextIO(IO[str]):
2089 """Typed version of the return of open() in text mode."""
2090
Guido van Rossumd70fe632015-08-05 12:11:06 +02002091 __slots__ = ()
2092
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002093 @property
2094 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002095 def buffer(self) -> BinaryIO:
2096 pass
2097
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002098 @property
2099 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002100 def encoding(self) -> str:
2101 pass
2102
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002103 @property
2104 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002105 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002106 pass
2107
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002108 @property
2109 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002110 def line_buffering(self) -> bool:
2111 pass
2112
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002113 @property
2114 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002115 def newlines(self) -> Any:
2116 pass
2117
2118 @abstractmethod
2119 def __enter__(self) -> 'TextIO':
2120 pass
2121
2122
2123class io:
2124 """Wrapper namespace for IO generic classes."""
2125
2126 __all__ = ['IO', 'TextIO', 'BinaryIO']
2127 IO = IO
2128 TextIO = TextIO
2129 BinaryIO = BinaryIO
2130
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002131
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002132io.__name__ = __name__ + '.io'
2133sys.modules[io.__name__] = io
2134
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002135Pattern = _alias(stdlib_re.Pattern, 1)
2136Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002137
2138class re:
2139 """Wrapper namespace for re type aliases."""
2140
2141 __all__ = ['Pattern', 'Match']
2142 Pattern = Pattern
2143 Match = Match
2144
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002145
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002146re.__name__ = __name__ + '.re'
2147sys.modules[re.__name__] = re