blob: bd30da90ad796f965d063bf063e93a4148e437e3 [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.
16* Special types: NewType, NamedTuple, TypedDict (may be added soon).
17* Wrapper submodules for re and io related types.
18"""
19
Miss Islington (bot)b2c2a0c2019-09-27 01:13:38 -070020from 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
Ivan Levkivskyid911e402018-01-20 11:23:59 +000029from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070030
31# Please keep __all__ alphabetized within each category.
32__all__ = [
33 # Super-special typing primitives.
34 'Any',
35 'Callable',
Guido van Rossum0a6976d2016-09-11 15:34:56 -070036 'ClassVar',
Ivan Levkivskyif3672422019-05-26 09:37:07 +010037 'Final',
Anthony Sottiled30da5d2019-05-29 11:19:38 -070038 'ForwardRef',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070039 'Generic',
Ivan Levkivskyib891c462019-05-26 09:37:48 +010040 'Literal',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070041 'Optional',
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +010042 'Protocol',
Guido van Rossumeb9aca32016-05-24 16:38:22 -070043 'Tuple',
44 'Type',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070045 'TypeVar',
46 'Union',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070047
48 # ABCs (from collections.abc).
49 'AbstractSet', # collections.abc.Set.
50 'ByteString',
51 'Container',
Ivan Levkivskyi29fda8d2017-06-10 21:57:56 +020052 'ContextManager',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070053 'Hashable',
54 'ItemsView',
55 'Iterable',
56 'Iterator',
57 'KeysView',
58 'Mapping',
59 'MappingView',
60 'MutableMapping',
61 'MutableSequence',
62 'MutableSet',
63 'Sequence',
64 'Sized',
65 'ValuesView',
Ivan Levkivskyid911e402018-01-20 11:23:59 +000066 'Awaitable',
67 'AsyncIterator',
68 'AsyncIterable',
69 'Coroutine',
70 'Collection',
71 'AsyncGenerator',
72 'AsyncContextManager',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070073
74 # Structural checks, a.k.a. protocols.
75 'Reversible',
76 'SupportsAbs',
Ivan Levkivskyif06e0212017-05-02 19:14:07 +020077 'SupportsBytes',
78 'SupportsComplex',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070079 'SupportsFloat',
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -070080 'SupportsIndex',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070081 'SupportsInt',
82 'SupportsRound',
83
84 # Concrete collection types.
Anthony Sottiled30da5d2019-05-29 11:19:38 -070085 'ChainMap',
Ivan Levkivskyib692dc82017-02-13 22:50:14 +010086 'Counter',
Raymond Hettinger80490522017-01-16 22:42:37 -080087 'Deque',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070088 'Dict',
Guido van Rossumbd5b9a02016-04-05 08:28:52 -070089 'DefaultDict',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070090 'List',
Anthony Sottiled30da5d2019-05-29 11:19:38 -070091 'OrderedDict',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070092 'Set',
Guido van Rossumefa798d2016-08-23 11:01:50 -070093 'FrozenSet',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070094 'NamedTuple', # Not really a type.
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +010095 'TypedDict', # Not really a type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -070096 'Generator',
97
98 # One-off things.
99 'AnyStr',
100 'cast',
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100101 'final',
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +0100102 'get_args',
103 'get_origin',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700104 'get_type_hints',
Guido van Rossum91185fe2016-06-08 11:19:11 -0700105 'NewType',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700106 'no_type_check',
107 'no_type_check_decorator',
aetracht45738202018-03-19 14:41:32 -0400108 'NoReturn',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700109 'overload',
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100110 'runtime_checkable',
Guido van Rossum0e0563c2016-04-05 14:54:25 -0700111 'Text',
Guido van Rossum91185fe2016-06-08 11:19:11 -0700112 'TYPE_CHECKING',
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700113]
114
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700115# The pseudo-submodules 're' and 'io' are part of the public
116# namespace, but excluded from __all__ because they might stomp on
117# legitimate imports of those modules.
118
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700119
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700120def _type_check(arg, msg, is_argument=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000121 """Check that the argument is a type, and return it (internal helper).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700122
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000123 As a special case, accept None and return type(None) instead. Also wrap strings
124 into ForwardRef instances. Consider several corner cases, for example plain
125 special forms like Union are not valid, while Union[int, str] is OK, etc.
126 The msg argument is a human-readable error message, e.g::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700127
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000128 "Union[arg, ...]: arg should be a type."
Guido van Rossum4cefe742016-09-27 15:20:12 -0700129
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000130 We append the repr() of the actual value (truncated to 100 chars).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700131 """
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100132 invalid_generic_forms = (Generic, Protocol)
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700133 if is_argument:
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100134 invalid_generic_forms = invalid_generic_forms + (ClassVar, Final)
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400135
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000136 if arg is None:
137 return type(None)
138 if isinstance(arg, str):
139 return ForwardRef(arg)
140 if (isinstance(arg, _GenericAlias) and
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400141 arg.__origin__ in invalid_generic_forms):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000142 raise TypeError(f"{arg} is not valid as type argument")
Noah Wood5eea0ad2018-10-08 14:50:16 -0400143 if (isinstance(arg, _SpecialForm) and arg not in (Any, NoReturn) or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100144 arg in (Generic, Protocol)):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000145 raise TypeError(f"Plain {arg} is not valid as type argument")
146 if isinstance(arg, (type, TypeVar, ForwardRef)):
147 return arg
148 if not callable(arg):
149 raise TypeError(f"{msg} Got {arg!r:.100}.")
150 return arg
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700151
152
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000153def _type_repr(obj):
154 """Return the repr() of an object, special-casing types (internal helper).
155
156 If obj is a type, we return a shorter version than the default
157 type.__repr__, based on the module and qualified name, which is
158 typically enough to uniquely identify a type. For everything
159 else, we fall back on repr(obj).
160 """
161 if isinstance(obj, type):
162 if obj.__module__ == 'builtins':
163 return obj.__qualname__
164 return f'{obj.__module__}.{obj.__qualname__}'
165 if obj is ...:
166 return('...')
167 if isinstance(obj, types.FunctionType):
168 return obj.__name__
169 return repr(obj)
170
171
172def _collect_type_vars(types):
173 """Collect all type variable contained in types in order of
174 first appearance (lexicographic order). For example::
175
176 _collect_type_vars((T, List[S, T])) == (T, S)
177 """
178 tvars = []
179 for t in types:
180 if isinstance(t, TypeVar) and t not in tvars:
181 tvars.append(t)
182 if isinstance(t, _GenericAlias) and not t._special:
183 tvars.extend([t for t in t.__parameters__ if t not in tvars])
184 return tuple(tvars)
185
186
187def _subs_tvars(tp, tvars, subs):
188 """Substitute type variables 'tvars' with substitutions 'subs'.
189 These two must have the same length.
190 """
191 if not isinstance(tp, _GenericAlias):
192 return tp
193 new_args = list(tp.__args__)
194 for a, arg in enumerate(tp.__args__):
195 if isinstance(arg, TypeVar):
196 for i, tvar in enumerate(tvars):
197 if arg == tvar:
198 new_args[a] = subs[i]
199 else:
200 new_args[a] = _subs_tvars(arg, tvars, subs)
201 if tp.__origin__ is Union:
202 return Union[tuple(new_args)]
203 return tp.copy_with(tuple(new_args))
204
205
206def _check_generic(cls, parameters):
207 """Check correct count for parameters of a generic cls (internal helper).
208 This gives a nice error message in case of count mismatch.
209 """
210 if not cls.__parameters__:
211 raise TypeError(f"{cls} is not a generic class")
212 alen = len(parameters)
213 elen = len(cls.__parameters__)
214 if alen != elen:
215 raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};"
216 f" actual {alen}, expected {elen}")
217
218
219def _remove_dups_flatten(parameters):
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700220 """An internal helper for Union creation and substitution: flatten Unions
221 among parameters, then remove duplicates.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000222 """
223 # Flatten out Union[Union[...], ...].
224 params = []
225 for p in parameters:
226 if isinstance(p, _GenericAlias) and p.__origin__ is Union:
227 params.extend(p.__args__)
228 elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
229 params.extend(p[1:])
230 else:
231 params.append(p)
232 # Weed out strict duplicates, preserving the first of each occurrence.
233 all_params = set(params)
234 if len(all_params) < len(params):
235 new_params = []
236 for t in params:
237 if t in all_params:
238 new_params.append(t)
239 all_params.remove(t)
240 params = new_params
241 assert not all_params, all_params
Ivan Levkivskyif65e31f2018-05-18 16:00:38 -0700242 return tuple(params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000243
244
245_cleanups = []
246
247
248def _tp_cache(func):
249 """Internal wrapper caching __getitem__ of generic types with a fallback to
250 original function for non-hashable arguments.
251 """
252 cached = functools.lru_cache()(func)
253 _cleanups.append(cached.cache_clear)
254
255 @functools.wraps(func)
256 def inner(*args, **kwds):
257 try:
258 return cached(*args, **kwds)
259 except TypeError:
260 pass # All real errors (not unhashable args) are raised below.
261 return func(*args, **kwds)
262 return inner
263
264
265def _eval_type(t, globalns, localns):
266 """Evaluate all forward reverences in the given type t.
267 For use of globalns and localns see the docstring for get_type_hints().
268 """
269 if isinstance(t, ForwardRef):
270 return t._evaluate(globalns, localns)
271 if isinstance(t, _GenericAlias):
272 ev_args = tuple(_eval_type(a, globalns, localns) for a in t.__args__)
273 if ev_args == t.__args__:
274 return t
275 res = t.copy_with(ev_args)
276 res._special = t._special
277 return res
278 return t
279
280
281class _Final:
282 """Mixin to prohibit subclassing"""
Guido van Rossum4cefe742016-09-27 15:20:12 -0700283
Guido van Rossum83ec3022017-01-17 20:43:28 -0800284 __slots__ = ('__weakref__',)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700285
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300286 def __init_subclass__(self, /, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000287 if '_root' not in kwds:
288 raise TypeError("Cannot subclass special typing classes")
289
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100290class _Immutable:
291 """Mixin to indicate that object should not be copied."""
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000292
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100293 def __copy__(self):
294 return self
295
296 def __deepcopy__(self, memo):
297 return self
298
299
300class _SpecialForm(_Final, _Immutable, _root=True):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000301 """Internal indicator of special typing constructs.
302 See _doc instance attribute for specific docs.
303 """
304
305 __slots__ = ('_name', '_doc')
306
Guido van Rossum4cefe742016-09-27 15:20:12 -0700307 def __new__(cls, *args, **kwds):
308 """Constructor.
309
310 This only exists to give a better error message in case
311 someone tries to subclass a special typing object (not a good idea).
312 """
313 if (len(args) == 3 and
314 isinstance(args[0], str) and
315 isinstance(args[1], tuple)):
316 # Close enough.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000317 raise TypeError(f"Cannot subclass {cls!r}")
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700318 return super().__new__(cls)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700319
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000320 def __init__(self, name, doc):
321 self._name = name
322 self._doc = doc
Guido van Rossum4cefe742016-09-27 15:20:12 -0700323
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000324 def __eq__(self, other):
325 if not isinstance(other, _SpecialForm):
326 return NotImplemented
327 return self._name == other._name
328
329 def __hash__(self):
330 return hash((self._name,))
Guido van Rossum4cefe742016-09-27 15:20:12 -0700331
332 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000333 return 'typing.' + self._name
334
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100335 def __reduce__(self):
336 return self._name
Guido van Rossum4cefe742016-09-27 15:20:12 -0700337
338 def __call__(self, *args, **kwds):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000339 raise TypeError(f"Cannot instantiate {self!r}")
340
341 def __instancecheck__(self, obj):
342 raise TypeError(f"{self} cannot be used with isinstance()")
343
344 def __subclasscheck__(self, cls):
345 raise TypeError(f"{self} cannot be used with issubclass()")
346
347 @_tp_cache
348 def __getitem__(self, parameters):
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100349 if self._name in ('ClassVar', 'Final'):
350 item = _type_check(parameters, f'{self._name} accepts only single type.')
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000351 return _GenericAlias(self, (item,))
352 if self._name == 'Union':
353 if parameters == ():
354 raise TypeError("Cannot take a Union of no types.")
355 if not isinstance(parameters, tuple):
356 parameters = (parameters,)
357 msg = "Union[arg, ...]: each arg must be a type."
358 parameters = tuple(_type_check(p, msg) for p in parameters)
359 parameters = _remove_dups_flatten(parameters)
360 if len(parameters) == 1:
361 return parameters[0]
362 return _GenericAlias(self, parameters)
363 if self._name == 'Optional':
364 arg = _type_check(parameters, "Optional[t] requires a single type.")
365 return Union[arg, type(None)]
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100366 if self._name == 'Literal':
367 # There is no '_type_check' call because arguments to Literal[...] are
368 # values, not types.
369 return _GenericAlias(self, parameters)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000370 raise TypeError(f"{self} is not subscriptable")
Guido van Rossum4cefe742016-09-27 15:20:12 -0700371
372
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000373Any = _SpecialForm('Any', doc=
374 """Special type indicating an unconstrained type.
Guido van Rossumb47c9d22016-10-03 08:40:50 -0700375
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000376 - Any is compatible with every type.
377 - Any assumed to have all methods.
378 - All values assumed to be instances of Any.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700379
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000380 Note that all the above statements are true from the point of view of
381 static type checkers. At runtime, Any should not be used with instance
382 or class checks.
383 """)
Guido van Rossumd70fe632015-08-05 12:11:06 +0200384
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000385NoReturn = _SpecialForm('NoReturn', doc=
386 """Special type indicating functions that never return.
387 Example::
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700388
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000389 from typing import NoReturn
390
391 def stop() -> NoReturn:
392 raise Exception('no way')
393
394 This type is invalid in other positions, e.g., ``List[NoReturn]``
395 will fail in static type checkers.
396 """)
397
398ClassVar = _SpecialForm('ClassVar', doc=
399 """Special type construct to mark class variables.
400
401 An annotation wrapped in ClassVar indicates that a given
402 attribute is intended to be used as a class variable and
403 should not be set on instances of that class. Usage::
404
405 class Starship:
406 stats: ClassVar[Dict[str, int]] = {} # class variable
407 damage: int = 10 # instance variable
408
409 ClassVar accepts only types and cannot be further subscribed.
410
411 Note that ClassVar is not a class itself, and should not
412 be used with isinstance() or issubclass().
413 """)
414
Ivan Levkivskyif3672422019-05-26 09:37:07 +0100415Final = _SpecialForm('Final', doc=
416 """Special typing construct to indicate final names to type checkers.
417
418 A final name cannot be re-assigned or overridden in a subclass.
419 For example:
420
421 MAX_SIZE: Final = 9000
422 MAX_SIZE += 1 # Error reported by type checker
423
424 class Connection:
425 TIMEOUT: Final[int] = 10
426
427 class FastConnector(Connection):
428 TIMEOUT = 1 # Error reported by type checker
429
430 There is no runtime checking of these properties.
431 """)
432
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000433Union = _SpecialForm('Union', doc=
434 """Union type; Union[X, Y] means either X or Y.
435
436 To define a union, use e.g. Union[int, str]. Details:
437 - The arguments must be types and there must be at least one.
438 - None as an argument is a special case and is replaced by
439 type(None).
440 - Unions of unions are flattened, e.g.::
441
442 Union[Union[int, str], float] == Union[int, str, float]
443
444 - Unions of a single argument vanish, e.g.::
445
446 Union[int] == int # The constructor actually returns int
447
448 - Redundant arguments are skipped, e.g.::
449
450 Union[int, str, int] == Union[int, str]
451
452 - When comparing unions, the argument order is ignored, e.g.::
453
454 Union[int, str] == Union[str, int]
455
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000456 - You cannot subclass or instantiate a union.
457 - You can use Optional[X] as a shorthand for Union[X, None].
458 """)
459
460Optional = _SpecialForm('Optional', doc=
461 """Optional type.
462
463 Optional[X] is equivalent to Union[X, None].
464 """)
Guido van Rossumb7dedc82016-10-29 12:44:29 -0700465
Ivan Levkivskyib891c462019-05-26 09:37:48 +0100466Literal = _SpecialForm('Literal', doc=
467 """Special typing form to define literal types (a.k.a. value types).
468
469 This form can be used to indicate to type checkers that the corresponding
470 variable or function parameter has a value equivalent to the provided
471 literal (or one of several literals):
472
473 def validate_simple(data: Any) -> Literal[True]: # always returns True
474 ...
475
476 MODE = Literal['r', 'rb', 'w', 'wb']
477 def open_helper(file: str, mode: MODE) -> str:
478 ...
479
480 open_helper('/some/path', 'r') # Passes type check
481 open_helper('/other/path', 'typo') # Error in type checker
482
483 Literal[...] cannot be subclassed. At runtime, an arbitrary value
484 is allowed as type argument to Literal[...], but type checkers may
485 impose restrictions.
486 """)
487
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700488
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000489class ForwardRef(_Final, _root=True):
Guido van Rossumb24569a2016-11-20 18:01:29 -0800490 """Internal wrapper to hold a forward reference."""
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700491
Guido van Rossum4cefe742016-09-27 15:20:12 -0700492 __slots__ = ('__forward_arg__', '__forward_code__',
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400493 '__forward_evaluated__', '__forward_value__',
494 '__forward_is_argument__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700495
Nina Zakharenko0e61dff2018-05-22 20:32:10 -0700496 def __init__(self, arg, is_argument=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700497 if not isinstance(arg, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000498 raise TypeError(f"Forward reference must be a string -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700499 try:
500 code = compile(arg, '<string>', 'eval')
501 except SyntaxError:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000502 raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700503 self.__forward_arg__ = arg
504 self.__forward_code__ = code
505 self.__forward_evaluated__ = False
506 self.__forward_value__ = None
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400507 self.__forward_is_argument__ = is_argument
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700508
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000509 def _evaluate(self, globalns, localns):
Guido van Rossumdad17902016-11-10 08:29:18 -0800510 if not self.__forward_evaluated__ or localns is not globalns:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700511 if globalns is None and localns is None:
512 globalns = localns = {}
513 elif globalns is None:
514 globalns = localns
515 elif localns is None:
516 localns = globalns
517 self.__forward_value__ = _type_check(
518 eval(self.__forward_code__, globalns, localns),
Nina Zakharenko2d2d3b12018-05-16 12:27:03 -0400519 "Forward references must evaluate to types.",
520 is_argument=self.__forward_is_argument__)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700521 self.__forward_evaluated__ = True
522 return self.__forward_value__
523
Guido van Rossum4cefe742016-09-27 15:20:12 -0700524 def __eq__(self, other):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000525 if not isinstance(other, ForwardRef):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700526 return NotImplemented
Miss Islington (bot)e91edfe2019-09-13 13:00:39 -0700527 if self.__forward_evaluated__ and other.__forward_evaluated__:
528 return (self.__forward_arg__ == other.__forward_arg__ and
529 self.__forward_value__ == other.__forward_value__)
530 return self.__forward_arg__ == other.__forward_arg__
Guido van Rossum4cefe742016-09-27 15:20:12 -0700531
532 def __hash__(self):
Miss Islington (bot)e91edfe2019-09-13 13:00:39 -0700533 return hash(self.__forward_arg__)
Guido van Rossum4cefe742016-09-27 15:20:12 -0700534
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700535 def __repr__(self):
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000536 return f'ForwardRef({self.__forward_arg__!r})'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700537
538
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100539class TypeVar(_Final, _Immutable, _root=True):
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700540 """Type variable.
541
542 Usage::
543
544 T = TypeVar('T') # Can be anything
545 A = TypeVar('A', str, bytes) # Must be str or bytes
546
547 Type variables exist primarily for the benefit of static type
548 checkers. They serve as the parameters for generic types as well
549 as for generic function definitions. See class Generic for more
550 information on generic types. Generic functions work as follows:
551
Guido van Rossumb24569a2016-11-20 18:01:29 -0800552 def repeat(x: T, n: int) -> List[T]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700553 '''Return a list containing n references to x.'''
554 return [x]*n
555
556 def longest(x: A, y: A) -> A:
557 '''Return the longest of two strings.'''
558 return x if len(x) >= len(y) else y
559
560 The latter example's signature is essentially the overloading
561 of (str, str) -> str and (bytes, bytes) -> bytes. Also note
562 that if the arguments are instances of some subclass of str,
563 the return type is still plain str.
564
Guido van Rossumb24569a2016-11-20 18:01:29 -0800565 At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700566
Guido van Rossumefa798d2016-08-23 11:01:50 -0700567 Type variables defined with covariant=True or contravariant=True
João D. Ferreira86bfed32018-07-07 16:41:20 +0100568 can be used to declare covariant or contravariant generic types.
Guido van Rossumefa798d2016-08-23 11:01:50 -0700569 See PEP 484 for more details. By default generic types are invariant
570 in all type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700571
572 Type variables can be introspected. e.g.:
573
574 T.__name__ == 'T'
575 T.__constraints__ == ()
576 T.__covariant__ == False
577 T.__contravariant__ = False
578 A.__constraints__ == (str, bytes)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100579
580 Note that only type variables defined in global scope can be pickled.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700581 """
582
Guido van Rossum4cefe742016-09-27 15:20:12 -0700583 __slots__ = ('__name__', '__bound__', '__constraints__',
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300584 '__covariant__', '__contravariant__')
Guido van Rossum4cefe742016-09-27 15:20:12 -0700585
586 def __init__(self, name, *constraints, bound=None,
Guido van Rossumd7adfe12017-01-22 17:43:53 -0800587 covariant=False, contravariant=False):
Guido van Rossum4cefe742016-09-27 15:20:12 -0700588 self.__name__ = name
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700589 if covariant and contravariant:
Guido van Rossumefa798d2016-08-23 11:01:50 -0700590 raise ValueError("Bivariant types are not supported.")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700591 self.__covariant__ = bool(covariant)
592 self.__contravariant__ = bool(contravariant)
593 if constraints and bound is not None:
594 raise TypeError("Constraints cannot be combined with bound=...")
595 if constraints and len(constraints) == 1:
596 raise TypeError("A single constraint is not allowed")
597 msg = "TypeVar(name, constraint, ...): constraints must be types."
598 self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
599 if bound:
600 self.__bound__ = _type_check(bound, "Bound must be a type.")
601 else:
602 self.__bound__ = None
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300603 def_mod = sys._getframe(1).f_globals['__name__'] # for pickling
604 if def_mod != 'typing':
605 self.__module__ = def_mod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700606
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700607 def __repr__(self):
608 if self.__covariant__:
609 prefix = '+'
610 elif self.__contravariant__:
611 prefix = '-'
612 else:
613 prefix = '~'
614 return prefix + self.__name__
615
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100616 def __reduce__(self):
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300617 return self.__name__
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100618
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700619
Guido van Rossum83ec3022017-01-17 20:43:28 -0800620# Special typing constructs Union, Optional, Generic, Callable and Tuple
621# use three special attributes for internal bookkeeping of generic types:
622# * __parameters__ is a tuple of unique free type parameters of a generic
623# type, for example, Dict[T, T].__parameters__ == (T,);
624# * __origin__ keeps a reference to a type that was subscripted,
Ivan Levkivskyi43d12a62018-05-09 02:23:46 +0100625# e.g., Union[T, int].__origin__ == Union, or the non-generic version of
626# the type.
Guido van Rossum83ec3022017-01-17 20:43:28 -0800627# * __args__ is a tuple of all arguments used in subscripting,
628# e.g., Dict[T, int].__args__ == (T, int).
629
Ivan Levkivskyi2a363d22018-04-05 01:25:15 +0100630
631# Mapping from non-generic type names that have a generic alias in typing
632# but with a different name.
633_normalize_alias = {'list': 'List',
634 'tuple': 'Tuple',
635 'dict': 'Dict',
636 'set': 'Set',
637 'frozenset': 'FrozenSet',
638 'deque': 'Deque',
639 'defaultdict': 'DefaultDict',
640 'type': 'Type',
641 'Set': 'AbstractSet'}
642
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000643def _is_dunder(attr):
644 return attr.startswith('__') and attr.endswith('__')
Guido van Rossum83ec3022017-01-17 20:43:28 -0800645
Guido van Rossumb24569a2016-11-20 18:01:29 -0800646
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000647class _GenericAlias(_Final, _root=True):
648 """The central part of internal API.
649
650 This represents a generic version of type 'origin' with type arguments 'params'.
651 There are two kind of these aliases: user defined and special. The special ones
652 are wrappers around builtin collections and ABCs in collections.abc. These must
653 have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
654 this is used by e.g. typing.List and typing.Dict.
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700655 """
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000656 def __init__(self, origin, params, *, inst=True, special=False, name=None):
657 self._inst = inst
658 self._special = special
659 if special and name is None:
660 orig_name = origin.__name__
Ivan Levkivskyi2a363d22018-04-05 01:25:15 +0100661 name = _normalize_alias.get(orig_name, orig_name)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000662 self._name = name
663 if not isinstance(params, tuple):
664 params = (params,)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700665 self.__origin__ = origin
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700666 self.__args__ = tuple(... if a is _TypingEllipsis else
667 () if a is _TypingEmpty else
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000668 a for a in params)
669 self.__parameters__ = _collect_type_vars(params)
670 self.__slots__ = None # This is not documented.
671 if not name:
672 self.__module__ = origin.__module__
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700673
Guido van Rossum4cefe742016-09-27 15:20:12 -0700674 @_tp_cache
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700675 def __getitem__(self, params):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100676 if self.__origin__ in (Generic, Protocol):
677 # Can't subscript Generic[...] or Protocol[...].
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000678 raise TypeError(f"Cannot subscript already-subscripted {self}")
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700679 if not isinstance(params, tuple):
680 params = (params,)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700681 msg = "Parameters to generic types must be types."
682 params = tuple(_type_check(p, msg) for p in params)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000683 _check_generic(self, params)
684 return _subs_tvars(self, self.__parameters__, params)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100685
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000686 def copy_with(self, params):
687 # We don't copy self._special.
688 return _GenericAlias(self.__origin__, params, name=self._name, inst=self._inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700689
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000690 def __repr__(self):
691 if (self._name != 'Callable' or
692 len(self.__args__) == 2 and self.__args__[0] is Ellipsis):
693 if self._name:
694 name = 'typing.' + self._name
695 else:
696 name = _type_repr(self.__origin__)
697 if not self._special:
698 args = f'[{", ".join([_type_repr(a) for a in self.__args__])}]'
699 else:
700 args = ''
701 return (f'{name}{args}')
702 if self._special:
703 return 'typing.Callable'
704 return (f'typing.Callable'
705 f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], '
706 f'{_type_repr(self.__args__[-1])}]')
707
708 def __eq__(self, other):
709 if not isinstance(other, _GenericAlias):
710 return NotImplemented
711 if self.__origin__ != other.__origin__:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100712 return False
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000713 if self.__origin__ is Union and other.__origin__ is Union:
714 return frozenset(self.__args__) == frozenset(other.__args__)
715 return self.__args__ == other.__args__
Ivan Levkivskyib692dc82017-02-13 22:50:14 +0100716
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000717 def __hash__(self):
718 if self.__origin__ is Union:
719 return hash((Union, frozenset(self.__args__)))
720 return hash((self.__origin__, self.__args__))
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700721
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000722 def __call__(self, *args, **kwargs):
723 if not self._inst:
724 raise TypeError(f"Type {self._name} cannot be instantiated; "
725 f"use {self._name.lower()}() instead")
726 result = self.__origin__(*args, **kwargs)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700727 try:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000728 result.__orig_class__ = self
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700729 except AttributeError:
730 pass
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000731 return result
732
733 def __mro_entries__(self, bases):
734 if self._name: # generic version of an ABC or built-in class
735 res = []
736 if self.__origin__ not in bases:
737 res.append(self.__origin__)
738 i = bases.index(self)
739 if not any(isinstance(b, _GenericAlias) or issubclass(b, Generic)
740 for b in bases[i+1:]):
741 res.append(Generic)
742 return tuple(res)
743 if self.__origin__ is Generic:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100744 if Protocol in bases:
745 return ()
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000746 i = bases.index(self)
747 for b in bases[i+1:]:
748 if isinstance(b, _GenericAlias) and b is not self:
749 return ()
750 return (self.__origin__,)
751
752 def __getattr__(self, attr):
Ville Skyttä61f82e02018-04-20 23:08:45 +0300753 # We are careful for copy and pickle.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000754 # Also for simplicity we just don't relay all dunder names
755 if '__origin__' in self.__dict__ and not _is_dunder(attr):
756 return getattr(self.__origin__, attr)
757 raise AttributeError(attr)
758
759 def __setattr__(self, attr, val):
760 if _is_dunder(attr) or attr in ('_name', '_inst', '_special'):
761 super().__setattr__(attr, val)
762 else:
763 setattr(self.__origin__, attr, val)
764
765 def __instancecheck__(self, obj):
766 return self.__subclasscheck__(type(obj))
767
768 def __subclasscheck__(self, cls):
769 if self._special:
770 if not isinstance(cls, _GenericAlias):
771 return issubclass(cls, self.__origin__)
772 if cls._special:
773 return issubclass(cls.__origin__, self.__origin__)
774 raise TypeError("Subscripted generics cannot be used with"
775 " class and instance checks")
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700776
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100777 def __reduce__(self):
778 if self._special:
779 return self._name
Serhiy Storchaka09f32212018-05-26 21:19:26 +0300780
781 if self._name:
782 origin = globals()[self._name]
783 else:
784 origin = self.__origin__
785 if (origin is Callable and
786 not (len(self.__args__) == 2 and self.__args__[0] is Ellipsis)):
787 args = list(self.__args__[:-1]), self.__args__[-1]
788 else:
789 args = tuple(self.__args__)
790 if len(args) == 1 and not isinstance(args[0], tuple):
791 args, = args
792 return operator.getitem, (origin, args)
Ivan Levkivskyi83494032018-03-26 23:01:12 +0100793
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700794
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000795class _VariadicGenericAlias(_GenericAlias, _root=True):
796 """Same as _GenericAlias above but for variadic aliases. Currently,
797 this is used only by special internal aliases: Tuple and Callable.
798 """
799 def __getitem__(self, params):
800 if self._name != 'Callable' or not self._special:
801 return self.__getitem_inner__(params)
802 if not isinstance(params, tuple) or len(params) != 2:
803 raise TypeError("Callable must be used as "
804 "Callable[[arg, ...], result].")
805 args, result = params
806 if args is Ellipsis:
807 params = (Ellipsis, result)
808 else:
809 if not isinstance(args, list):
810 raise TypeError(f"Callable[args, result]: args must be a list."
811 f" Got {args}")
812 params = (tuple(args), result)
813 return self.__getitem_inner__(params)
814
815 @_tp_cache
816 def __getitem_inner__(self, params):
817 if self.__origin__ is tuple and self._special:
818 if params == ():
819 return self.copy_with((_TypingEmpty,))
820 if not isinstance(params, tuple):
821 params = (params,)
822 if len(params) == 2 and params[1] is ...:
823 msg = "Tuple[t, ...]: t must be a type."
824 p = _type_check(params[0], msg)
825 return self.copy_with((p, _TypingEllipsis))
826 msg = "Tuple[t0, t1, ...]: each t must be a type."
827 params = tuple(_type_check(p, msg) for p in params)
828 return self.copy_with(params)
829 if self.__origin__ is collections.abc.Callable and self._special:
830 args, result = params
831 msg = "Callable[args, result]: result must be a type."
832 result = _type_check(result, msg)
833 if args is Ellipsis:
834 return self.copy_with((_TypingEllipsis, result))
835 msg = "Callable[[arg, ...], result]: each arg must be a type."
836 args = tuple(_type_check(arg, msg) for arg in args)
837 params = args + (result,)
838 return self.copy_with(params)
839 return super().__getitem__(params)
840
841
842class Generic:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700843 """Abstract base class for generic types.
844
Guido van Rossumb24569a2016-11-20 18:01:29 -0800845 A generic type is typically declared by inheriting from
846 this class parameterized with one or more type variables.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700847 For example, a generic mapping type might be defined as::
848
849 class Mapping(Generic[KT, VT]):
850 def __getitem__(self, key: KT) -> VT:
851 ...
852 # Etc.
853
854 This class can then be used as follows::
855
Guido van Rossumbd5b9a02016-04-05 08:28:52 -0700856 def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700857 try:
858 return mapping[key]
859 except KeyError:
860 return default
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700861 """
Guido van Rossumd70fe632015-08-05 12:11:06 +0200862 __slots__ = ()
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100863 _is_protocol = False
Guido van Rossumd70fe632015-08-05 12:11:06 +0200864
Guido van Rossum46dbb7d2015-05-22 10:14:11 -0700865 def __new__(cls, *args, **kwds):
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100866 if cls in (Generic, Protocol):
867 raise TypeError(f"Type {cls.__name__} cannot be instantiated; "
Guido van Rossum62fe1bb2016-10-29 16:05:26 -0700868 "it can be used only as a base class")
Ivan Levkivskyib551e9f2018-05-10 23:10:10 -0400869 if super().__new__ is object.__new__ and cls.__init__ is not object.__init__:
Ivan Levkivskyi43d12a62018-05-09 02:23:46 +0100870 obj = super().__new__(cls)
871 else:
872 obj = super().__new__(cls, *args, **kwds)
873 return obj
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000874
875 @_tp_cache
876 def __class_getitem__(cls, params):
877 if not isinstance(params, tuple):
878 params = (params,)
879 if not params and cls is not Tuple:
880 raise TypeError(
881 f"Parameter list to {cls.__qualname__}[...] cannot be empty")
882 msg = "Parameters to generic types must be types."
883 params = tuple(_type_check(p, msg) for p in params)
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100884 if cls in (Generic, Protocol):
885 # Generic and Protocol can only be subscripted with unique type variables.
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000886 if not all(isinstance(p, TypeVar) for p in params):
887 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100888 f"Parameters to {cls.__name__}[...] must all be type variables")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000889 if len(set(params)) != len(params):
890 raise TypeError(
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100891 f"Parameters to {cls.__name__}[...] must all be unique")
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000892 else:
893 # Subscripting a regular Generic subclass.
894 _check_generic(cls, params)
895 return _GenericAlias(cls, params)
896
897 def __init_subclass__(cls, *args, **kwargs):
Ivan Levkivskyiee566fe2018-04-04 17:00:15 +0100898 super().__init_subclass__(*args, **kwargs)
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000899 tvars = []
900 if '__orig_bases__' in cls.__dict__:
901 error = Generic in cls.__orig_bases__
902 else:
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100903 error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000904 if error:
905 raise TypeError("Cannot inherit from plain Generic")
906 if '__orig_bases__' in cls.__dict__:
907 tvars = _collect_type_vars(cls.__orig_bases__)
908 # Look for Generic[T1, ..., Tn].
909 # If found, tvars must be a subset of it.
910 # If not found, tvars is it.
911 # Also check for and reject plain Generic,
912 # and reject multiple Generic[...].
913 gvars = None
914 for base in cls.__orig_bases__:
915 if (isinstance(base, _GenericAlias) and
916 base.__origin__ is Generic):
917 if gvars is not None:
918 raise TypeError(
919 "Cannot inherit from Generic[...] multiple types.")
920 gvars = base.__parameters__
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100921 if gvars is not None:
Ivan Levkivskyid911e402018-01-20 11:23:59 +0000922 tvarset = set(tvars)
923 gvarset = set(gvars)
924 if not tvarset <= gvarset:
925 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
926 s_args = ', '.join(str(g) for g in gvars)
927 raise TypeError(f"Some type variables ({s_vars}) are"
928 f" not listed in Generic[{s_args}]")
929 tvars = gvars
930 cls.__parameters__ = tuple(tvars)
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700931
932
933class _TypingEmpty:
Guido van Rossumb24569a2016-11-20 18:01:29 -0800934 """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
935 to allow empty list/tuple in specific places, without allowing them
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700936 to sneak in where prohibited.
937 """
938
939
940class _TypingEllipsis:
Guido van Rossumb24569a2016-11-20 18:01:29 -0800941 """Internal placeholder for ... (ellipsis)."""
Guido van Rossum5fc25a82016-10-29 08:54:56 -0700942
943
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +0100944_TYPING_INTERNALS = ['__parameters__', '__orig_bases__', '__orig_class__',
945 '_is_protocol', '_is_runtime_protocol']
946
947_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
948 '__init__', '__module__', '__new__', '__slots__',
949 '__subclasshook__', '__weakref__']
950
951# These special attributes will be not collected as protocol members.
952EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
953
954
955def _get_protocol_attrs(cls):
956 """Collect protocol members from a protocol class objects.
957
958 This includes names actually defined in the class dictionary, as well
959 as names that appear in annotations. Special names (above) are skipped.
960 """
961 attrs = set()
962 for base in cls.__mro__[:-1]: # without object
963 if base.__name__ in ('Protocol', 'Generic'):
964 continue
965 annotations = getattr(base, '__annotations__', {})
966 for attr in list(base.__dict__.keys()) + list(annotations.keys()):
967 if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
968 attrs.add(attr)
969 return attrs
970
971
972def _is_callable_members_only(cls):
973 # PEP 544 prohibits using issubclass() with protocols that have non-method members.
974 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
975
976
977def _no_init(self, *args, **kwargs):
978 if type(self)._is_protocol:
979 raise TypeError('Protocols cannot be instantiated')
980
981
982def _allow_reckless_class_cheks():
983 """Allow instnance and class checks for special stdlib modules.
984
985 The abc and functools modules indiscriminately call isinstance() and
986 issubclass() on the whole MRO of a user class, which may contain protocols.
987 """
988 try:
989 return sys._getframe(3).f_globals['__name__'] in ['abc', 'functools']
990 except (AttributeError, ValueError): # For platforms without _getframe().
991 return True
992
993
Miss Islington (bot)52baf902019-09-12 03:32:36 -0700994_PROTO_WHITELIST = {
995 'collections.abc': [
996 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
997 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
998 ],
999 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
1000}
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001001
1002
1003class _ProtocolMeta(ABCMeta):
1004 # This metaclass is really unfortunate and exists only because of
1005 # the lack of __instancehook__.
1006 def __instancecheck__(cls, instance):
1007 # We need this method for situations where attributes are
1008 # assigned in __init__.
1009 if ((not getattr(cls, '_is_protocol', False) or
1010 _is_callable_members_only(cls)) and
1011 issubclass(instance.__class__, cls)):
1012 return True
1013 if cls._is_protocol:
1014 if all(hasattr(instance, attr) and
1015 # All *methods* can be blocked by setting them to None.
1016 (not callable(getattr(cls, attr, None)) or
1017 getattr(instance, attr) is not None)
1018 for attr in _get_protocol_attrs(cls)):
1019 return True
1020 return super().__instancecheck__(instance)
1021
1022
1023class Protocol(Generic, metaclass=_ProtocolMeta):
1024 """Base class for protocol classes.
1025
1026 Protocol classes are defined as::
1027
1028 class Proto(Protocol):
1029 def meth(self) -> int:
1030 ...
1031
1032 Such classes are primarily used with static type checkers that recognize
1033 structural subtyping (static duck-typing), for example::
1034
1035 class C:
1036 def meth(self) -> int:
1037 return 0
1038
1039 def func(x: Proto) -> int:
1040 return x.meth()
1041
1042 func(C()) # Passes static type check
1043
1044 See PEP 544 for details. Protocol classes decorated with
1045 @typing.runtime_checkable act as simple-minded runtime protocols that check
1046 only the presence of given attributes, ignoring their type signatures.
1047 Protocol classes can be generic, they are defined as::
1048
1049 class GenProto(Protocol[T]):
1050 def meth(self) -> T:
1051 ...
1052 """
1053 __slots__ = ()
1054 _is_protocol = True
1055 _is_runtime_protocol = False
1056
1057 def __init_subclass__(cls, *args, **kwargs):
1058 super().__init_subclass__(*args, **kwargs)
1059
1060 # Determine if this is a protocol or a concrete subclass.
1061 if not cls.__dict__.get('_is_protocol', False):
1062 cls._is_protocol = any(b is Protocol for b in cls.__bases__)
1063
1064 # Set (or override) the protocol subclass hook.
1065 def _proto_hook(other):
1066 if not cls.__dict__.get('_is_protocol', False):
1067 return NotImplemented
1068
1069 # First, perform various sanity checks.
1070 if not getattr(cls, '_is_runtime_protocol', False):
1071 if _allow_reckless_class_cheks():
1072 return NotImplemented
1073 raise TypeError("Instance and class checks can only be used with"
1074 " @runtime_checkable protocols")
1075 if not _is_callable_members_only(cls):
1076 if _allow_reckless_class_cheks():
1077 return NotImplemented
1078 raise TypeError("Protocols with non-method members"
1079 " don't support issubclass()")
1080 if not isinstance(other, type):
1081 # Same error message as for issubclass(1, int).
1082 raise TypeError('issubclass() arg 1 must be a class')
1083
1084 # Second, perform the actual structural compatibility check.
1085 for attr in _get_protocol_attrs(cls):
1086 for base in other.__mro__:
1087 # Check if the members appears in the class dictionary...
1088 if attr in base.__dict__:
1089 if base.__dict__[attr] is None:
1090 return NotImplemented
1091 break
1092
1093 # ...or in annotations, if it is a sub-protocol.
1094 annotations = getattr(base, '__annotations__', {})
1095 if (isinstance(annotations, collections.abc.Mapping) and
1096 attr in annotations and
1097 issubclass(other, Generic) and other._is_protocol):
1098 break
1099 else:
1100 return NotImplemented
1101 return True
1102
1103 if '__subclasshook__' not in cls.__dict__:
1104 cls.__subclasshook__ = _proto_hook
1105
1106 # We have nothing more to do for non-protocols...
1107 if not cls._is_protocol:
1108 return
1109
1110 # ... otherwise check consistency of bases, and prohibit instantiation.
1111 for base in cls.__bases__:
1112 if not (base in (object, Generic) or
Miss Islington (bot)52baf902019-09-12 03:32:36 -07001113 base.__module__ in _PROTO_WHITELIST and
1114 base.__name__ in _PROTO_WHITELIST[base.__module__] or
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001115 issubclass(base, Generic) and base._is_protocol):
1116 raise TypeError('Protocols can only inherit from other'
1117 ' protocols, got %r' % base)
1118 cls.__init__ = _no_init
1119
1120
1121def runtime_checkable(cls):
1122 """Mark a protocol class as a runtime protocol.
1123
1124 Such protocol can be used with isinstance() and issubclass().
1125 Raise TypeError if applied to a non-protocol class.
1126 This allows a simple-minded structural check very similar to
1127 one trick ponies in collections.abc such as Iterable.
1128 For example::
1129
1130 @runtime_checkable
1131 class Closable(Protocol):
1132 def close(self): ...
1133
1134 assert isinstance(open('/some/file'), Closable)
1135
1136 Warning: this will check only the presence of the required methods,
1137 not their type signatures!
1138 """
1139 if not issubclass(cls, Generic) or not cls._is_protocol:
1140 raise TypeError('@runtime_checkable can be only applied to protocol classes,'
1141 ' got %r' % cls)
1142 cls._is_runtime_protocol = True
1143 return cls
1144
1145
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001146def cast(typ, val):
1147 """Cast a value to a type.
1148
1149 This returns the value unchanged. To the type checker this
1150 signals that the return value has the designated type, but at
1151 runtime we intentionally don't check anything (we want this
1152 to be as fast as possible).
1153 """
1154 return val
1155
1156
1157def _get_defaults(func):
1158 """Internal helper to extract the default arguments, by name."""
Guido van Rossum991d14f2016-11-09 13:12:51 -08001159 try:
1160 code = func.__code__
1161 except AttributeError:
1162 # Some built-in functions don't have __code__, __defaults__, etc.
1163 return {}
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001164 pos_count = code.co_argcount
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001165 arg_names = code.co_varnames
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001166 arg_names = arg_names[:pos_count]
1167 defaults = func.__defaults__ or ()
1168 kwdefaults = func.__kwdefaults__
1169 res = dict(kwdefaults) if kwdefaults else {}
1170 pos_offset = pos_count - len(defaults)
1171 for name, value in zip(arg_names[pos_offset:], defaults):
1172 assert name not in res
1173 res[name] = value
1174 return res
1175
1176
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001177_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
1178 types.MethodType, types.ModuleType,
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001179 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001180
1181
Guido van Rossum991d14f2016-11-09 13:12:51 -08001182def get_type_hints(obj, globalns=None, localns=None):
1183 """Return type hints for an object.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001184
Guido van Rossum991d14f2016-11-09 13:12:51 -08001185 This is often the same as obj.__annotations__, but it handles
1186 forward references encoded as string literals, and if necessary
1187 adds Optional[t] if a default value equal to None is set.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001188
Guido van Rossum991d14f2016-11-09 13:12:51 -08001189 The argument may be a module, class, method, or function. The annotations
1190 are returned as a dictionary. For classes, annotations include also
1191 inherited members.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001192
Guido van Rossum991d14f2016-11-09 13:12:51 -08001193 TypeError is raised if the argument is not of a type that can contain
1194 annotations, and an empty dictionary is returned if no annotations are
1195 present.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001196
Guido van Rossum991d14f2016-11-09 13:12:51 -08001197 BEWARE -- the behavior of globalns and localns is counterintuitive
1198 (unless you are familiar with how eval() and exec() work). The
1199 search order is locals first, then globals.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001200
Guido van Rossum991d14f2016-11-09 13:12:51 -08001201 - If no dict arguments are passed, an attempt is made to use the
Łukasz Langaf350a262017-09-14 14:33:00 -04001202 globals from obj (or the respective module's globals for classes),
1203 and these are also used as the locals. If the object does not appear
1204 to have globals, an empty dictionary is used.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001205
Guido van Rossum991d14f2016-11-09 13:12:51 -08001206 - If one dict argument is passed, it is used for both globals and
1207 locals.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001208
Guido van Rossum991d14f2016-11-09 13:12:51 -08001209 - If two dict arguments are passed, they specify globals and
1210 locals, respectively.
1211 """
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001212
Guido van Rossum991d14f2016-11-09 13:12:51 -08001213 if getattr(obj, '__no_type_check__', None):
1214 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001215 # Classes require a special treatment.
1216 if isinstance(obj, type):
1217 hints = {}
1218 for base in reversed(obj.__mro__):
Łukasz Langaf350a262017-09-14 14:33:00 -04001219 if globalns is None:
1220 base_globals = sys.modules[base.__module__].__dict__
1221 else:
1222 base_globals = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001223 ann = base.__dict__.get('__annotations__', {})
1224 for name, value in ann.items():
1225 if value is None:
1226 value = type(None)
1227 if isinstance(value, str):
Nina Zakharenko0e61dff2018-05-22 20:32:10 -07001228 value = ForwardRef(value, is_argument=False)
Łukasz Langaf350a262017-09-14 14:33:00 -04001229 value = _eval_type(value, base_globals, localns)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001230 hints[name] = value
1231 return hints
Łukasz Langaf350a262017-09-14 14:33:00 -04001232
1233 if globalns is None:
1234 if isinstance(obj, types.ModuleType):
1235 globalns = obj.__dict__
1236 else:
1237 globalns = getattr(obj, '__globals__', {})
1238 if localns is None:
1239 localns = globalns
1240 elif localns is None:
1241 localns = globalns
Guido van Rossum991d14f2016-11-09 13:12:51 -08001242 hints = getattr(obj, '__annotations__', None)
1243 if hints is None:
1244 # Return empty annotations for something that _could_ have them.
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001245 if isinstance(obj, _allowed_types):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001246 return {}
Guido van Rossum991d14f2016-11-09 13:12:51 -08001247 else:
1248 raise TypeError('{!r} is not a module, class, method, '
1249 'or function.'.format(obj))
1250 defaults = _get_defaults(obj)
1251 hints = dict(hints)
1252 for name, value in hints.items():
1253 if value is None:
1254 value = type(None)
1255 if isinstance(value, str):
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001256 value = ForwardRef(value)
Guido van Rossum991d14f2016-11-09 13:12:51 -08001257 value = _eval_type(value, globalns, localns)
1258 if name in defaults and defaults[name] is None:
1259 value = Optional[value]
1260 hints[name] = value
1261 return hints
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001262
1263
Ivan Levkivskyi4c23aff2019-05-31 00:10:07 +01001264def get_origin(tp):
1265 """Get the unsubscripted version of a type.
1266
1267 This supports generic types, Callable, Tuple, Union, Literal, Final and ClassVar.
1268 Return None for unsupported types. Examples::
1269
1270 get_origin(Literal[42]) is Literal
1271 get_origin(int) is None
1272 get_origin(ClassVar[int]) is ClassVar
1273 get_origin(Generic) is Generic
1274 get_origin(Generic[T]) is Generic
1275 get_origin(Union[T, int]) is Union
1276 get_origin(List[Tuple[T, T]][int]) == list
1277 """
1278 if isinstance(tp, _GenericAlias):
1279 return tp.__origin__
1280 if tp is Generic:
1281 return Generic
1282 return None
1283
1284
1285def get_args(tp):
1286 """Get type arguments with all substitutions performed.
1287
1288 For unions, basic simplifications used by Union constructor are performed.
1289 Examples::
1290 get_args(Dict[str, int]) == (str, int)
1291 get_args(int) == ()
1292 get_args(Union[int, Union[T, int], str][int]) == (int, str)
1293 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
1294 get_args(Callable[[], T][int]) == ([], int)
1295 """
1296 if isinstance(tp, _GenericAlias):
1297 res = tp.__args__
1298 if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis:
1299 res = (list(res[:-1]), res[-1])
1300 return res
1301 return ()
1302
1303
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001304def no_type_check(arg):
1305 """Decorator to indicate that annotations are not type hints.
1306
1307 The argument must be a class or function; if it is a class, it
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001308 applies recursively to all methods and classes defined in that class
1309 (but not to methods defined in its superclasses or subclasses).
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001310
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001311 This mutates the function(s) or class(es) in place.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001312 """
1313 if isinstance(arg, type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001314 arg_attrs = arg.__dict__.copy()
1315 for attr, val in arg.__dict__.items():
Ivan Levkivskyi65bc6202017-09-14 01:25:15 +02001316 if val in arg.__bases__ + (arg,):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001317 arg_attrs.pop(attr)
1318 for obj in arg_attrs.values():
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001319 if isinstance(obj, types.FunctionType):
1320 obj.__no_type_check__ = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001321 if isinstance(obj, type):
1322 no_type_check(obj)
1323 try:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001324 arg.__no_type_check__ = True
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001325 except TypeError: # built-in classes
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001326 pass
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001327 return arg
1328
1329
1330def no_type_check_decorator(decorator):
1331 """Decorator to give another decorator the @no_type_check effect.
1332
1333 This wraps the decorator with something that wraps the decorated
1334 function in @no_type_check.
1335 """
1336
1337 @functools.wraps(decorator)
1338 def wrapped_decorator(*args, **kwds):
1339 func = decorator(*args, **kwds)
1340 func = no_type_check(func)
1341 return func
1342
1343 return wrapped_decorator
1344
1345
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001346def _overload_dummy(*args, **kwds):
1347 """Helper for @overload to raise when called."""
1348 raise NotImplementedError(
1349 "You should not call an overloaded function. "
1350 "A series of @overload-decorated functions "
1351 "outside a stub module should always be followed "
1352 "by an implementation that is not @overload-ed.")
1353
1354
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001355def overload(func):
Guido van Rossumbd5b9a02016-04-05 08:28:52 -07001356 """Decorator for overloaded functions/methods.
1357
1358 In a stub file, place two or more stub definitions for the same
1359 function in a row, each decorated with @overload. For example:
1360
1361 @overload
1362 def utf8(value: None) -> None: ...
1363 @overload
1364 def utf8(value: bytes) -> bytes: ...
1365 @overload
1366 def utf8(value: str) -> bytes: ...
1367
1368 In a non-stub file (i.e. a regular .py file), do the same but
1369 follow it with an implementation. The implementation should *not*
1370 be decorated with @overload. For example:
1371
1372 @overload
1373 def utf8(value: None) -> None: ...
1374 @overload
1375 def utf8(value: bytes) -> bytes: ...
1376 @overload
1377 def utf8(value: str) -> bytes: ...
1378 def utf8(value):
1379 # implementation goes here
1380 """
1381 return _overload_dummy
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001382
1383
Ivan Levkivskyif3672422019-05-26 09:37:07 +01001384def final(f):
1385 """A decorator to indicate final methods and final classes.
1386
1387 Use this decorator to indicate to type checkers that the decorated
1388 method cannot be overridden, and decorated class cannot be subclassed.
1389 For example:
1390
1391 class Base:
1392 @final
1393 def done(self) -> None:
1394 ...
1395 class Sub(Base):
1396 def done(self) -> None: # Error reported by type checker
1397 ...
1398
1399 @final
1400 class Leaf:
1401 ...
1402 class Other(Leaf): # Error reported by type checker
1403 ...
1404
1405 There is no runtime checking of these properties.
1406 """
1407 return f
1408
1409
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001410# Some unconstrained type variables. These are used by the container types.
1411# (These are not for export.)
1412T = TypeVar('T') # Any type.
1413KT = TypeVar('KT') # Key type.
1414VT = TypeVar('VT') # Value type.
1415T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
1416V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
1417VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
1418T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
1419# Internal type variable used for Type[].
1420CT_co = TypeVar('CT_co', covariant=True, bound=type)
1421
1422# A useful type variable with constraints. This represents string types.
1423# (This one *is* for export!)
1424AnyStr = TypeVar('AnyStr', bytes, str)
1425
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001426
1427# Various ABCs mimicking those in collections.abc.
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001428def _alias(origin, params, inst=True):
1429 return _GenericAlias(origin, params, special=True, inst=inst)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001430
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001431Hashable = _alias(collections.abc.Hashable, ()) # Not generic.
1432Awaitable = _alias(collections.abc.Awaitable, T_co)
1433Coroutine = _alias(collections.abc.Coroutine, (T_co, T_contra, V_co))
1434AsyncIterable = _alias(collections.abc.AsyncIterable, T_co)
1435AsyncIterator = _alias(collections.abc.AsyncIterator, T_co)
1436Iterable = _alias(collections.abc.Iterable, T_co)
1437Iterator = _alias(collections.abc.Iterator, T_co)
1438Reversible = _alias(collections.abc.Reversible, T_co)
1439Sized = _alias(collections.abc.Sized, ()) # Not generic.
1440Container = _alias(collections.abc.Container, T_co)
1441Collection = _alias(collections.abc.Collection, T_co)
1442Callable = _VariadicGenericAlias(collections.abc.Callable, (), special=True)
1443Callable.__doc__ = \
1444 """Callable type; Callable[[int], str] is a function of (int) -> str.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001445
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001446 The subscription syntax must always be used with exactly two
1447 values: the argument list and the return type. The argument list
1448 must be a list of types or ellipsis; the return type must be a single type.
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001449
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001450 There is no syntax to indicate optional or keyword arguments,
1451 such function types are rarely used as callback types.
1452 """
1453AbstractSet = _alias(collections.abc.Set, T_co)
1454MutableSet = _alias(collections.abc.MutableSet, T)
1455# NOTE: Mapping is only covariant in the value type.
1456Mapping = _alias(collections.abc.Mapping, (KT, VT_co))
1457MutableMapping = _alias(collections.abc.MutableMapping, (KT, VT))
1458Sequence = _alias(collections.abc.Sequence, T_co)
1459MutableSequence = _alias(collections.abc.MutableSequence, T)
1460ByteString = _alias(collections.abc.ByteString, ()) # Not generic
1461Tuple = _VariadicGenericAlias(tuple, (), inst=False, special=True)
1462Tuple.__doc__ = \
1463 """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001464
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001465 Example: Tuple[T1, T2] is a tuple of two elements corresponding
1466 to type variables T1 and T2. Tuple[int, float, str] is a tuple
1467 of an int, a float and a string.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001468
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001469 To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
1470 """
1471List = _alias(list, T, inst=False)
1472Deque = _alias(collections.deque, T)
1473Set = _alias(set, T, inst=False)
1474FrozenSet = _alias(frozenset, T_co, inst=False)
1475MappingView = _alias(collections.abc.MappingView, T_co)
1476KeysView = _alias(collections.abc.KeysView, KT)
1477ItemsView = _alias(collections.abc.ItemsView, (KT, VT_co))
1478ValuesView = _alias(collections.abc.ValuesView, VT_co)
1479ContextManager = _alias(contextlib.AbstractContextManager, T_co)
1480AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, T_co)
1481Dict = _alias(dict, (KT, VT), inst=False)
1482DefaultDict = _alias(collections.defaultdict, (KT, VT))
Ismo Toijala68b56d02018-12-02 17:53:14 +02001483OrderedDict = _alias(collections.OrderedDict, (KT, VT))
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001484Counter = _alias(collections.Counter, T)
1485ChainMap = _alias(collections.ChainMap, (KT, VT))
1486Generator = _alias(collections.abc.Generator, (T_co, T_contra, V_co))
1487AsyncGenerator = _alias(collections.abc.AsyncGenerator, (T_co, T_contra))
1488Type = _alias(type, CT_co, inst=False)
1489Type.__doc__ = \
1490 """A special construct usable to annotate class objects.
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001491
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001492 For example, suppose we have the following classes::
Guido van Rossum62fe1bb2016-10-29 16:05:26 -07001493
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001494 class User: ... # Abstract base for User classes
1495 class BasicUser(User): ...
1496 class ProUser(User): ...
1497 class TeamUser(User): ...
Guido van Rossumf17c2002015-12-03 17:31:24 -08001498
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001499 And a function that takes a class argument that's a subclass of
1500 User and returns an instance of the corresponding class::
Guido van Rossumf17c2002015-12-03 17:31:24 -08001501
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001502 U = TypeVar('U', bound=User)
1503 def new_user(user_class: Type[U]) -> U:
1504 user = user_class()
1505 # (Here we could write the user object to a database)
1506 return user
Guido van Rossumf17c2002015-12-03 17:31:24 -08001507
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001508 joe = new_user(BasicUser)
Guido van Rossumf17c2002015-12-03 17:31:24 -08001509
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001510 At this point the type checker knows that joe has type BasicUser.
1511 """
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001512
1513
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001514@runtime_checkable
1515class SupportsInt(Protocol):
Miss Islington (bot)71624402019-10-08 07:14:57 -07001516 """An ABC with one abstract method __int__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001517 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001518
1519 @abstractmethod
1520 def __int__(self) -> int:
1521 pass
1522
1523
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001524@runtime_checkable
1525class SupportsFloat(Protocol):
Miss Islington (bot)71624402019-10-08 07:14:57 -07001526 """An ABC with one abstract method __float__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001527 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001528
1529 @abstractmethod
1530 def __float__(self) -> float:
1531 pass
1532
1533
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001534@runtime_checkable
1535class SupportsComplex(Protocol):
Miss Islington (bot)71624402019-10-08 07:14:57 -07001536 """An ABC with one abstract method __complex__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001537 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001538
1539 @abstractmethod
1540 def __complex__(self) -> complex:
1541 pass
1542
1543
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001544@runtime_checkable
1545class SupportsBytes(Protocol):
Miss Islington (bot)71624402019-10-08 07:14:57 -07001546 """An ABC with one abstract method __bytes__."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001547 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001548
1549 @abstractmethod
1550 def __bytes__(self) -> bytes:
1551 pass
1552
1553
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001554@runtime_checkable
1555class SupportsIndex(Protocol):
Miss Islington (bot)71624402019-10-08 07:14:57 -07001556 """An ABC with one abstract method __index__."""
Paul Dagnelie4c7a46e2019-05-22 07:23:01 -07001557 __slots__ = ()
1558
1559 @abstractmethod
1560 def __index__(self) -> int:
1561 pass
1562
1563
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001564@runtime_checkable
1565class SupportsAbs(Protocol[T_co]):
Miss Islington (bot)71624402019-10-08 07:14:57 -07001566 """An ABC with one abstract method __abs__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001567 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001568
1569 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02001570 def __abs__(self) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001571 pass
1572
1573
Ivan Levkivskyi74d7f762019-05-28 08:40:15 +01001574@runtime_checkable
1575class SupportsRound(Protocol[T_co]):
Miss Islington (bot)71624402019-10-08 07:14:57 -07001576 """An ABC with one abstract method __round__ that is covariant in its return type."""
Guido van Rossumd70fe632015-08-05 12:11:06 +02001577 __slots__ = ()
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001578
1579 @abstractmethod
Guido van Rossumd70fe632015-08-05 12:11:06 +02001580 def __round__(self, ndigits: int = 0) -> T_co:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001581 pass
1582
1583
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001584def _make_nmtuple(name, types):
Guido van Rossum2f841442016-11-15 09:48:06 -08001585 msg = "NamedTuple('Name', [(f0, t0), (f1, t1), ...]); each t must be a type"
1586 types = [(n, _type_check(t, msg)) for n, t in types]
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001587 nm_tpl = collections.namedtuple(name, [n for n, t in types])
Guido van Rossum83ec3022017-01-17 20:43:28 -08001588 # Prior to PEP 526, only _field_types attribute was assigned.
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07001589 # Now __annotations__ are used and _field_types is deprecated (remove in 3.9)
1590 nm_tpl.__annotations__ = nm_tpl._field_types = dict(types)
Guido van Rossum557d1eb2015-11-19 08:16:31 -08001591 try:
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001592 nm_tpl.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__')
Guido van Rossum557d1eb2015-11-19 08:16:31 -08001593 except (AttributeError, ValueError):
1594 pass
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001595 return nm_tpl
1596
1597
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001598# attributes prohibited to set in NamedTuple class syntax
1599_prohibited = ('__new__', '__init__', '__slots__', '__getnewargs__',
1600 '_fields', '_field_defaults', '_field_types',
Ivan Levkivskyif06e0212017-05-02 19:14:07 +02001601 '_make', '_replace', '_asdict', '_source')
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001602
Miss Islington (bot)10b475a2019-10-08 07:12:38 -07001603_special = ('__module__', '__name__', '__annotations__')
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001604
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001605
Guido van Rossum2f841442016-11-15 09:48:06 -08001606class NamedTupleMeta(type):
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001607
Guido van Rossum2f841442016-11-15 09:48:06 -08001608 def __new__(cls, typename, bases, ns):
1609 if ns.get('_root', False):
1610 return super().__new__(cls, typename, bases, ns)
Guido van Rossum2f841442016-11-15 09:48:06 -08001611 types = ns.get('__annotations__', {})
Guido van Rossum3c268be2017-01-18 08:03:50 -08001612 nm_tpl = _make_nmtuple(typename, types.items())
1613 defaults = []
1614 defaults_dict = {}
1615 for field_name in types:
1616 if field_name in ns:
1617 default_value = ns[field_name]
1618 defaults.append(default_value)
1619 defaults_dict[field_name] = default_value
1620 elif defaults:
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001621 raise TypeError("Non-default namedtuple field {field_name} cannot "
1622 "follow default field(s) {default_names}"
Guido van Rossum3c268be2017-01-18 08:03:50 -08001623 .format(field_name=field_name,
1624 default_names=', '.join(defaults_dict.keys())))
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07001625 nm_tpl.__new__.__annotations__ = dict(types)
Guido van Rossum3c268be2017-01-18 08:03:50 -08001626 nm_tpl.__new__.__defaults__ = tuple(defaults)
1627 nm_tpl._field_defaults = defaults_dict
Guido van Rossum95919c02017-01-22 17:47:20 -08001628 # update from user namespace without overriding special namedtuple attributes
1629 for key in ns:
Ivan Levkivskyib692dc82017-02-13 22:50:14 +01001630 if key in _prohibited:
1631 raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
1632 elif key not in _special and key not in nm_tpl._fields:
Guido van Rossum95919c02017-01-22 17:47:20 -08001633 setattr(nm_tpl, key, ns[key])
Guido van Rossum3c268be2017-01-18 08:03:50 -08001634 return nm_tpl
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001635
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001636
Guido van Rossum2f841442016-11-15 09:48:06 -08001637class NamedTuple(metaclass=NamedTupleMeta):
1638 """Typed version of namedtuple.
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001639
Guido van Rossum2f841442016-11-15 09:48:06 -08001640 Usage in Python versions >= 3.6::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001641
Guido van Rossum2f841442016-11-15 09:48:06 -08001642 class Employee(NamedTuple):
1643 name: str
1644 id: int
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001645
Guido van Rossum2f841442016-11-15 09:48:06 -08001646 This is equivalent to::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001647
Guido van Rossum2f841442016-11-15 09:48:06 -08001648 Employee = collections.namedtuple('Employee', ['name', 'id'])
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001649
Raymond Hettingerf7b57df2019-03-18 09:53:56 -07001650 The resulting class has an extra __annotations__ attribute, giving a
1651 dict that maps field names to types. (The field names are also in
1652 the _fields attribute, which is part of the namedtuple API.)
1653 Alternative equivalent keyword syntax is also accepted::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001654
Guido van Rossum2f841442016-11-15 09:48:06 -08001655 Employee = NamedTuple('Employee', name=str, id=int)
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001656
Guido van Rossum2f841442016-11-15 09:48:06 -08001657 In Python versions <= 3.5 use::
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001658
Guido van Rossum2f841442016-11-15 09:48:06 -08001659 Employee = NamedTuple('Employee', [('name', str), ('id', int)])
1660 """
1661 _root = True
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001662
Miss Islington (bot)54ba5f12019-09-17 11:41:55 -07001663 def __new__(*args, **kwargs):
1664 if not args:
1665 raise TypeError('NamedTuple.__new__(): not enough arguments')
1666 cls, *args = args # allow the "cls" keyword be passed
1667 if args:
1668 typename, *args = args # allow the "typename" keyword be passed
1669 elif 'typename' in kwargs:
1670 typename = kwargs.pop('typename')
1671 import warnings
1672 warnings.warn("Passing 'typename' as keyword argument is deprecated",
1673 DeprecationWarning, stacklevel=2)
1674 else:
1675 raise TypeError("NamedTuple.__new__() missing 1 required positional "
1676 "argument: 'typename'")
1677 if args:
1678 try:
1679 fields, = args # allow the "fields" keyword be passed
1680 except ValueError:
1681 raise TypeError(f'NamedTuple.__new__() takes from 2 to 3 '
1682 f'positional arguments but {len(args) + 2} '
1683 f'were given') from None
1684 elif 'fields' in kwargs and len(kwargs) == 1:
1685 fields = kwargs.pop('fields')
1686 import warnings
1687 warnings.warn("Passing 'fields' as keyword argument is deprecated",
1688 DeprecationWarning, stacklevel=2)
1689 else:
1690 fields = None
1691
Guido van Rossum2f841442016-11-15 09:48:06 -08001692 if fields is None:
1693 fields = kwargs.items()
1694 elif kwargs:
1695 raise TypeError("Either list of fields or keywords"
1696 " can be provided to NamedTuple, not both")
Guido van Rossum0a6976d2016-09-11 15:34:56 -07001697 return _make_nmtuple(typename, fields)
Miss Islington (bot)54ba5f12019-09-17 11:41:55 -07001698 __new__.__text_signature__ = '($cls, typename, fields=None, /, **kwargs)'
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001699
1700
Serhiy Storchaka2adcd792019-09-18 09:08:01 +03001701def _dict_new(cls, /, *args, **kwargs):
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001702 return dict(*args, **kwargs)
1703
1704
Serhiy Storchaka2adcd792019-09-18 09:08:01 +03001705def _typeddict_new(cls, typename, fields=None, /, *, total=True, **kwargs):
Miss Islington (bot)54ba5f12019-09-17 11:41:55 -07001706 if fields is None:
1707 fields = kwargs
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001708 elif kwargs:
1709 raise TypeError("TypedDict takes either a dict or keyword arguments,"
1710 " but not both")
1711
Miss Islington (bot)54ba5f12019-09-17 11:41:55 -07001712 ns = {'__annotations__': dict(fields), '__total__': total}
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001713 try:
1714 # Setting correct module is necessary to make typed dict classes pickleable.
1715 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
1716 except (AttributeError, ValueError):
1717 pass
1718
Miss Islington (bot)54ba5f12019-09-17 11:41:55 -07001719 return _TypedDictMeta(typename, (), ns)
Ivan Levkivskyi135c6a52019-05-26 09:39:24 +01001720
1721
1722def _check_fails(cls, other):
1723 # Typed dicts are only for static structural subtyping.
1724 raise TypeError('TypedDict does not support instance and class checks')
1725
1726
1727class _TypedDictMeta(type):
1728 def __new__(cls, name, bases, ns, total=True):
1729 """Create new typed dict class object.
1730
1731 This method is called directly when TypedDict is subclassed,
1732 or via _typeddict_new when TypedDict is instantiated. This way
1733 TypedDict supports all three syntax forms described in its docstring.
1734 Subclasses and instances of TypedDict return actual dictionaries
1735 via _dict_new.
1736 """
1737 ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new
1738 tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns)
1739
1740 anns = ns.get('__annotations__', {})
1741 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
1742 anns = {n: _type_check(tp, msg) for n, tp in anns.items()}
1743 for base in bases:
1744 anns.update(base.__dict__.get('__annotations__', {}))
1745 tp_dict.__annotations__ = anns
1746 if not hasattr(tp_dict, '__total__'):
1747 tp_dict.__total__ = total
1748 return tp_dict
1749
1750 __instancecheck__ = __subclasscheck__ = _check_fails
1751
1752
1753class TypedDict(dict, metaclass=_TypedDictMeta):
1754 """A simple typed namespace. At runtime it is equivalent to a plain dict.
1755
1756 TypedDict creates a dictionary type that expects all of its
1757 instances to have a certain set of keys, where each key is
1758 associated with a value of a consistent type. This expectation
1759 is not checked at runtime but is only enforced by type checkers.
1760 Usage::
1761
1762 class Point2D(TypedDict):
1763 x: int
1764 y: int
1765 label: str
1766
1767 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
1768 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
1769
1770 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
1771
1772 The type info can be accessed via Point2D.__annotations__. TypedDict
1773 supports two additional equivalent forms::
1774
1775 Point2D = TypedDict('Point2D', x=int, y=int, label=str)
1776 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
1777
1778 The class syntax is only supported in Python 3.6+, while two other
1779 syntax forms work for Python 2.7 and 3.2+
1780 """
1781
1782
Guido van Rossum91185fe2016-06-08 11:19:11 -07001783def NewType(name, tp):
1784 """NewType creates simple unique types with almost zero
1785 runtime overhead. NewType(name, tp) is considered a subtype of tp
1786 by static type checkers. At runtime, NewType(name, tp) returns
1787 a dummy function that simply returns its argument. Usage::
1788
1789 UserId = NewType('UserId', int)
1790
1791 def name_by_id(user_id: UserId) -> str:
1792 ...
1793
1794 UserId('user') # Fails type check
1795
1796 name_by_id(42) # Fails type check
1797 name_by_id(UserId(42)) # OK
1798
1799 num = UserId(5) + 1 # type: int
1800 """
1801
1802 def new_type(x):
1803 return x
1804
1805 new_type.__name__ = name
1806 new_type.__supertype__ = tp
1807 return new_type
1808
1809
Guido van Rossum0e0563c2016-04-05 14:54:25 -07001810# Python-version-specific alias (Python 2: unicode; Python 3: str)
1811Text = str
1812
1813
Guido van Rossum91185fe2016-06-08 11:19:11 -07001814# Constant that's True when type checking, but False here.
1815TYPE_CHECKING = False
1816
1817
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001818class IO(Generic[AnyStr]):
1819 """Generic base class for TextIO and BinaryIO.
1820
1821 This is an abstract, generic version of the return of open().
1822
1823 NOTE: This does not distinguish between the different possible
1824 classes (text vs. binary, read vs. write vs. read/write,
1825 append-only, unbuffered). The TextIO and BinaryIO subclasses
1826 below capture the distinctions between text vs. binary, which is
1827 pervasive in the interface; however we currently do not offer a
1828 way to track the other distinctions in the type system.
1829 """
1830
Guido van Rossumd70fe632015-08-05 12:11:06 +02001831 __slots__ = ()
1832
Miss Islington (bot)b2c2a0c2019-09-27 01:13:38 -07001833 @property
1834 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001835 def mode(self) -> str:
1836 pass
1837
Miss Islington (bot)b2c2a0c2019-09-27 01:13:38 -07001838 @property
1839 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001840 def name(self) -> str:
1841 pass
1842
1843 @abstractmethod
1844 def close(self) -> None:
1845 pass
1846
1847 @abstractmethod
1848 def closed(self) -> bool:
1849 pass
1850
1851 @abstractmethod
1852 def fileno(self) -> int:
1853 pass
1854
1855 @abstractmethod
1856 def flush(self) -> None:
1857 pass
1858
1859 @abstractmethod
1860 def isatty(self) -> bool:
1861 pass
1862
1863 @abstractmethod
1864 def read(self, n: int = -1) -> AnyStr:
1865 pass
1866
1867 @abstractmethod
1868 def readable(self) -> bool:
1869 pass
1870
1871 @abstractmethod
1872 def readline(self, limit: int = -1) -> AnyStr:
1873 pass
1874
1875 @abstractmethod
1876 def readlines(self, hint: int = -1) -> List[AnyStr]:
1877 pass
1878
1879 @abstractmethod
1880 def seek(self, offset: int, whence: int = 0) -> int:
1881 pass
1882
1883 @abstractmethod
1884 def seekable(self) -> bool:
1885 pass
1886
1887 @abstractmethod
1888 def tell(self) -> int:
1889 pass
1890
1891 @abstractmethod
1892 def truncate(self, size: int = None) -> int:
1893 pass
1894
1895 @abstractmethod
1896 def writable(self) -> bool:
1897 pass
1898
1899 @abstractmethod
1900 def write(self, s: AnyStr) -> int:
1901 pass
1902
1903 @abstractmethod
1904 def writelines(self, lines: List[AnyStr]) -> None:
1905 pass
1906
1907 @abstractmethod
1908 def __enter__(self) -> 'IO[AnyStr]':
1909 pass
1910
1911 @abstractmethod
1912 def __exit__(self, type, value, traceback) -> None:
1913 pass
1914
1915
1916class BinaryIO(IO[bytes]):
1917 """Typed version of the return of open() in binary mode."""
1918
Guido van Rossumd70fe632015-08-05 12:11:06 +02001919 __slots__ = ()
1920
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001921 @abstractmethod
1922 def write(self, s: Union[bytes, bytearray]) -> int:
1923 pass
1924
1925 @abstractmethod
1926 def __enter__(self) -> 'BinaryIO':
1927 pass
1928
1929
1930class TextIO(IO[str]):
1931 """Typed version of the return of open() in text mode."""
1932
Guido van Rossumd70fe632015-08-05 12:11:06 +02001933 __slots__ = ()
1934
Miss Islington (bot)b2c2a0c2019-09-27 01:13:38 -07001935 @property
1936 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001937 def buffer(self) -> BinaryIO:
1938 pass
1939
Miss Islington (bot)b2c2a0c2019-09-27 01:13:38 -07001940 @property
1941 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001942 def encoding(self) -> str:
1943 pass
1944
Miss Islington (bot)b2c2a0c2019-09-27 01:13:38 -07001945 @property
1946 @abstractmethod
Guido van Rossum991d14f2016-11-09 13:12:51 -08001947 def errors(self) -> Optional[str]:
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001948 pass
1949
Miss Islington (bot)b2c2a0c2019-09-27 01:13:38 -07001950 @property
1951 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001952 def line_buffering(self) -> bool:
1953 pass
1954
Miss Islington (bot)b2c2a0c2019-09-27 01:13:38 -07001955 @property
1956 @abstractmethod
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001957 def newlines(self) -> Any:
1958 pass
1959
1960 @abstractmethod
1961 def __enter__(self) -> 'TextIO':
1962 pass
1963
1964
1965class io:
1966 """Wrapper namespace for IO generic classes."""
1967
1968 __all__ = ['IO', 'TextIO', 'BinaryIO']
1969 IO = IO
1970 TextIO = TextIO
1971 BinaryIO = BinaryIO
1972
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001973
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001974io.__name__ = __name__ + '.io'
1975sys.modules[io.__name__] = io
1976
Ivan Levkivskyid911e402018-01-20 11:23:59 +00001977Pattern = _alias(stdlib_re.Pattern, AnyStr)
1978Match = _alias(stdlib_re.Match, AnyStr)
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001979
1980class re:
1981 """Wrapper namespace for re type aliases."""
1982
1983 __all__ = ['Pattern', 'Match']
1984 Pattern = Pattern
1985 Match = Match
1986
Guido van Rossumd7adfe12017-01-22 17:43:53 -08001987
Guido van Rossum46dbb7d2015-05-22 10:14:11 -07001988re.__name__ = __name__ + '.re'
1989sys.modules[re.__name__] = re