blob: 8c61bd8e084a850ad2e4a1167e2b902653b207fa [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',
Patrick Reader0705ec82020-09-16 05:58:32 +0100106 'is_typeddict',
Guido van Rossum91185fe2016-06-08 11:19:11 -0700107 'NewType',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700108 'no_type_check',
109 'no_type_check_decorator',
aetracht45738202018-03-19 14:41:32 -0400110 'NoReturn',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700111 'overload',
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100112 'runtime_checkable',
Guido van Rossum0e0563c2016-04-05 14:54:25 -0700113 'Text',
Guido van Rossum91185fe2016-06-08 11:19:11 -0700114 'TYPE_CHECKING',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700115]
116
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700117# The pseudo-submodules 're' and 'io' are part of the public
118# namespace, but excluded from __all__ because they might stomp on
119# legitimate imports of those modules.
120
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")
Maggie Moss1b4552c2020-09-09 13:23:24 -0700148 if isinstance(arg, (type, TypeVar, ForwardRef, types.Union)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000149 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:
Maggie Moss1b4552c2020-09-09 13:23:24 -0700208 if isinstance(p, (_UnionGenericAlias, types.Union)):
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
wyfo653f4202020-07-22 21:47:28 +0200247def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
Graham Bleaney84ef33c2020-09-08 18:41:10 -0400248 """Evaluate all forward references in the given type t.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000249 For use of globalns and localns see the docstring for get_type_hints().
wyfo653f4202020-07-22 21:47:28 +0200250 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):
wyfo653f4202020-07-22 21:47:28 +0200254 return t._evaluate(globalns, localns, recursive_guard)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300255 if isinstance(t, (_GenericAlias, GenericAlias)):
wyfo653f4202020-07-22 21:47:28 +0200256 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
wyfo653f4202020-07-22 21:47:28 +0200482 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
wyfo653f4202020-07-22 21:47:28 +0200492 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.",
wyfo653f4202020-07-22 21:47:28 +0200495 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
Maggie Moss1b4552c2020-09-09 13:23:24 -0700589 def __or__(self, right):
590 return Union[self, right]
591
592 def __ror__(self, right):
593 return Union[self, right]
594
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700595 def __repr__(self):
596 if self.__covariant__:
597 prefix = '+'
598 elif self.__contravariant__:
599 prefix = '-'
600 else:
601 prefix = '~'
602 return prefix + self.__name__
603
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100604 def __reduce__(self):
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300605 return self.__name__
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100606
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700607
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000608def _is_dunder(attr):
609 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800610
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300611class _BaseGenericAlias(_Final, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000612 """The central part of internal API.
613
614 This represents a generic version of type 'origin' with type arguments 'params'.
615 There are two kind of these aliases: user defined and special. The special ones
616 are wrappers around builtin collections and ABCs in collections.abc. These must
617 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
618 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700619 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300620 def __init__(self, origin, *, inst=True, name=None):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000621 self._inst = inst
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000622 self._name = name
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700623 self.__origin__ = origin
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000624 self.__slots__ = None # This is not documented.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300625
626 def __call__(self, *args, **kwargs):
627 if not self._inst:
628 raise TypeError(f"Type {self._name} cannot be instantiated; "
629 f"use {self.__origin__.__name__}() instead")
630 result = self.__origin__(*args, **kwargs)
631 try:
632 result.__orig_class__ = self
633 except AttributeError:
634 pass
635 return result
636
637 def __mro_entries__(self, bases):
638 res = []
639 if self.__origin__ not in bases:
640 res.append(self.__origin__)
641 i = bases.index(self)
642 for b in bases[i+1:]:
643 if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
644 break
645 else:
646 res.append(Generic)
647 return tuple(res)
648
649 def __getattr__(self, attr):
650 # We are careful for copy and pickle.
651 # Also for simplicity we just don't relay all dunder names
652 if '__origin__' in self.__dict__ and not _is_dunder(attr):
653 return getattr(self.__origin__, attr)
654 raise AttributeError(attr)
655
656 def __setattr__(self, attr, val):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300657 if _is_dunder(attr) or attr in ('_name', '_inst', '_nparams'):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300658 super().__setattr__(attr, val)
659 else:
660 setattr(self.__origin__, attr, val)
661
662 def __instancecheck__(self, obj):
663 return self.__subclasscheck__(type(obj))
664
665 def __subclasscheck__(self, cls):
666 raise TypeError("Subscripted generics cannot be used with"
667 " class and instance checks")
668
669
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300670# Special typing constructs Union, Optional, Generic, Callable and Tuple
671# use three special attributes for internal bookkeeping of generic types:
672# * __parameters__ is a tuple of unique free type parameters of a generic
673# type, for example, Dict[T, T].__parameters__ == (T,);
674# * __origin__ keeps a reference to a type that was subscripted,
675# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
676# the type.
677# * __args__ is a tuple of all arguments used in subscripting,
678# e.g., Dict[T, int].__args__ == (T, int).
679
680
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300681class _GenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300682 def __init__(self, origin, params, *, inst=True, name=None):
683 super().__init__(origin, inst=inst, name=name)
684 if not isinstance(params, tuple):
685 params = (params,)
686 self.__args__ = tuple(... if a is _TypingEllipsis else
687 () if a is _TypingEmpty else
688 a for a in params)
689 self.__parameters__ = _collect_type_vars(params)
690 if not name:
691 self.__module__ = origin.__module__
692
693 def __eq__(self, other):
694 if not isinstance(other, _GenericAlias):
695 return NotImplemented
696 return (self.__origin__ == other.__origin__
697 and self.__args__ == other.__args__)
698
699 def __hash__(self):
700 return hash((self.__origin__, self.__args__))
701
Maggie Moss1b4552c2020-09-09 13:23:24 -0700702 def __or__(self, right):
703 return Union[self, right]
704
705 def __ror__(self, right):
706 return Union[self, right]
707
Guido van Rossum4cefe742016-09-27 15:20:12 -0700708 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700709 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100710 if self.__origin__ in (Generic, Protocol):
711 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000712 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700713 if not isinstance(params, tuple):
714 params = (params,)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700715 msg = "Parameters to generic types must be types."
716 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300717 _check_generic(self, params, len(self.__parameters__))
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300718
719 subst = dict(zip(self.__parameters__, params))
720 new_args = []
721 for arg in self.__args__:
722 if isinstance(arg, TypeVar):
723 arg = subst[arg]
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300724 elif isinstance(arg, (_GenericAlias, GenericAlias)):
Serhiy Storchaka0122d482020-05-10 13:39:40 +0300725 subparams = arg.__parameters__
726 if subparams:
727 subargs = tuple(subst[x] for x in subparams)
728 arg = arg[subargs]
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300729 new_args.append(arg)
730 return self.copy_with(tuple(new_args))
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100731
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000732 def copy_with(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300733 return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700734
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000735 def __repr__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300736 if self._name:
737 name = 'typing.' + self._name
738 else:
739 name = _type_repr(self.__origin__)
740 args = ", ".join([_type_repr(a) for a in self.__args__])
741 return f'{name}[{args}]'
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000742
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300743 def __reduce__(self):
744 if self._name:
745 origin = globals()[self._name]
746 else:
747 origin = self.__origin__
748 args = tuple(self.__args__)
749 if len(args) == 1 and not isinstance(args[0], tuple):
750 args, = args
751 return operator.getitem, (origin, args)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000752
753 def __mro_entries__(self, bases):
754 if self._name: # generic version of an ABC or built-in class
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300755 return super().__mro_entries__(bases)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000756 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100757 if Protocol in bases:
758 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000759 i = bases.index(self)
760 for b in bases[i+1:]:
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300761 if isinstance(b, _BaseGenericAlias) and b is not self:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000762 return ()
763 return (self.__origin__,)
764
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000765
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300766# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
767# 1 for List and 2 for Dict. It may be -1 if variable number of
768# parameters are accepted (needs custom __getitem__).
769
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300770class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300771 def __init__(self, origin, nparams, *, inst=True, name=None):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300772 if name is None:
773 name = origin.__name__
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300774 super().__init__(origin, inst=inst, name=name)
775 self._nparams = nparams
Serhiy Storchaka2fbc57a2020-05-10 15:14:27 +0300776 if origin.__module__ == 'builtins':
777 self.__doc__ = f'A generic version of {origin.__qualname__}.'
778 else:
779 self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000780
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300781 @_tp_cache
782 def __getitem__(self, params):
783 if not isinstance(params, tuple):
784 params = (params,)
785 msg = "Parameters to generic types must be types."
786 params = tuple(_type_check(p, msg) for p in params)
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300787 _check_generic(self, params, self._nparams)
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300788 return self.copy_with(params)
789
790 def copy_with(self, params):
791 return _GenericAlias(self.__origin__, params,
792 name=self._name, inst=self._inst)
793
794 def __repr__(self):
795 return 'typing.' + self._name
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000796
797 def __subclasscheck__(self, cls):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300798 if isinstance(cls, _SpecialGenericAlias):
799 return issubclass(cls.__origin__, self.__origin__)
800 if not isinstance(cls, _GenericAlias):
801 return issubclass(cls, self.__origin__)
802 return super().__subclasscheck__(cls)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700803
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100804 def __reduce__(self):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300805 return self._name
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100806
Maggie Moss1b4552c2020-09-09 13:23:24 -0700807 def __or__(self, right):
808 return Union[self, right]
809
810 def __ror__(self, right):
811 return Union[self, right]
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700812
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300813class _CallableGenericAlias(_GenericAlias, _root=True):
814 def __repr__(self):
815 assert self._name == 'Callable'
816 if len(self.__args__) == 2 and self.__args__[0] is Ellipsis:
817 return super().__repr__()
818 return (f'typing.Callable'
819 f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], '
820 f'{_type_repr(self.__args__[-1])}]')
821
822 def __reduce__(self):
823 args = self.__args__
824 if not (len(args) == 2 and args[0] is ...):
825 args = list(args[:-1]), args[-1]
826 return operator.getitem, (Callable, args)
827
828
829class _CallableType(_SpecialGenericAlias, _root=True):
830 def copy_with(self, params):
831 return _CallableGenericAlias(self.__origin__, params,
832 name=self._name, inst=self._inst)
833
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000834 def __getitem__(self, params):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000835 if not isinstance(params, tuple) or len(params) != 2:
836 raise TypeError("Callable must be used as "
837 "Callable[[arg, ...], result].")
838 args, result = params
839 if args is Ellipsis:
840 params = (Ellipsis, result)
841 else:
842 if not isinstance(args, list):
843 raise TypeError(f"Callable[args, result]: args must be a list."
844 f" Got {args}")
845 params = (tuple(args), result)
846 return self.__getitem_inner__(params)
847
848 @_tp_cache
849 def __getitem_inner__(self, params):
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +0300850 args, result = params
851 msg = "Callable[args, result]: result must be a type."
852 result = _type_check(result, msg)
853 if args is Ellipsis:
854 return self.copy_with((_TypingEllipsis, result))
855 msg = "Callable[[arg, ...], result]: each arg must be a type."
856 args = tuple(_type_check(arg, msg) for arg in args)
857 params = args + (result,)
858 return self.copy_with(params)
859
860
861class _TupleType(_SpecialGenericAlias, _root=True):
862 @_tp_cache
863 def __getitem__(self, params):
864 if params == ():
865 return self.copy_with((_TypingEmpty,))
866 if not isinstance(params, tuple):
867 params = (params,)
868 if len(params) == 2 and params[1] is ...:
869 msg = "Tuple[t, ...]: t must be a type."
870 p = _type_check(params[0], msg)
871 return self.copy_with((p, _TypingEllipsis))
872 msg = "Tuple[t0, t1, ...]: each t must be a type."
873 params = tuple(_type_check(p, msg) for p in params)
874 return self.copy_with(params)
875
876
877class _UnionGenericAlias(_GenericAlias, _root=True):
878 def copy_with(self, params):
879 return Union[params]
880
881 def __eq__(self, other):
882 if not isinstance(other, _UnionGenericAlias):
883 return NotImplemented
884 return set(self.__args__) == set(other.__args__)
885
886 def __hash__(self):
887 return hash(frozenset(self.__args__))
888
889 def __repr__(self):
890 args = self.__args__
891 if len(args) == 2:
892 if args[0] is type(None):
893 return f'typing.Optional[{_type_repr(args[1])}]'
894 elif args[1] is type(None):
895 return f'typing.Optional[{_type_repr(args[0])}]'
896 return super().__repr__()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000897
Maggie Moss1b4552c2020-09-09 13:23:24 -0700898 def __instancecheck__(self, obj):
899 return self.__subclasscheck__(type(obj))
900
901 def __subclasscheck__(self, cls):
902 for arg in self.__args__:
903 if issubclass(cls, arg):
904 return True
905
906
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000907
908class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700909 """Abstract base class for generic types.
910
Guido van Rossumb24569a2016-11-20 18:01:29 -0800911 A generic type is typically declared by inheriting from
912 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700913 For example, a generic mapping type might be defined as::
914
915 class Mapping(Generic[KT, VT]):
916 def __getitem__(self, key: KT) -> VT:
917 ...
918 # Etc.
919
920 This class can then be used as follows::
921
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700922 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700923 try:
924 return mapping[key]
925 except KeyError:
926 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700927 """
Guido van Rossumd70fe632015-08-05 12:11:06 +0200928 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100929 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +0200930
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000931 @_tp_cache
932 def __class_getitem__(cls, params):
933 if not isinstance(params, tuple):
934 params = (params,)
935 if not params and cls is not Tuple:
936 raise TypeError(
937 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
938 msg = "Parameters to generic types must be types."
939 params = tuple(_type_check(p, msg) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100940 if cls in (Generic, Protocol):
941 # Generic and Protocol can only be subscripted with unique type variables.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000942 if not all(isinstance(p, TypeVar) for p in params):
943 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100944 f"Parameters to {cls.__name__}[...] must all be type variables")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000945 if len(set(params)) != len(params):
946 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100947 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000948 else:
949 # Subscripting a regular Generic subclass.
Serhiy Storchakafcb28562020-05-10 11:53:16 +0300950 _check_generic(cls, params, len(cls.__parameters__))
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000951 return _GenericAlias(cls, params)
952
953 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +0100954 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000955 tvars = []
956 if '__orig_bases__' in cls.__dict__:
957 error = Generic in cls.__orig_bases__
958 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100959 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000960 if error:
961 raise TypeError("Cannot inherit from plain Generic")
962 if '__orig_bases__' in cls.__dict__:
963 tvars = _collect_type_vars(cls.__orig_bases__)
964 # Look for Generic[T1, ..., Tn].
965 # If found, tvars must be a subset of it.
966 # If not found, tvars is it.
967 # Also check for and reject plain Generic,
968 # and reject multiple Generic[...].
969 gvars = None
970 for base in cls.__orig_bases__:
971 if (isinstance(base, _GenericAlias) and
972 base.__origin__ is Generic):
973 if gvars is not None:
974 raise TypeError(
975 "Cannot inherit from Generic[...] multiple types.")
976 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100977 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000978 tvarset = set(tvars)
979 gvarset = set(gvars)
980 if not tvarset <= gvarset:
981 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
982 s_args = ', '.join(str(g) for g in gvars)
983 raise TypeError(f"Some type variables ({s_vars}) are"
984 f" not listed in Generic[{s_args}]")
985 tvars = gvars
986 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700987
988
989class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -0800990 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
991 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700992 to sneak in where prohibited.
993 """
994
995
996class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -0800997 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700998
999
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001000_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
1001 '_is_protocol', '_is_runtime_protocol']
1002
1003_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
1004 '__init__', '__module__', '__new__', '__slots__',
Guido van Rossum48b069a2020-04-07 09:50:06 -07001005 '__subclasshook__', '__weakref__', '__class_getitem__']
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001006
1007# These special attributes will be not collected as protocol members.
1008EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
1009
1010
1011def _get_protocol_attrs(cls):
1012 """Collect protocol members from a protocol class objects.
1013
1014 This includes names actually defined in the class dictionary, as well
1015 as names that appear in annotations. Special names (above) are skipped.
1016 """
1017 attrs = set()
1018 for base in cls.__mro__[:-1]: # without object
1019 if base.__name__ in ('Protocol', 'Generic'):
1020 continue
1021 annotations = getattr(base, '__annotations__', {})
1022 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
1023 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
1024 attrs.add(attr)
1025 return attrs
1026
1027
1028def _is_callable_members_only(cls):
1029 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
1030 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
1031
1032
1033def _no_init(self, *args, **kwargs):
1034 if type(self)._is_protocol:
1035 raise TypeError('Protocols cannot be instantiated')
1036
1037
1038def _allow_reckless_class_cheks():
Nickolena Fishercfaf4c02020-04-26 12:49:11 -05001039 """Allow instance and class checks for special stdlib modules.
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001040
1041 The abc and functools modules indiscriminately call isinstance() and
1042 issubclass() on the whole MRO of a user class, which may contain protocols.
1043 """
1044 try:
1045 return sys._getframe(3).f_globals['__name__'] in ['abc', 'functools']
1046 except (AttributeError, ValueError): # For platforms without _getframe().
1047 return True
1048
1049
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001050_PROTO_ALLOWLIST = {
Divij Rajkumar692a0dc2019-09-12 11:13:51 +01001051 'collections.abc': [
1052 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
1053 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
1054 ],
1055 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1056}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001057
1058
1059class _ProtocolMeta(ABCMeta):
1060 # This metaclass is really unfortunate and exists only because of
1061 # the lack of __instancehook__.
1062 def __instancecheck__(cls, instance):
1063 # We need this method for situations where attributes are
1064 # assigned in __init__.
1065 if ((not getattr(cls, '_is_protocol', False) or
1066 _is_callable_members_only(cls)) and
1067 issubclass(instance.__class__, cls)):
1068 return True
1069 if cls._is_protocol:
1070 if all(hasattr(instance, attr) and
1071 # All *methods* can be blocked by setting them to None.
1072 (not callable(getattr(cls, attr, None)) or
1073 getattr(instance, attr) is not None)
1074 for attr in _get_protocol_attrs(cls)):
1075 return True
1076 return super().__instancecheck__(instance)
1077
1078
1079class Protocol(Generic, metaclass=_ProtocolMeta):
1080 """Base class for protocol classes.
1081
1082 Protocol classes are defined as::
1083
1084 class Proto(Protocol):
1085 def meth(self) -> int:
1086 ...
1087
1088 Such classes are primarily used with static type checkers that recognize
1089 structural subtyping (static duck-typing), for example::
1090
1091 class C:
1092 def meth(self) -> int:
1093 return 0
1094
1095 def func(x: Proto) -> int:
1096 return x.meth()
1097
1098 func(C()) # Passes static type check
1099
1100 See PEP 544 for details. Protocol classes decorated with
1101 @typing.runtime_checkable act as simple-minded runtime protocols that check
1102 only the presence of given attributes, ignoring their type signatures.
1103 Protocol classes can be generic, they are defined as::
1104
1105 class GenProto(Protocol[T]):
1106 def meth(self) -> T:
1107 ...
1108 """
1109 __slots__ = ()
1110 _is_protocol = True
1111 _is_runtime_protocol = False
1112
1113 def __init_subclass__(cls, *args, **kwargs):
1114 super().__init_subclass__(*args, **kwargs)
1115
1116 # Determine if this is a protocol or a concrete subclass.
1117 if not cls.__dict__.get('_is_protocol', False):
1118 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1119
1120 # Set (or override) the protocol subclass hook.
1121 def _proto_hook(other):
1122 if not cls.__dict__.get('_is_protocol', False):
1123 return NotImplemented
1124
1125 # First, perform various sanity checks.
1126 if not getattr(cls, '_is_runtime_protocol', False):
1127 if _allow_reckless_class_cheks():
1128 return NotImplemented
1129 raise TypeError("Instance and class checks can only be used with"
1130 " @runtime_checkable protocols")
1131 if not _is_callable_members_only(cls):
1132 if _allow_reckless_class_cheks():
1133 return NotImplemented
1134 raise TypeError("Protocols with non-method members"
1135 " don't support issubclass()")
1136 if not isinstance(other, type):
1137 # Same error message as for issubclass(1, int).
1138 raise TypeError('issubclass() arg 1 must be a class')
1139
1140 # Second, perform the actual structural compatibility check.
1141 for attr in _get_protocol_attrs(cls):
1142 for base in other.__mro__:
1143 # Check if the members appears in the class dictionary...
1144 if attr in base.__dict__:
1145 if base.__dict__[attr] is None:
1146 return NotImplemented
1147 break
1148
1149 # ...or in annotations, if it is a sub-protocol.
1150 annotations = getattr(base, '__annotations__', {})
1151 if (isinstance(annotations, collections.abc.Mapping) and
1152 attr in annotations and
1153 issubclass(other, Generic) and other._is_protocol):
1154 break
1155 else:
1156 return NotImplemented
1157 return True
1158
1159 if '__subclasshook__' not in cls.__dict__:
1160 cls.__subclasshook__ = _proto_hook
1161
1162 # We have nothing more to do for non-protocols...
1163 if not cls._is_protocol:
1164 return
1165
1166 # ... otherwise check consistency of bases, and prohibit instantiation.
1167 for base in cls.__bases__:
1168 if not (base in (object, Generic) or
Victor Stinner0e95bbf2020-08-12 10:53:12 +02001169 base.__module__ in _PROTO_ALLOWLIST and
1170 base.__name__ in _PROTO_ALLOWLIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001171 issubclass(base, Generic) and base._is_protocol):
1172 raise TypeError('Protocols can only inherit from other'
1173 ' protocols, got %r' % base)
1174 cls.__init__ = _no_init
1175
1176
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001177class _AnnotatedAlias(_GenericAlias, _root=True):
1178 """Runtime representation of an annotated type.
1179
1180 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
1181 with extra annotations. The alias behaves like a normal typing alias,
1182 instantiating is the same as instantiating the underlying type, binding
1183 it to types is also the same.
1184 """
1185 def __init__(self, origin, metadata):
1186 if isinstance(origin, _AnnotatedAlias):
1187 metadata = origin.__metadata__ + metadata
1188 origin = origin.__origin__
1189 super().__init__(origin, origin)
1190 self.__metadata__ = metadata
1191
1192 def copy_with(self, params):
1193 assert len(params) == 1
1194 new_type = params[0]
1195 return _AnnotatedAlias(new_type, self.__metadata__)
1196
1197 def __repr__(self):
1198 return "typing.Annotated[{}, {}]".format(
1199 _type_repr(self.__origin__),
1200 ", ".join(repr(a) for a in self.__metadata__)
1201 )
1202
1203 def __reduce__(self):
1204 return operator.getitem, (
1205 Annotated, (self.__origin__,) + self.__metadata__
1206 )
1207
1208 def __eq__(self, other):
1209 if not isinstance(other, _AnnotatedAlias):
1210 return NotImplemented
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001211 return (self.__origin__ == other.__origin__
1212 and self.__metadata__ == other.__metadata__)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001213
1214 def __hash__(self):
1215 return hash((self.__origin__, self.__metadata__))
1216
1217
1218class Annotated:
1219 """Add context specific metadata to a type.
1220
1221 Example: Annotated[int, runtime_check.Unsigned] indicates to the
1222 hypothetical runtime_check module that this type is an unsigned int.
1223 Every other consumer of this type can ignore this metadata and treat
1224 this type as int.
1225
1226 The first argument to Annotated must be a valid type.
1227
1228 Details:
1229
1230 - It's an error to call `Annotated` with less than two arguments.
1231 - Nested Annotated are flattened::
1232
1233 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
1234
1235 - Instantiating an annotated type is equivalent to instantiating the
1236 underlying type::
1237
1238 Annotated[C, Ann1](5) == C(5)
1239
1240 - Annotated can be used as a generic type alias::
1241
1242 Optimized = Annotated[T, runtime.Optimize()]
1243 Optimized[int] == Annotated[int, runtime.Optimize()]
1244
1245 OptimizedList = Annotated[List[T], runtime.Optimize()]
1246 OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
1247 """
1248
1249 __slots__ = ()
1250
1251 def __new__(cls, *args, **kwargs):
1252 raise TypeError("Type Annotated cannot be instantiated.")
1253
1254 @_tp_cache
1255 def __class_getitem__(cls, params):
1256 if not isinstance(params, tuple) or len(params) < 2:
1257 raise TypeError("Annotated[...] should be used "
1258 "with at least two arguments (a type and an "
1259 "annotation).")
1260 msg = "Annotated[t, ...]: t must be a type."
1261 origin = _type_check(params[0], msg)
1262 metadata = tuple(params[1:])
1263 return _AnnotatedAlias(origin, metadata)
1264
1265 def __init_subclass__(cls, *args, **kwargs):
1266 raise TypeError(
1267 "Cannot subclass {}.Annotated".format(cls.__module__)
1268 )
1269
1270
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001271def runtime_checkable(cls):
1272 """Mark a protocol class as a runtime protocol.
1273
1274 Such protocol can be used with isinstance() and issubclass().
1275 Raise TypeError if applied to a non-protocol class.
1276 This allows a simple-minded structural check very similar to
1277 one trick ponies in collections.abc such as Iterable.
1278 For example::
1279
1280 @runtime_checkable
1281 class Closable(Protocol):
1282 def close(self): ...
1283
1284 assert isinstance(open('/some/file'), Closable)
1285
1286 Warning: this will check only the presence of the required methods,
1287 not their type signatures!
1288 """
1289 if not issubclass(cls, Generic) or not cls._is_protocol:
1290 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1291 ' got %r' % cls)
1292 cls._is_runtime_protocol = True
1293 return cls
1294
1295
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001296def cast(typ, val):
1297 """Cast a value to a type.
1298
1299 This returns the value unchanged. To the type checker this
1300 signals that the return value has the designated type, but at
1301 runtime we intentionally don't check anything (we want this
1302 to be as fast as possible).
1303 """
1304 return val
1305
1306
1307def _get_defaults(func):
1308 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001309 try:
1310 code = func.__code__
1311 except AttributeError:
1312 # Some built-in functions don't have __code__, __defaults__, etc.
1313 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001314 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001315 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001316 arg_names = arg_names[:pos_count]
1317 defaults = func.__defaults__ or ()
1318 kwdefaults = func.__kwdefaults__
1319 res = dict(kwdefaults) if kwdefaults else {}
1320 pos_offset = pos_count - len(defaults)
1321 for name, value in zip(arg_names[pos_offset:], defaults):
1322 assert name not in res
1323 res[name] = value
1324 return res
1325
1326
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001327_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1328 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001329 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001330
1331
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001332def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
Guido van Rossum991d14f2016-11-09 13:12:51 -08001333 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001334
Guido van Rossum991d14f2016-11-09 13:12:51 -08001335 This is often the same as obj.__annotations__, but it handles
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001336 forward references encoded as string literals, adds Optional[t] if a
1337 default value equal to None is set and recursively replaces all
1338 'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001339
Guido van Rossum991d14f2016-11-09 13:12:51 -08001340 The argument may be a module, class, method, or function. The annotations
1341 are returned as a dictionary. For classes, annotations include also
1342 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001343
Guido van Rossum991d14f2016-11-09 13:12:51 -08001344 TypeError is raised if the argument is not of a type that can contain
1345 annotations, and an empty dictionary is returned if no annotations are
1346 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001347
Guido van Rossum991d14f2016-11-09 13:12:51 -08001348 BEWARE -- the behavior of globalns and localns is counterintuitive
1349 (unless you are familiar with how eval() and exec() work). The
1350 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001351
Guido van Rossum991d14f2016-11-09 13:12:51 -08001352 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001353 globals from obj (or the respective module's globals for classes),
1354 and these are also used as the locals. If the object does not appear
1355 to have globals, an empty dictionary is used.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001356
Guido van Rossum991d14f2016-11-09 13:12:51 -08001357 - If one dict argument is passed, it is used for both globals and
1358 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001359
Guido van Rossum991d14f2016-11-09 13:12:51 -08001360 - If two dict arguments are passed, they specify globals and
1361 locals, respectively.
1362 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001363
Guido van Rossum991d14f2016-11-09 13:12:51 -08001364 if getattr(obj, '__no_type_check__', None):
1365 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001366 # Classes require a special treatment.
1367 if isinstance(obj, type):
1368 hints = {}
1369 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001370 if globalns is None:
1371 base_globals = sys.modules[base.__module__].__dict__
1372 else:
1373 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001374 ann = base.__dict__.get('__annotations__', {})
1375 for name, value in ann.items():
1376 if value is None:
1377 value = type(None)
1378 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001379 value = ForwardRef(value, is_argument=False)
Łukasz Langaf350a262017-09-14 14:33:00 -04001380 value = _eval_type(value, base_globals, localns)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001381 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001382 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
Łukasz Langaf350a262017-09-14 14:33:00 -04001383
1384 if globalns is None:
1385 if isinstance(obj, types.ModuleType):
1386 globalns = obj.__dict__
1387 else:
benedwards140aca3a32019-11-21 17:24:58 +00001388 nsobj = obj
1389 # Find globalns for the unwrapped object.
1390 while hasattr(nsobj, '__wrapped__'):
1391 nsobj = nsobj.__wrapped__
1392 globalns = getattr(nsobj, '__globals__', {})
Łukasz Langaf350a262017-09-14 14:33:00 -04001393 if localns is None:
1394 localns = globalns
1395 elif localns is None:
1396 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001397 hints = getattr(obj, '__annotations__', None)
1398 if hints is None:
1399 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001400 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001401 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001402 else:
1403 raise TypeError('{!r} is not a module, class, method, '
1404 'or function.'.format(obj))
1405 defaults = _get_defaults(obj)
1406 hints = dict(hints)
1407 for name, value in hints.items():
1408 if value is None:
1409 value = type(None)
1410 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001411 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001412 value = _eval_type(value, globalns, localns)
1413 if name in defaults and defaults[name] is None:
1414 value = Optional[value]
1415 hints[name] = value
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001416 return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
1417
1418
1419def _strip_annotations(t):
1420 """Strips the annotations from a given type.
1421 """
1422 if isinstance(t, _AnnotatedAlias):
1423 return _strip_annotations(t.__origin__)
1424 if isinstance(t, _GenericAlias):
1425 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1426 if stripped_args == t.__args__:
1427 return t
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001428 return t.copy_with(stripped_args)
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001429 if isinstance(t, GenericAlias):
1430 stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
1431 if stripped_args == t.__args__:
1432 return t
1433 return GenericAlias(t.__origin__, stripped_args)
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001434 return t
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001435
1436
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001437def get_origin(tp):
1438 """Get the unsubscripted version of a type.
1439
Jakub Stasiak38aaaaa2020-02-07 02:15:12 +01001440 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
1441 and Annotated. Return None for unsupported types. Examples::
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001442
1443 get_origin(Literal[42]) is Literal
1444 get_origin(int) is None
1445 get_origin(ClassVar[int]) is ClassVar
1446 get_origin(Generic) is Generic
1447 get_origin(Generic[T]) is Generic
1448 get_origin(Union[T, int]) is Union
1449 get_origin(List[Tuple[T, T]][int]) == list
1450 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001451 if isinstance(tp, _AnnotatedAlias):
1452 return Annotated
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001453 if isinstance(tp, (_BaseGenericAlias, GenericAlias)):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001454 return tp.__origin__
1455 if tp is Generic:
1456 return Generic
1457 return None
1458
1459
1460def get_args(tp):
1461 """Get type arguments with all substitutions performed.
1462
1463 For unions, basic simplifications used by Union constructor are performed.
1464 Examples::
1465 get_args(Dict[str, int]) == (str, int)
1466 get_args(int) == ()
1467 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1468 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1469 get_args(Callable[[], T][int]) == ([], int)
1470 """
Jakub Stasiakcf5b1092020-02-05 02:10:19 +01001471 if isinstance(tp, _AnnotatedAlias):
1472 return (tp.__origin__,) + tp.__metadata__
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001473 if isinstance(tp, _GenericAlias):
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001474 res = tp.__args__
Serhiy Storchaka68b352a2020-04-26 21:21:08 +03001475 if tp.__origin__ is collections.abc.Callable and res[0] is not Ellipsis:
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001476 res = (list(res[:-1]), res[-1])
1477 return res
Serhiy Storchaka6292be72020-04-27 10:27:21 +03001478 if isinstance(tp, GenericAlias):
1479 return tp.__args__
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001480 return ()
1481
1482
Patrick Reader0705ec82020-09-16 05:58:32 +01001483def is_typeddict(tp):
1484 """Check if an annotation is a TypedDict class
1485
1486 For example::
1487 class Film(TypedDict):
1488 title: str
1489 year: int
1490
1491 is_typeddict(Film) # => True
1492 is_typeddict(Union[list, str]) # => False
1493 """
1494 return isinstance(tp, _TypedDictMeta)
1495
1496
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001497def no_type_check(arg):
1498 """Decorator to indicate that annotations are not type hints.
1499
1500 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001501 applies recursively to all methods and classes defined in that class
1502 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001503
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001504 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001505 """
1506 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001507 arg_attrs = arg.__dict__.copy()
1508 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001509 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001510 arg_attrs.pop(attr)
1511 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001512 if isinstance(obj, types.FunctionType):
1513 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001514 if isinstance(obj, type):
1515 no_type_check(obj)
1516 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001517 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001518 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001519 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001520 return arg
1521
1522
1523def no_type_check_decorator(decorator):
1524 """Decorator to give another decorator the @no_type_check effect.
1525
1526 This wraps the decorator with something that wraps the decorated
1527 function in @no_type_check.
1528 """
1529
1530 @functools.wraps(decorator)
1531 def wrapped_decorator(*args, **kwds):
1532 func = decorator(*args, **kwds)
1533 func = no_type_check(func)
1534 return func
1535
1536 return wrapped_decorator
1537
1538
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001539def _overload_dummy(*args, **kwds):
1540 """Helper for @overload to raise when called."""
1541 raise NotImplementedError(
1542 "You should not call an overloaded function. "
1543 "A series of @overload-decorated functions "
1544 "outside a stub module should always be followed "
1545 "by an implementation that is not @overload-ed.")
1546
1547
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001548def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001549 """Decorator for overloaded functions/methods.
1550
1551 In a stub file, place two or more stub definitions for the same
1552 function in a row, each decorated with @overload. For example:
1553
1554 @overload
1555 def utf8(value: None) -> None: ...
1556 @overload
1557 def utf8(value: bytes) -> bytes: ...
1558 @overload
1559 def utf8(value: str) -> bytes: ...
1560
1561 In a non-stub file (i.e. a regular .py file), do the same but
1562 follow it with an implementation. The implementation should *not*
1563 be decorated with @overload. For example:
1564
1565 @overload
1566 def utf8(value: None) -> None: ...
1567 @overload
1568 def utf8(value: bytes) -> bytes: ...
1569 @overload
1570 def utf8(value: str) -> bytes: ...
1571 def utf8(value):
1572 # implementation goes here
1573 """
1574 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001575
1576
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001577def final(f):
1578 """A decorator to indicate final methods and final classes.
1579
1580 Use this decorator to indicate to type checkers that the decorated
1581 method cannot be overridden, and decorated class cannot be subclassed.
1582 For example:
1583
1584 class Base:
1585 @final
1586 def done(self) -> None:
1587 ...
1588 class Sub(Base):
1589 def done(self) -> None: # Error reported by type checker
1590 ...
1591
1592 @final
1593 class Leaf:
1594 ...
1595 class Other(Leaf): # Error reported by type checker
1596 ...
1597
1598 There is no runtime checking of these properties.
1599 """
1600 return f
1601
1602
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001603# Some unconstrained type variables. These are used by the container types.
1604# (These are not for export.)
1605T = TypeVar('T') # Any type.
1606KT = TypeVar('KT') # Key type.
1607VT = TypeVar('VT') # Value type.
1608T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
1609V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
1610VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
1611T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
1612# Internal type variable used for Type[].
1613CT_co = TypeVar('CT_co', covariant=True, bound=type)
1614
1615# A useful type variable with constraints. This represents string types.
1616# (This one *is* for export!)
1617AnyStr = TypeVar('AnyStr', bytes, str)
1618
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001619
1620# Various ABCs mimicking those in collections.abc.
Serhiy Storchakac1c7d8e2020-05-07 04:09:33 +03001621_alias = _SpecialGenericAlias
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001622
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001623Hashable = _alias(collections.abc.Hashable, 0) # Not generic.
1624Awaitable = _alias(collections.abc.Awaitable, 1)
1625Coroutine = _alias(collections.abc.Coroutine, 3)
1626AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
1627AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
1628Iterable = _alias(collections.abc.Iterable, 1)
1629Iterator = _alias(collections.abc.Iterator, 1)
1630Reversible = _alias(collections.abc.Reversible, 1)
1631Sized = _alias(collections.abc.Sized, 0) # Not generic.
1632Container = _alias(collections.abc.Container, 1)
1633Collection = _alias(collections.abc.Collection, 1)
1634Callable = _CallableType(collections.abc.Callable, 2)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001635Callable.__doc__ = \
1636 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001637
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001638 The subscription syntax must always be used with exactly two
1639 values: the argument list and the return type. The argument list
1640 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001641
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001642 There is no syntax to indicate optional or keyword arguments,
1643 such function types are rarely used as callback types.
1644 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001645AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
1646MutableSet = _alias(collections.abc.MutableSet, 1)
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001647# NOTE: Mapping is only covariant in the value type.
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001648Mapping = _alias(collections.abc.Mapping, 2)
1649MutableMapping = _alias(collections.abc.MutableMapping, 2)
1650Sequence = _alias(collections.abc.Sequence, 1)
1651MutableSequence = _alias(collections.abc.MutableSequence, 1)
1652ByteString = _alias(collections.abc.ByteString, 0) # Not generic
1653# Tuple accepts variable number of parameters.
1654Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001655Tuple.__doc__ = \
1656 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001657
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001658 Example: Tuple[T1, T2] is a tuple of two elements corresponding
1659 to type variables T1 and T2. Tuple[int, float, str] is a tuple
1660 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001661
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001662 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
1663 """
Serhiy Storchakafcb28562020-05-10 11:53:16 +03001664List = _alias(list, 1, inst=False, name='List')
1665Deque = _alias(collections.deque, 1, name='Deque')
1666Set = _alias(set, 1, inst=False, name='Set')
1667FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
1668MappingView = _alias(collections.abc.MappingView, 1)
1669KeysView = _alias(collections.abc.KeysView, 1)
1670ItemsView = _alias(collections.abc.ItemsView, 2)
1671ValuesView = _alias(collections.abc.ValuesView, 1)
1672ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
1673AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
1674Dict = _alias(dict, 2, inst=False, name='Dict')
1675DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
1676OrderedDict = _alias(collections.OrderedDict, 2)
1677Counter = _alias(collections.Counter, 1)
1678ChainMap = _alias(collections.ChainMap, 2)
1679Generator = _alias(collections.abc.Generator, 3)
1680AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
1681Type = _alias(type, 1, inst=False, name='Type')
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001682Type.__doc__ = \
1683 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001684
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001685 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001686
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001687 class User: ... # Abstract base for User classes
1688 class BasicUser(User): ...
1689 class ProUser(User): ...
1690 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08001691
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001692 And a function that takes a class argument that's a subclass of
1693 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08001694
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001695 U = TypeVar('U', bound=User)
1696 def new_user(user_class: Type[U]) -> U:
1697 user = user_class()
1698 # (Here we could write the user object to a database)
1699 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08001700
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001701 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08001702
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001703 At this point the type checker knows that joe has type BasicUser.
1704 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001705
1706
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001707@runtime_checkable
1708class SupportsInt(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001709 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001710 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001711
1712 @abstractmethod
1713 def __int__(self) -> int:
1714 pass
1715
1716
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001717@runtime_checkable
1718class SupportsFloat(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001719 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001720 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001721
1722 @abstractmethod
1723 def __float__(self) -> float:
1724 pass
1725
1726
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001727@runtime_checkable
1728class SupportsComplex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001729 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001730 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001731
1732 @abstractmethod
1733 def __complex__(self) -> complex:
1734 pass
1735
1736
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001737@runtime_checkable
1738class SupportsBytes(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001739 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001740 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001741
1742 @abstractmethod
1743 def __bytes__(self) -> bytes:
1744 pass
1745
1746
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001747@runtime_checkable
1748class SupportsIndex(Protocol):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001749 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07001750 __slots__ = ()
1751
1752 @abstractmethod
1753 def __index__(self) -> int:
1754 pass
1755
1756
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001757@runtime_checkable
1758class SupportsAbs(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001759 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001760 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001761
1762 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02001763 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001764 pass
1765
1766
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001767@runtime_checkable
1768class SupportsRound(Protocol[T_co]):
Serhiy Storchaka8252c522019-10-08 16:30:17 +03001769 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001770 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001771
1772 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02001773 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001774 pass
1775
1776
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001777def _make_nmtuple(name, types, module, defaults = ()):
1778 fields = [n for n, t in types]
1779 types = {n: _type_check(t, f"field {n} annotation must be a type")
1780 for n, t in types}
1781 nm_tpl = collections.namedtuple(name, fields,
1782 defaults=defaults, module=module)
1783 nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001784 return nm_tpl
1785
1786
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001787# attributes prohibited to set in NamedTuple class syntax
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001788_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
1789 '_fields', '_field_defaults',
1790 '_make', '_replace', '_asdict', '_source'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001791
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001792_special = frozenset({'__module__', '__name__', '__annotations__'})
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001793
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001794
Guido van Rossum2f841442016-11-15 09:48:06 -08001795class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001796
Guido van Rossum2f841442016-11-15 09:48:06 -08001797 def __new__(cls, typename, bases, ns):
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001798 assert bases[0] is _NamedTuple
Guido van Rossum2f841442016-11-15 09:48:06 -08001799 types = ns.get('__annotations__', {})
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001800 default_names = []
Guido van Rossum3c268be2017-01-18 08:03:50 -08001801 for field_name in types:
1802 if field_name in ns:
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001803 default_names.append(field_name)
1804 elif default_names:
1805 raise TypeError(f"Non-default namedtuple field {field_name} "
1806 f"cannot follow default field"
1807 f"{'s' if len(default_names) > 1 else ''} "
1808 f"{', '.join(default_names)}")
1809 nm_tpl = _make_nmtuple(typename, types.items(),
1810 defaults=[ns[n] for n in default_names],
1811 module=ns['__module__'])
Guido van Rossum95919c02017-01-22 17:47:20 -08001812 # update from user namespace without overriding special namedtuple attributes
1813 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001814 if key in _prohibited:
1815 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
1816 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08001817 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08001818 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001819
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001820
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001821def NamedTuple(typename, fields=None, /, **kwargs):
Guido van Rossum2f841442016-11-15 09:48:06 -08001822 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001823
Guido van Rossum2f841442016-11-15 09:48:06 -08001824 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001825
Guido van Rossum2f841442016-11-15 09:48:06 -08001826 class Employee(NamedTuple):
1827 name: str
1828 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001829
Guido van Rossum2f841442016-11-15 09:48:06 -08001830 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001831
Guido van Rossum2f841442016-11-15 09:48:06 -08001832 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001833
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07001834 The resulting class has an extra __annotations__ attribute, giving a
1835 dict that maps field names to types. (The field names are also in
1836 the _fields attribute, which is part of the namedtuple API.)
1837 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001838
Guido van Rossum2f841442016-11-15 09:48:06 -08001839 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001840
Guido van Rossum2f841442016-11-15 09:48:06 -08001841 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001842
Guido van Rossum2f841442016-11-15 09:48:06 -08001843 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
1844 """
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001845 if fields is None:
1846 fields = kwargs.items()
1847 elif kwargs:
1848 raise TypeError("Either list of fields or keywords"
1849 " can be provided to NamedTuple, not both")
1850 try:
1851 module = sys._getframe(1).f_globals.get('__name__', '__main__')
1852 except (AttributeError, ValueError):
1853 module = None
1854 return _make_nmtuple(typename, fields, module=module)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001855
Serhiy Storchakaa2ec0692020-04-08 10:59:04 +03001856_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
1857
1858def _namedtuple_mro_entries(bases):
1859 if len(bases) > 1:
1860 raise TypeError("Multiple inheritance with NamedTuple is not supported")
1861 assert bases[0] is NamedTuple
1862 return (_NamedTuple,)
1863
1864NamedTuple.__mro_entries__ = _namedtuple_mro_entries
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001865
1866
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001867class _TypedDictMeta(type):
1868 def __new__(cls, name, bases, ns, total=True):
1869 """Create new typed dict class object.
1870
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001871 This method is called when TypedDict is subclassed,
1872 or when TypedDict is instantiated. This way
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001873 TypedDict supports all three syntax forms described in its docstring.
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001874 Subclasses and instances of TypedDict return actual dictionaries.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001875 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001876 for base in bases:
1877 if type(base) is not _TypedDictMeta:
1878 raise TypeError('cannot inherit from both a TypedDict type '
1879 'and a non-TypedDict base class')
1880 tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001881
Vlad Emelianov10e87e52020-02-13 20:53:29 +01001882 annotations = {}
1883 own_annotations = ns.get('__annotations__', {})
1884 own_annotation_keys = set(own_annotations.keys())
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001885 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
Vlad Emelianov10e87e52020-02-13 20:53:29 +01001886 own_annotations = {
1887 n: _type_check(tp, msg) for n, tp in own_annotations.items()
1888 }
1889 required_keys = set()
1890 optional_keys = set()
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11001891
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001892 for base in bases:
Vlad Emelianov10e87e52020-02-13 20:53:29 +01001893 annotations.update(base.__dict__.get('__annotations__', {}))
1894 required_keys.update(base.__dict__.get('__required_keys__', ()))
1895 optional_keys.update(base.__dict__.get('__optional_keys__', ()))
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11001896
Vlad Emelianov10e87e52020-02-13 20:53:29 +01001897 annotations.update(own_annotations)
1898 if total:
1899 required_keys.update(own_annotation_keys)
1900 else:
1901 optional_keys.update(own_annotation_keys)
1902
1903 tp_dict.__annotations__ = annotations
1904 tp_dict.__required_keys__ = frozenset(required_keys)
1905 tp_dict.__optional_keys__ = frozenset(optional_keys)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001906 if not hasattr(tp_dict, '__total__'):
1907 tp_dict.__total__ = total
1908 return tp_dict
1909
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001910 __call__ = dict # static method
1911
1912 def __subclasscheck__(cls, other):
1913 # Typed dicts are only for static structural subtyping.
1914 raise TypeError('TypedDict does not support instance and class checks')
1915
1916 __instancecheck__ = __subclasscheck__
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001917
1918
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001919def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001920 """A simple typed namespace. At runtime it is equivalent to a plain dict.
1921
1922 TypedDict creates a dictionary type that expects all of its
1923 instances to have a certain set of keys, where each key is
1924 associated with a value of a consistent type. This expectation
1925 is not checked at runtime but is only enforced by type checkers.
1926 Usage::
1927
1928 class Point2D(TypedDict):
1929 x: int
1930 y: int
1931 label: str
1932
1933 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
1934 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
1935
1936 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
1937
Zac Hatfield-Dodds665ad3d2019-11-24 21:48:48 +11001938 The type info can be accessed via the Point2D.__annotations__ dict, and
1939 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
1940 TypedDict supports two additional equivalent forms::
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001941
1942 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
1943 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
1944
ananthan-123ab6423f2020-02-19 10:03:05 +05301945 By default, all keys must be present in a TypedDict. It is possible
1946 to override this by specifying totality.
1947 Usage::
1948
1949 class point2D(TypedDict, total=False):
1950 x: int
1951 y: int
1952
1953 This means that a point2D TypedDict can have any of the keys omitted.A type
1954 checker is only expected to support a literal False or True as the value of
1955 the total argument. True is the default, and makes all items defined in the
1956 class body be required.
1957
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001958 The class syntax is only supported in Python 3.6+, while two other
1959 syntax forms work for Python 2.7 and 3.2+
1960 """
Serhiy Storchakaf228bf22020-04-08 11:03:27 +03001961 if fields is None:
1962 fields = kwargs
1963 elif kwargs:
1964 raise TypeError("TypedDict takes either a dict or keyword arguments,"
1965 " but not both")
1966
1967 ns = {'__annotations__': dict(fields), '__total__': total}
1968 try:
1969 # Setting correct module is necessary to make typed dict classes pickleable.
1970 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
1971 except (AttributeError, ValueError):
1972 pass
1973
1974 return _TypedDictMeta(typename, (), ns)
1975
1976_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
1977TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001978
1979
Guido van Rossum91185fe2016-06-08 11:19:11 -07001980def NewType(name, tp):
1981 """NewType creates simple unique types with almost zero
1982 runtime overhead. NewType(name, tp) is considered a subtype of tp
1983 by static type checkers. At runtime, NewType(name, tp) returns
1984 a dummy function that simply returns its argument. Usage::
1985
1986 UserId = NewType('UserId', int)
1987
1988 def name_by_id(user_id: UserId) -> str:
1989 ...
1990
1991 UserId('user') # Fails type check
1992
1993 name_by_id(42) # Fails type check
1994 name_by_id(UserId(42)) # OK
1995
1996 num = UserId(5) + 1 # type: int
1997 """
1998
1999 def new_type(x):
2000 return x
2001
2002 new_type.__name__ = name
2003 new_type.__supertype__ = tp
2004 return new_type
2005
2006
Guido van Rossum0e0563c2016-04-05 14:54:25 -07002007# Python-version-specific alias (Python 2: unicode; Python 3: str)
2008Text = str
2009
2010
Guido van Rossum91185fe2016-06-08 11:19:11 -07002011# Constant that's True when type checking, but False here.
2012TYPE_CHECKING = False
2013
2014
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002015class IO(Generic[AnyStr]):
2016 """Generic base class for TextIO and BinaryIO.
2017
2018 This is an abstract, generic version of the return of open().
2019
2020 NOTE: This does not distinguish between the different possible
2021 classes (text vs. binary, read vs. write vs. read/write,
2022 append-only, unbuffered). The TextIO and BinaryIO subclasses
2023 below capture the distinctions between text vs. binary, which is
2024 pervasive in the interface; however we currently do not offer a
2025 way to track the other distinctions in the type system.
2026 """
2027
Guido van Rossumd70fe632015-08-05 12:11:06 +02002028 __slots__ = ()
2029
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002030 @property
2031 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002032 def mode(self) -> str:
2033 pass
2034
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002035 @property
2036 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002037 def name(self) -> str:
2038 pass
2039
2040 @abstractmethod
2041 def close(self) -> None:
2042 pass
2043
Shantanu2e6569b2020-01-29 18:52:36 -08002044 @property
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002045 @abstractmethod
2046 def closed(self) -> bool:
2047 pass
2048
2049 @abstractmethod
2050 def fileno(self) -> int:
2051 pass
2052
2053 @abstractmethod
2054 def flush(self) -> None:
2055 pass
2056
2057 @abstractmethod
2058 def isatty(self) -> bool:
2059 pass
2060
2061 @abstractmethod
2062 def read(self, n: int = -1) -> AnyStr:
2063 pass
2064
2065 @abstractmethod
2066 def readable(self) -> bool:
2067 pass
2068
2069 @abstractmethod
2070 def readline(self, limit: int = -1) -> AnyStr:
2071 pass
2072
2073 @abstractmethod
2074 def readlines(self, hint: int = -1) -> List[AnyStr]:
2075 pass
2076
2077 @abstractmethod
2078 def seek(self, offset: int, whence: int = 0) -> int:
2079 pass
2080
2081 @abstractmethod
2082 def seekable(self) -> bool:
2083 pass
2084
2085 @abstractmethod
2086 def tell(self) -> int:
2087 pass
2088
2089 @abstractmethod
2090 def truncate(self, size: int = None) -> int:
2091 pass
2092
2093 @abstractmethod
2094 def writable(self) -> bool:
2095 pass
2096
2097 @abstractmethod
2098 def write(self, s: AnyStr) -> int:
2099 pass
2100
2101 @abstractmethod
2102 def writelines(self, lines: List[AnyStr]) -> None:
2103 pass
2104
2105 @abstractmethod
2106 def __enter__(self) -> 'IO[AnyStr]':
2107 pass
2108
2109 @abstractmethod
2110 def __exit__(self, type, value, traceback) -> None:
2111 pass
2112
2113
2114class BinaryIO(IO[bytes]):
2115 """Typed version of the return of open() in binary mode."""
2116
Guido van Rossumd70fe632015-08-05 12:11:06 +02002117 __slots__ = ()
2118
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002119 @abstractmethod
2120 def write(self, s: Union[bytes, bytearray]) -> int:
2121 pass
2122
2123 @abstractmethod
2124 def __enter__(self) -> 'BinaryIO':
2125 pass
2126
2127
2128class TextIO(IO[str]):
2129 """Typed version of the return of open() in text mode."""
2130
Guido van Rossumd70fe632015-08-05 12:11:06 +02002131 __slots__ = ()
2132
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002133 @property
2134 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002135 def buffer(self) -> BinaryIO:
2136 pass
2137
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002138 @property
2139 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002140 def encoding(self) -> str:
2141 pass
2142
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002143 @property
2144 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08002145 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002146 pass
2147
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002148 @property
2149 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002150 def line_buffering(self) -> bool:
2151 pass
2152
HongWeipeng6ce03ec2019-09-27 15:54:26 +08002153 @property
2154 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002155 def newlines(self) -> Any:
2156 pass
2157
2158 @abstractmethod
2159 def __enter__(self) -> 'TextIO':
2160 pass
2161
2162
2163class io:
2164 """Wrapper namespace for IO generic classes."""
2165
2166 __all__ = ['IO', 'TextIO', 'BinaryIO']
2167 IO = IO
2168 TextIO = TextIO
2169 BinaryIO = BinaryIO
2170
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002171
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002172io.__name__ = __name__ + '.io'
2173sys.modules[io.__name__] = io
2174
Serhiy Storchakafcb28562020-05-10 11:53:16 +03002175Pattern = _alias(stdlib_re.Pattern, 1)
2176Match = _alias(stdlib_re.Match, 1)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002177
2178class re:
2179 """Wrapper namespace for re type aliases."""
2180
2181 __all__ = ['Pattern', 'Match']
2182 Pattern = Pattern
2183 Match = Match
2184
Guido van Rossumd7adfe12017-01-22 17:43:53 -08002185
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07002186re.__name__ = __name__ + '.re'
2187sys.modules[re.__name__] = re