1 | from __future__ import absolute_import, unicode_literals
|
2 |
|
3 | import abc
|
4 | from abc import abstractmethod, abstractproperty
|
5 | import collections
|
6 | import functools
|
7 | import re as stdlib_re # Avoid confusion with the re we export.
|
8 | import sys
|
9 | import types
|
10 | import copy
|
11 | try:
|
12 | import collections.abc as collections_abc
|
13 | except ImportError:
|
14 | import collections as collections_abc # Fallback for PY3.2.
|
15 |
|
16 | # MINIMAL OVM_MAIN PATCH - stub out 'unicode' builtin, because the legacy OVM
|
17 | # build doesn't have unicodeobject.c, and it is hard to undo the build hacks.
|
18 | #
|
19 | # It should be type(u''), but type('') runs under OVM, and doesn't appear to
|
20 | # break type checking.
|
21 | unicode = type('')
|
22 |
|
23 | # Please keep __all__ alphabetized within each category.
|
24 | __all__ = [
|
25 | # Super-special typing primitives.
|
26 | 'Any',
|
27 | 'Callable',
|
28 | 'ClassVar',
|
29 | 'Final',
|
30 | 'Generic',
|
31 | 'Literal',
|
32 | 'Optional',
|
33 | 'Protocol',
|
34 | 'Tuple',
|
35 | 'Type',
|
36 | 'TypeVar',
|
37 | 'Union',
|
38 |
|
39 | # ABCs (from collections.abc).
|
40 | 'AbstractSet', # collections.abc.Set.
|
41 | 'GenericMeta', # subclass of abc.ABCMeta and a metaclass
|
42 | # for 'Generic' and ABCs below.
|
43 | 'ByteString',
|
44 | 'Container',
|
45 | 'ContextManager',
|
46 | 'Hashable',
|
47 | 'ItemsView',
|
48 | 'Iterable',
|
49 | 'Iterator',
|
50 | 'KeysView',
|
51 | 'Mapping',
|
52 | 'MappingView',
|
53 | 'MutableMapping',
|
54 | 'MutableSequence',
|
55 | 'MutableSet',
|
56 | 'Sequence',
|
57 | 'Sized',
|
58 | 'ValuesView',
|
59 |
|
60 | # Structural checks, a.k.a. protocols.
|
61 | 'Reversible',
|
62 | 'SupportsAbs',
|
63 | 'SupportsComplex',
|
64 | 'SupportsFloat',
|
65 | 'SupportsIndex',
|
66 | 'SupportsInt',
|
67 |
|
68 | # Concrete collection types.
|
69 | 'Counter',
|
70 | 'Deque',
|
71 | 'Dict',
|
72 | 'DefaultDict',
|
73 | 'List',
|
74 | 'Set',
|
75 | 'FrozenSet',
|
76 | 'NamedTuple', # Not really a type.
|
77 | 'TypedDict', # Not really a type.
|
78 | 'Generator',
|
79 |
|
80 | # One-off things.
|
81 | 'AnyStr',
|
82 | 'cast',
|
83 | 'final',
|
84 | 'get_type_hints',
|
85 | 'NewType',
|
86 | 'no_type_check',
|
87 | 'no_type_check_decorator',
|
88 | 'NoReturn',
|
89 | 'overload',
|
90 | 'runtime_checkable',
|
91 | 'Text',
|
92 | 'TYPE_CHECKING',
|
93 | ]
|
94 |
|
95 | # The pseudo-submodules 're' and 'io' are part of the public
|
96 | # namespace, but excluded from __all__ because they might stomp on
|
97 | # legitimate imports of those modules.
|
98 |
|
99 |
|
100 | def _qualname(x):
|
101 | if sys.version_info[:2] >= (3, 3):
|
102 | return x.__qualname__
|
103 | else:
|
104 | # Fall back to just name.
|
105 | return x.__name__
|
106 |
|
107 |
|
108 | def _trim_name(nm):
|
109 | whitelist = ('_TypeAlias', '_ForwardRef', '_TypingBase', '_FinalTypingBase')
|
110 | if nm.startswith('_') and nm not in whitelist:
|
111 | nm = nm[1:]
|
112 | return nm
|
113 |
|
114 |
|
115 | class TypingMeta(type):
|
116 | """Metaclass for most types defined in typing module
|
117 | (not a part of public API).
|
118 |
|
119 | This also defines a dummy constructor (all the work for most typing
|
120 | constructs is done in __new__) and a nicer repr().
|
121 | """
|
122 |
|
123 | _is_protocol = False
|
124 |
|
125 | def __new__(cls, name, bases, namespace):
|
126 | return super(TypingMeta, cls).__new__(cls, str(name), bases, namespace)
|
127 |
|
128 | @classmethod
|
129 | def assert_no_subclassing(cls, bases):
|
130 | for base in bases:
|
131 | if isinstance(base, cls):
|
132 | raise TypeError("Cannot subclass %s" %
|
133 | (', '.join(map(_type_repr, bases)) or '()'))
|
134 |
|
135 | def __init__(self, *args, **kwds):
|
136 | pass
|
137 |
|
138 | def _eval_type(self, globalns, localns):
|
139 | """Override this in subclasses to interpret forward references.
|
140 |
|
141 | For example, List['C'] is internally stored as
|
142 | List[_ForwardRef('C')], which should evaluate to List[C],
|
143 | where C is an object found in globalns or localns (searching
|
144 | localns first, of course).
|
145 | """
|
146 | return self
|
147 |
|
148 | def _get_type_vars(self, tvars):
|
149 | pass
|
150 |
|
151 | def __repr__(self):
|
152 | qname = _trim_name(_qualname(self))
|
153 | return '%s.%s' % (self.__module__, qname)
|
154 |
|
155 |
|
156 | class _TypingBase(object):
|
157 | """Internal indicator of special typing constructs."""
|
158 | __metaclass__ = TypingMeta
|
159 | __slots__ = ('__weakref__',)
|
160 |
|
161 | def __init__(self, *args, **kwds):
|
162 | pass
|
163 |
|
164 | def __new__(cls, *args, **kwds):
|
165 | """Constructor.
|
166 |
|
167 | This only exists to give a better error message in case
|
168 | someone tries to subclass a special typing object (not a good idea).
|
169 | """
|
170 | if (len(args) == 3 and
|
171 | isinstance(args[0], str) and
|
172 | isinstance(args[1], tuple)):
|
173 | # Close enough.
|
174 | raise TypeError("Cannot subclass %r" % cls)
|
175 | return super(_TypingBase, cls).__new__(cls)
|
176 |
|
177 | # Things that are not classes also need these.
|
178 | def _eval_type(self, globalns, localns):
|
179 | return self
|
180 |
|
181 | def _get_type_vars(self, tvars):
|
182 | pass
|
183 |
|
184 | def __repr__(self):
|
185 | cls = type(self)
|
186 | qname = _trim_name(_qualname(cls))
|
187 | return '%s.%s' % (cls.__module__, qname)
|
188 |
|
189 | def __call__(self, *args, **kwds):
|
190 | raise TypeError("Cannot instantiate %r" % type(self))
|
191 |
|
192 |
|
193 | class _FinalTypingBase(_TypingBase):
|
194 | """Internal mix-in class to prevent instantiation.
|
195 |
|
196 | Prevents instantiation unless _root=True is given in class call.
|
197 | It is used to create pseudo-singleton instances Any, Union, Optional, etc.
|
198 | """
|
199 |
|
200 | __slots__ = ()
|
201 |
|
202 | def __new__(cls, *args, **kwds):
|
203 | self = super(_FinalTypingBase, cls).__new__(cls, *args, **kwds)
|
204 | if '_root' in kwds and kwds['_root'] is True:
|
205 | return self
|
206 | raise TypeError("Cannot instantiate %r" % cls)
|
207 |
|
208 | def __reduce__(self):
|
209 | return _trim_name(type(self).__name__)
|
210 |
|
211 |
|
212 | class _ForwardRef(_TypingBase):
|
213 | """Internal wrapper to hold a forward reference."""
|
214 |
|
215 | __slots__ = ('__forward_arg__', '__forward_code__',
|
216 | '__forward_evaluated__', '__forward_value__')
|
217 |
|
218 | def __init__(self, arg):
|
219 | super(_ForwardRef, self).__init__(arg)
|
220 | if not isinstance(arg, basestring):
|
221 | raise TypeError('Forward reference must be a string -- got %r' % (arg,))
|
222 | try:
|
223 | code = compile(arg, '<string>', 'eval')
|
224 | except SyntaxError:
|
225 | raise SyntaxError('Forward reference must be an expression -- got %r' %
|
226 | (arg,))
|
227 | self.__forward_arg__ = arg
|
228 | self.__forward_code__ = code
|
229 | self.__forward_evaluated__ = False
|
230 | self.__forward_value__ = None
|
231 |
|
232 | def _eval_type(self, globalns, localns):
|
233 | if not self.__forward_evaluated__ or localns is not globalns:
|
234 | if globalns is None and localns is None:
|
235 | globalns = localns = {}
|
236 | elif globalns is None:
|
237 | globalns = localns
|
238 | elif localns is None:
|
239 | localns = globalns
|
240 | self.__forward_value__ = _type_check(
|
241 | eval(self.__forward_code__, globalns, localns),
|
242 | "Forward references must evaluate to types.")
|
243 | self.__forward_evaluated__ = True
|
244 | return self.__forward_value__
|
245 |
|
246 | def __eq__(self, other):
|
247 | if not isinstance(other, _ForwardRef):
|
248 | return NotImplemented
|
249 | return (self.__forward_arg__ == other.__forward_arg__ and
|
250 | self.__forward_value__ == other.__forward_value__)
|
251 |
|
252 | def __hash__(self):
|
253 | return hash((self.__forward_arg__, self.__forward_value__))
|
254 |
|
255 | def __instancecheck__(self, obj):
|
256 | raise TypeError("Forward references cannot be used with isinstance().")
|
257 |
|
258 | def __subclasscheck__(self, cls):
|
259 | raise TypeError("Forward references cannot be used with issubclass().")
|
260 |
|
261 | def __repr__(self):
|
262 | return '_ForwardRef(%r)' % (self.__forward_arg__,)
|
263 |
|
264 |
|
265 | class _TypeAlias(_TypingBase):
|
266 | """Internal helper class for defining generic variants of concrete types.
|
267 |
|
268 | Note that this is not a type; let's call it a pseudo-type. It cannot
|
269 | be used in instance and subclass checks in parameterized form, i.e.
|
270 | ``isinstance(42, Match[str])`` raises ``TypeError`` instead of returning
|
271 | ``False``.
|
272 | """
|
273 |
|
274 | __slots__ = ('name', 'type_var', 'impl_type', 'type_checker')
|
275 |
|
276 | def __init__(self, name, type_var, impl_type, type_checker):
|
277 | """Initializer.
|
278 |
|
279 | Args:
|
280 | name: The name, e.g. 'Pattern'.
|
281 | type_var: The type parameter, e.g. AnyStr, or the
|
282 | specific type, e.g. str.
|
283 | impl_type: The implementation type.
|
284 | type_checker: Function that takes an impl_type instance.
|
285 | and returns a value that should be a type_var instance.
|
286 | """
|
287 | assert isinstance(name, basestring), repr(name)
|
288 | assert isinstance(impl_type, type), repr(impl_type)
|
289 | assert not isinstance(impl_type, TypingMeta), repr(impl_type)
|
290 | assert isinstance(type_var, (type, _TypingBase)), repr(type_var)
|
291 | self.name = name
|
292 | self.type_var = type_var
|
293 | self.impl_type = impl_type
|
294 | self.type_checker = type_checker
|
295 |
|
296 | def __repr__(self):
|
297 | return "%s[%s]" % (self.name, _type_repr(self.type_var))
|
298 |
|
299 | def __getitem__(self, parameter):
|
300 | if not isinstance(self.type_var, TypeVar):
|
301 | raise TypeError("%s cannot be further parameterized." % self)
|
302 | if self.type_var.__constraints__ and isinstance(parameter, type):
|
303 | if not issubclass(parameter, self.type_var.__constraints__):
|
304 | raise TypeError("%s is not a valid substitution for %s." %
|
305 | (parameter, self.type_var))
|
306 | if isinstance(parameter, TypeVar) and parameter is not self.type_var:
|
307 | raise TypeError("%s cannot be re-parameterized." % self)
|
308 | return self.__class__(self.name, parameter,
|
309 | self.impl_type, self.type_checker)
|
310 |
|
311 | def __eq__(self, other):
|
312 | if not isinstance(other, _TypeAlias):
|
313 | return NotImplemented
|
314 | return self.name == other.name and self.type_var == other.type_var
|
315 |
|
316 | def __hash__(self):
|
317 | return hash((self.name, self.type_var))
|
318 |
|
319 | def __instancecheck__(self, obj):
|
320 | if not isinstance(self.type_var, TypeVar):
|
321 | raise TypeError("Parameterized type aliases cannot be used "
|
322 | "with isinstance().")
|
323 | return isinstance(obj, self.impl_type)
|
324 |
|
325 | def __subclasscheck__(self, cls):
|
326 | if not isinstance(self.type_var, TypeVar):
|
327 | raise TypeError("Parameterized type aliases cannot be used "
|
328 | "with issubclass().")
|
329 | return issubclass(cls, self.impl_type)
|
330 |
|
331 |
|
332 | def _get_type_vars(types, tvars):
|
333 | for t in types:
|
334 | if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
|
335 | t._get_type_vars(tvars)
|
336 |
|
337 |
|
338 | def _type_vars(types):
|
339 | tvars = []
|
340 | _get_type_vars(types, tvars)
|
341 | return tuple(tvars)
|
342 |
|
343 |
|
344 | def _eval_type(t, globalns, localns):
|
345 | if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
|
346 | return t._eval_type(globalns, localns)
|
347 | return t
|
348 |
|
349 |
|
350 | def _type_check(arg, msg):
|
351 | """Check that the argument is a type, and return it (internal helper).
|
352 |
|
353 | As a special case, accept None and return type(None) instead.
|
354 | Also, _TypeAlias instances (e.g. Match, Pattern) are acceptable.
|
355 |
|
356 | The msg argument is a human-readable error message, e.g.
|
357 |
|
358 | "Union[arg, ...]: arg should be a type."
|
359 |
|
360 | We append the repr() of the actual value (truncated to 100 chars).
|
361 | """
|
362 | if arg is None:
|
363 | return type(None)
|
364 | if isinstance(arg, basestring):
|
365 | arg = _ForwardRef(arg)
|
366 | if (
|
367 | isinstance(arg, _TypingBase) and type(arg).__name__ == '_ClassVar' or
|
368 | not isinstance(arg, (type, _TypingBase)) and not callable(arg)
|
369 | ):
|
370 | raise TypeError(msg + " Got %.100r." % (arg,))
|
371 | # Bare Union etc. are not valid as type arguments
|
372 | if (
|
373 | type(arg).__name__ in ('_Union', '_Optional') and
|
374 | not getattr(arg, '__origin__', None) or
|
375 | isinstance(arg, TypingMeta) and arg._gorg in (Generic, Protocol)
|
376 | ):
|
377 | raise TypeError("Plain %s is not valid as type argument" % arg)
|
378 | return arg
|
379 |
|
380 |
|
381 | def _type_repr(obj):
|
382 | """Return the repr() of an object, special-casing types (internal helper).
|
383 |
|
384 | If obj is a type, we return a shorter version than the default
|
385 | type.__repr__, based on the module and qualified name, which is
|
386 | typically enough to uniquely identify a type. For everything
|
387 | else, we fall back on repr(obj).
|
388 | """
|
389 | if isinstance(obj, type) and not isinstance(obj, TypingMeta):
|
390 | if obj.__module__ == '__builtin__':
|
391 | return _qualname(obj)
|
392 | return '%s.%s' % (obj.__module__, _qualname(obj))
|
393 | if obj is Ellipsis:
|
394 | return '...'
|
395 | if isinstance(obj, types.FunctionType):
|
396 | return obj.__name__
|
397 | return repr(obj)
|
398 |
|
399 |
|
400 | class ClassVarMeta(TypingMeta):
|
401 | """Metaclass for _ClassVar"""
|
402 |
|
403 | def __new__(cls, name, bases, namespace):
|
404 | cls.assert_no_subclassing(bases)
|
405 | self = super(ClassVarMeta, cls).__new__(cls, name, bases, namespace)
|
406 | return self
|
407 |
|
408 |
|
409 | class _ClassVar(_FinalTypingBase):
|
410 | """Special type construct to mark class variables.
|
411 |
|
412 | An annotation wrapped in ClassVar indicates that a given
|
413 | attribute is intended to be used as a class variable and
|
414 | should not be set on instances of that class. Usage::
|
415 |
|
416 | class Starship:
|
417 | stats = {} # type: ClassVar[Dict[str, int]] # class variable
|
418 | damage = 10 # type: int # instance variable
|
419 |
|
420 | ClassVar accepts only types and cannot be further subscribed.
|
421 |
|
422 | Note that ClassVar is not a class itself, and should not
|
423 | be used with isinstance() or issubclass().
|
424 | """
|
425 |
|
426 | __metaclass__ = ClassVarMeta
|
427 | __slots__ = ('__type__',)
|
428 |
|
429 | def __init__(self, tp=None, _root=False):
|
430 | self.__type__ = tp
|
431 |
|
432 | def __getitem__(self, item):
|
433 | cls = type(self)
|
434 | if self.__type__ is None:
|
435 | return cls(_type_check(item,
|
436 | '{} accepts only types.'.format(cls.__name__[1:])),
|
437 | _root=True)
|
438 | raise TypeError('{} cannot be further subscripted'
|
439 | .format(cls.__name__[1:]))
|
440 |
|
441 | def _eval_type(self, globalns, localns):
|
442 | return type(self)(_eval_type(self.__type__, globalns, localns),
|
443 | _root=True)
|
444 |
|
445 | def __repr__(self):
|
446 | r = super(_ClassVar, self).__repr__()
|
447 | if self.__type__ is not None:
|
448 | r += '[{}]'.format(_type_repr(self.__type__))
|
449 | return r
|
450 |
|
451 | def __hash__(self):
|
452 | return hash((type(self).__name__, self.__type__))
|
453 |
|
454 | def __eq__(self, other):
|
455 | if not isinstance(other, _ClassVar):
|
456 | return NotImplemented
|
457 | if self.__type__ is not None:
|
458 | return self.__type__ == other.__type__
|
459 | return self is other
|
460 |
|
461 |
|
462 | ClassVar = _ClassVar(_root=True)
|
463 |
|
464 |
|
465 | class _FinalMeta(TypingMeta):
|
466 | """Metaclass for _Final"""
|
467 |
|
468 | def __new__(cls, name, bases, namespace):
|
469 | cls.assert_no_subclassing(bases)
|
470 | self = super(_FinalMeta, cls).__new__(cls, name, bases, namespace)
|
471 | return self
|
472 |
|
473 |
|
474 | class _Final(_FinalTypingBase):
|
475 | """A special typing construct to indicate that a name
|
476 | cannot be re-assigned or overridden in a subclass.
|
477 | For example:
|
478 |
|
479 | MAX_SIZE: Final = 9000
|
480 | MAX_SIZE += 1 # Error reported by type checker
|
481 |
|
482 | class Connection:
|
483 | TIMEOUT: Final[int] = 10
|
484 | class FastConnector(Connection):
|
485 | TIMEOUT = 1 # Error reported by type checker
|
486 |
|
487 | There is no runtime checking of these properties.
|
488 | """
|
489 |
|
490 | __metaclass__ = _FinalMeta
|
491 | __slots__ = ('__type__',)
|
492 |
|
493 | def __init__(self, tp=None, **kwds):
|
494 | self.__type__ = tp
|
495 |
|
496 | def __getitem__(self, item):
|
497 | cls = type(self)
|
498 | if self.__type__ is None:
|
499 | return cls(_type_check(item,
|
500 | '{} accepts only single type.'.format(cls.__name__[1:])),
|
501 | _root=True)
|
502 | raise TypeError('{} cannot be further subscripted'
|
503 | .format(cls.__name__[1:]))
|
504 |
|
505 | def _eval_type(self, globalns, localns):
|
506 | new_tp = _eval_type(self.__type__, globalns, localns)
|
507 | if new_tp == self.__type__:
|
508 | return self
|
509 | return type(self)(new_tp, _root=True)
|
510 |
|
511 | def __repr__(self):
|
512 | r = super(_Final, self).__repr__()
|
513 | if self.__type__ is not None:
|
514 | r += '[{}]'.format(_type_repr(self.__type__))
|
515 | return r
|
516 |
|
517 | def __hash__(self):
|
518 | return hash((type(self).__name__, self.__type__))
|
519 |
|
520 | def __eq__(self, other):
|
521 | if not isinstance(other, _Final):
|
522 | return NotImplemented
|
523 | if self.__type__ is not None:
|
524 | return self.__type__ == other.__type__
|
525 | return self is other
|
526 |
|
527 |
|
528 | Final = _Final(_root=True)
|
529 |
|
530 |
|
531 | def final(f):
|
532 | """This decorator can be used to indicate to type checkers that
|
533 | the decorated method cannot be overridden, and decorated class
|
534 | cannot be subclassed. For example:
|
535 |
|
536 | class Base:
|
537 | @final
|
538 | def done(self) -> None:
|
539 | ...
|
540 | class Sub(Base):
|
541 | def done(self) -> None: # Error reported by type checker
|
542 | ...
|
543 | @final
|
544 | class Leaf:
|
545 | ...
|
546 | class Other(Leaf): # Error reported by type checker
|
547 | ...
|
548 |
|
549 | There is no runtime checking of these properties.
|
550 | """
|
551 | return f
|
552 |
|
553 |
|
554 | class _LiteralMeta(TypingMeta):
|
555 | """Metaclass for _Literal"""
|
556 |
|
557 | def __new__(cls, name, bases, namespace):
|
558 | cls.assert_no_subclassing(bases)
|
559 | self = super(_LiteralMeta, cls).__new__(cls, name, bases, namespace)
|
560 | return self
|
561 |
|
562 |
|
563 | class _Literal(_FinalTypingBase):
|
564 | """A type that can be used to indicate to type checkers that the
|
565 | corresponding value has a value literally equivalent to the
|
566 | provided parameter. For example:
|
567 |
|
568 | var: Literal[4] = 4
|
569 |
|
570 | The type checker understands that 'var' is literally equal to the
|
571 | value 4 and no other value.
|
572 |
|
573 | Literal[...] cannot be subclassed. There is no runtime checking
|
574 | verifying that the parameter is actually a value instead of a type.
|
575 | """
|
576 |
|
577 | __metaclass__ = _LiteralMeta
|
578 | __slots__ = ('__values__',)
|
579 |
|
580 | def __init__(self, values=None, **kwds):
|
581 | self.__values__ = values
|
582 |
|
583 | def __getitem__(self, item):
|
584 | cls = type(self)
|
585 | if self.__values__ is None:
|
586 | if not isinstance(item, tuple):
|
587 | item = (item,)
|
588 | return cls(values=item,
|
589 | _root=True)
|
590 | raise TypeError('{} cannot be further subscripted'
|
591 | .format(cls.__name__[1:]))
|
592 |
|
593 | def _eval_type(self, globalns, localns):
|
594 | return self
|
595 |
|
596 | def __repr__(self):
|
597 | r = super(_Literal, self).__repr__()
|
598 | if self.__values__ is not None:
|
599 | r += '[{}]'.format(', '.join(map(_type_repr, self.__values__)))
|
600 | return r
|
601 |
|
602 | def __hash__(self):
|
603 | return hash((type(self).__name__, self.__values__))
|
604 |
|
605 | def __eq__(self, other):
|
606 | if not isinstance(other, _Literal):
|
607 | return NotImplemented
|
608 | if self.__values__ is not None:
|
609 | return self.__values__ == other.__values__
|
610 | return self is other
|
611 |
|
612 |
|
613 | Literal = _Literal(_root=True)
|
614 |
|
615 |
|
616 | class AnyMeta(TypingMeta):
|
617 | """Metaclass for Any."""
|
618 |
|
619 | def __new__(cls, name, bases, namespace):
|
620 | cls.assert_no_subclassing(bases)
|
621 | self = super(AnyMeta, cls).__new__(cls, name, bases, namespace)
|
622 | return self
|
623 |
|
624 |
|
625 | class _Any(_FinalTypingBase):
|
626 | """Special type indicating an unconstrained type.
|
627 |
|
628 | - Any is compatible with every type.
|
629 | - Any assumed to have all methods.
|
630 | - All values assumed to be instances of Any.
|
631 |
|
632 | Note that all the above statements are true from the point of view of
|
633 | static type checkers. At runtime, Any should not be used with instance
|
634 | or class checks.
|
635 | """
|
636 | __metaclass__ = AnyMeta
|
637 | __slots__ = ()
|
638 |
|
639 | def __instancecheck__(self, obj):
|
640 | raise TypeError("Any cannot be used with isinstance().")
|
641 |
|
642 | def __subclasscheck__(self, cls):
|
643 | raise TypeError("Any cannot be used with issubclass().")
|
644 |
|
645 |
|
646 | Any = _Any(_root=True)
|
647 |
|
648 |
|
649 | class NoReturnMeta(TypingMeta):
|
650 | """Metaclass for NoReturn."""
|
651 |
|
652 | def __new__(cls, name, bases, namespace):
|
653 | cls.assert_no_subclassing(bases)
|
654 | self = super(NoReturnMeta, cls).__new__(cls, name, bases, namespace)
|
655 | return self
|
656 |
|
657 |
|
658 | class _NoReturn(_FinalTypingBase):
|
659 | """Special type indicating functions that never return.
|
660 | Example::
|
661 |
|
662 | from typing import NoReturn
|
663 |
|
664 | def stop() -> NoReturn:
|
665 | raise Exception('no way')
|
666 |
|
667 | This type is invalid in other positions, e.g., ``List[NoReturn]``
|
668 | will fail in static type checkers.
|
669 | """
|
670 | __metaclass__ = NoReturnMeta
|
671 | __slots__ = ()
|
672 |
|
673 | def __instancecheck__(self, obj):
|
674 | raise TypeError("NoReturn cannot be used with isinstance().")
|
675 |
|
676 | def __subclasscheck__(self, cls):
|
677 | raise TypeError("NoReturn cannot be used with issubclass().")
|
678 |
|
679 |
|
680 | NoReturn = _NoReturn(_root=True)
|
681 |
|
682 |
|
683 | class TypeVarMeta(TypingMeta):
|
684 | def __new__(cls, name, bases, namespace):
|
685 | cls.assert_no_subclassing(bases)
|
686 | return super(TypeVarMeta, cls).__new__(cls, name, bases, namespace)
|
687 |
|
688 |
|
689 | class TypeVar(_TypingBase):
|
690 | """Type variable.
|
691 |
|
692 | Usage::
|
693 |
|
694 | T = TypeVar('T') # Can be anything
|
695 | A = TypeVar('A', str, bytes) # Must be str or bytes
|
696 |
|
697 | Type variables exist primarily for the benefit of static type
|
698 | checkers. They serve as the parameters for generic types as well
|
699 | as for generic function definitions. See class Generic for more
|
700 | information on generic types. Generic functions work as follows:
|
701 |
|
702 | def repeat(x: T, n: int) -> List[T]:
|
703 | '''Return a list containing n references to x.'''
|
704 | return [x]*n
|
705 |
|
706 | def longest(x: A, y: A) -> A:
|
707 | '''Return the longest of two strings.'''
|
708 | return x if len(x) >= len(y) else y
|
709 |
|
710 | The latter example's signature is essentially the overloading
|
711 | of (str, str) -> str and (bytes, bytes) -> bytes. Also note
|
712 | that if the arguments are instances of some subclass of str,
|
713 | the return type is still plain str.
|
714 |
|
715 | At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
|
716 |
|
717 | Type variables defined with covariant=True or contravariant=True
|
718 | can be used do declare covariant or contravariant generic types.
|
719 | See PEP 484 for more details. By default generic types are invariant
|
720 | in all type variables.
|
721 |
|
722 | Type variables can be introspected. e.g.:
|
723 |
|
724 | T.__name__ == 'T'
|
725 | T.__constraints__ == ()
|
726 | T.__covariant__ == False
|
727 | T.__contravariant__ = False
|
728 | A.__constraints__ == (str, bytes)
|
729 | """
|
730 |
|
731 | __metaclass__ = TypeVarMeta
|
732 | __slots__ = ('__name__', '__bound__', '__constraints__',
|
733 | '__covariant__', '__contravariant__')
|
734 |
|
735 | def __init__(self, name, *constraints, **kwargs):
|
736 | super(TypeVar, self).__init__(name, *constraints, **kwargs)
|
737 | bound = kwargs.get('bound', None)
|
738 | covariant = kwargs.get('covariant', False)
|
739 | contravariant = kwargs.get('contravariant', False)
|
740 | self.__name__ = name
|
741 | if covariant and contravariant:
|
742 | raise ValueError("Bivariant types are not supported.")
|
743 | self.__covariant__ = bool(covariant)
|
744 | self.__contravariant__ = bool(contravariant)
|
745 | if constraints and bound is not None:
|
746 | raise TypeError("Constraints cannot be combined with bound=...")
|
747 | if constraints and len(constraints) == 1:
|
748 | raise TypeError("A single constraint is not allowed")
|
749 | msg = "TypeVar(name, constraint, ...): constraints must be types."
|
750 | self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
|
751 | if bound:
|
752 | self.__bound__ = _type_check(bound, "Bound must be a type.")
|
753 | else:
|
754 | self.__bound__ = None
|
755 |
|
756 | def _get_type_vars(self, tvars):
|
757 | if self not in tvars:
|
758 | tvars.append(self)
|
759 |
|
760 | def __repr__(self):
|
761 | if self.__covariant__:
|
762 | prefix = '+'
|
763 | elif self.__contravariant__:
|
764 | prefix = '-'
|
765 | else:
|
766 | prefix = '~'
|
767 | return prefix + self.__name__
|
768 |
|
769 | def __instancecheck__(self, instance):
|
770 | raise TypeError("Type variables cannot be used with isinstance().")
|
771 |
|
772 | def __subclasscheck__(self, cls):
|
773 | raise TypeError("Type variables cannot be used with issubclass().")
|
774 |
|
775 |
|
776 | # Some unconstrained type variables. These are used by the container types.
|
777 | # (These are not for export.)
|
778 | T = TypeVar('T') # Any type.
|
779 | KT = TypeVar('KT') # Key type.
|
780 | VT = TypeVar('VT') # Value type.
|
781 | T_co = TypeVar('T_co', covariant=True) # Any type covariant containers.
|
782 | V_co = TypeVar('V_co', covariant=True) # Any type covariant containers.
|
783 | VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers.
|
784 | T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant.
|
785 |
|
786 | # A useful type variable with constraints. This represents string types.
|
787 | # (This one *is* for export!)
|
788 | AnyStr = TypeVar('AnyStr', bytes, unicode)
|
789 |
|
790 |
|
791 | def _replace_arg(arg, tvars, args):
|
792 | """An internal helper function: replace arg if it is a type variable
|
793 | found in tvars with corresponding substitution from args or
|
794 | with corresponding substitution sub-tree if arg is a generic type.
|
795 | """
|
796 |
|
797 | if tvars is None:
|
798 | tvars = []
|
799 | if hasattr(arg, '_subs_tree') and isinstance(arg, (GenericMeta, _TypingBase)):
|
800 | return arg._subs_tree(tvars, args)
|
801 | if isinstance(arg, TypeVar):
|
802 | for i, tvar in enumerate(tvars):
|
803 | if arg == tvar:
|
804 | return args[i]
|
805 | return arg
|
806 |
|
807 |
|
808 | # Special typing constructs Union, Optional, Generic, Callable and Tuple
|
809 | # use three special attributes for internal bookkeeping of generic types:
|
810 | # * __parameters__ is a tuple of unique free type parameters of a generic
|
811 | # type, for example, Dict[T, T].__parameters__ == (T,);
|
812 | # * __origin__ keeps a reference to a type that was subscripted,
|
813 | # e.g., Union[T, int].__origin__ == Union;
|
814 | # * __args__ is a tuple of all arguments used in subscripting,
|
815 | # e.g., Dict[T, int].__args__ == (T, int).
|
816 |
|
817 |
|
818 | def _subs_tree(cls, tvars=None, args=None):
|
819 | """An internal helper function: calculate substitution tree
|
820 | for generic cls after replacing its type parameters with
|
821 | substitutions in tvars -> args (if any).
|
822 | Repeat the same following __origin__'s.
|
823 |
|
824 | Return a list of arguments with all possible substitutions
|
825 | performed. Arguments that are generic classes themselves are represented
|
826 | as tuples (so that no new classes are created by this function).
|
827 | For example: _subs_tree(List[Tuple[int, T]][str]) == [(Tuple, int, str)]
|
828 | """
|
829 |
|
830 | if cls.__origin__ is None:
|
831 | return cls
|
832 | # Make of chain of origins (i.e. cls -> cls.__origin__)
|
833 | current = cls.__origin__
|
834 | orig_chain = []
|
835 | while current.__origin__ is not None:
|
836 | orig_chain.append(current)
|
837 | current = current.__origin__
|
838 | # Replace type variables in __args__ if asked ...
|
839 | tree_args = []
|
840 | for arg in cls.__args__:
|
841 | tree_args.append(_replace_arg(arg, tvars, args))
|
842 | # ... then continue replacing down the origin chain.
|
843 | for ocls in orig_chain:
|
844 | new_tree_args = []
|
845 | for arg in ocls.__args__:
|
846 | new_tree_args.append(_replace_arg(arg, ocls.__parameters__, tree_args))
|
847 | tree_args = new_tree_args
|
848 | return tree_args
|
849 |
|
850 |
|
851 | def _remove_dups_flatten(parameters):
|
852 | """An internal helper for Union creation and substitution: flatten Union's
|
853 | among parameters, then remove duplicates and strict subclasses.
|
854 | """
|
855 |
|
856 | # Flatten out Union[Union[...], ...].
|
857 | params = []
|
858 | for p in parameters:
|
859 | if isinstance(p, _Union) and p.__origin__ is Union:
|
860 | params.extend(p.__args__)
|
861 | elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
|
862 | params.extend(p[1:])
|
863 | else:
|
864 | params.append(p)
|
865 | # Weed out strict duplicates, preserving the first of each occurrence.
|
866 | all_params = set(params)
|
867 | if len(all_params) < len(params):
|
868 | new_params = []
|
869 | for t in params:
|
870 | if t in all_params:
|
871 | new_params.append(t)
|
872 | all_params.remove(t)
|
873 | params = new_params
|
874 | assert not all_params, all_params
|
875 | # Weed out subclasses.
|
876 | # E.g. Union[int, Employee, Manager] == Union[int, Employee].
|
877 | # If object is present it will be sole survivor among proper classes.
|
878 | # Never discard type variables.
|
879 | # (In particular, Union[str, AnyStr] != AnyStr.)
|
880 | all_params = set(params)
|
881 | for t1 in params:
|
882 | if not isinstance(t1, type):
|
883 | continue
|
884 | if any(isinstance(t2, type) and issubclass(t1, t2)
|
885 | for t2 in all_params - {t1}
|
886 | if not (isinstance(t2, GenericMeta) and
|
887 | t2.__origin__ is not None)):
|
888 | all_params.remove(t1)
|
889 | return tuple(t for t in params if t in all_params)
|
890 |
|
891 |
|
892 | def _check_generic(cls, parameters):
|
893 | # Check correct count for parameters of a generic cls (internal helper).
|
894 | if not cls.__parameters__:
|
895 | raise TypeError("%s is not a generic class" % repr(cls))
|
896 | alen = len(parameters)
|
897 | elen = len(cls.__parameters__)
|
898 | if alen != elen:
|
899 | raise TypeError("Too %s parameters for %s; actual %s, expected %s" %
|
900 | ("many" if alen > elen else "few", repr(cls), alen, elen))
|
901 |
|
902 |
|
903 | _cleanups = []
|
904 |
|
905 |
|
906 | def _tp_cache(func):
|
907 | maxsize = 128
|
908 | cache = {}
|
909 | _cleanups.append(cache.clear)
|
910 |
|
911 | @functools.wraps(func)
|
912 | def inner(*args):
|
913 | key = args
|
914 | try:
|
915 | return cache[key]
|
916 | except TypeError:
|
917 | # Assume it's an unhashable argument.
|
918 | return func(*args)
|
919 | except KeyError:
|
920 | value = func(*args)
|
921 | if len(cache) >= maxsize:
|
922 | # If the cache grows too much, just start over.
|
923 | cache.clear()
|
924 | cache[key] = value
|
925 | return value
|
926 |
|
927 | return inner
|
928 |
|
929 |
|
930 | class UnionMeta(TypingMeta):
|
931 | """Metaclass for Union."""
|
932 |
|
933 | def __new__(cls, name, bases, namespace):
|
934 | cls.assert_no_subclassing(bases)
|
935 | return super(UnionMeta, cls).__new__(cls, name, bases, namespace)
|
936 |
|
937 |
|
938 | class _Union(_FinalTypingBase):
|
939 | """Union type; Union[X, Y] means either X or Y.
|
940 |
|
941 | To define a union, use e.g. Union[int, str]. Details:
|
942 |
|
943 | - The arguments must be types and there must be at least one.
|
944 |
|
945 | - None as an argument is a special case and is replaced by
|
946 | type(None).
|
947 |
|
948 | - Unions of unions are flattened, e.g.::
|
949 |
|
950 | Union[Union[int, str], float] == Union[int, str, float]
|
951 |
|
952 | - Unions of a single argument vanish, e.g.::
|
953 |
|
954 | Union[int] == int # The constructor actually returns int
|
955 |
|
956 | - Redundant arguments are skipped, e.g.::
|
957 |
|
958 | Union[int, str, int] == Union[int, str]
|
959 |
|
960 | - When comparing unions, the argument order is ignored, e.g.::
|
961 |
|
962 | Union[int, str] == Union[str, int]
|
963 |
|
964 | - When two arguments have a subclass relationship, the least
|
965 | derived argument is kept, e.g.::
|
966 |
|
967 | class Employee: pass
|
968 | class Manager(Employee): pass
|
969 | Union[int, Employee, Manager] == Union[int, Employee]
|
970 | Union[Manager, int, Employee] == Union[int, Employee]
|
971 | Union[Employee, Manager] == Employee
|
972 |
|
973 | - Similar for object::
|
974 |
|
975 | Union[int, object] == object
|
976 |
|
977 | - You cannot subclass or instantiate a union.
|
978 |
|
979 | - You can use Optional[X] as a shorthand for Union[X, None].
|
980 | """
|
981 |
|
982 | __metaclass__ = UnionMeta
|
983 | __slots__ = ('__parameters__', '__args__', '__origin__', '__tree_hash__')
|
984 |
|
985 | def __new__(cls, parameters=None, origin=None, *args, **kwds):
|
986 | self = super(_Union, cls).__new__(cls, parameters, origin, *args, **kwds)
|
987 | if origin is None:
|
988 | self.__parameters__ = None
|
989 | self.__args__ = None
|
990 | self.__origin__ = None
|
991 | self.__tree_hash__ = hash(frozenset(('Union',)))
|
992 | return self
|
993 | if not isinstance(parameters, tuple):
|
994 | raise TypeError("Expected parameters=<tuple>")
|
995 | if origin is Union:
|
996 | parameters = _remove_dups_flatten(parameters)
|
997 | # It's not a union if there's only one type left.
|
998 | if len(parameters) == 1:
|
999 | return parameters[0]
|
1000 | self.__parameters__ = _type_vars(parameters)
|
1001 | self.__args__ = parameters
|
1002 | self.__origin__ = origin
|
1003 | # Pre-calculate the __hash__ on instantiation.
|
1004 | # This improves speed for complex substitutions.
|
1005 | subs_tree = self._subs_tree()
|
1006 | if isinstance(subs_tree, tuple):
|
1007 | self.__tree_hash__ = hash(frozenset(subs_tree))
|
1008 | else:
|
1009 | self.__tree_hash__ = hash(subs_tree)
|
1010 | return self
|
1011 |
|
1012 | def _eval_type(self, globalns, localns):
|
1013 | if self.__args__ is None:
|
1014 | return self
|
1015 | ev_args = tuple(_eval_type(t, globalns, localns) for t in self.__args__)
|
1016 | ev_origin = _eval_type(self.__origin__, globalns, localns)
|
1017 | if ev_args == self.__args__ and ev_origin == self.__origin__:
|
1018 | # Everything is already evaluated.
|
1019 | return self
|
1020 | return self.__class__(ev_args, ev_origin, _root=True)
|
1021 |
|
1022 | def _get_type_vars(self, tvars):
|
1023 | if self.__origin__ and self.__parameters__:
|
1024 | _get_type_vars(self.__parameters__, tvars)
|
1025 |
|
1026 | def __repr__(self):
|
1027 | if self.__origin__ is None:
|
1028 | return super(_Union, self).__repr__()
|
1029 | tree = self._subs_tree()
|
1030 | if not isinstance(tree, tuple):
|
1031 | return repr(tree)
|
1032 | return tree[0]._tree_repr(tree)
|
1033 |
|
1034 | def _tree_repr(self, tree):
|
1035 | arg_list = []
|
1036 | for arg in tree[1:]:
|
1037 | if not isinstance(arg, tuple):
|
1038 | arg_list.append(_type_repr(arg))
|
1039 | else:
|
1040 | arg_list.append(arg[0]._tree_repr(arg))
|
1041 | return super(_Union, self).__repr__() + '[%s]' % ', '.join(arg_list)
|
1042 |
|
1043 | @_tp_cache
|
1044 | def __getitem__(self, parameters):
|
1045 | if parameters == ():
|
1046 | raise TypeError("Cannot take a Union of no types.")
|
1047 | if not isinstance(parameters, tuple):
|
1048 | parameters = (parameters,)
|
1049 | if self.__origin__ is None:
|
1050 | msg = "Union[arg, ...]: each arg must be a type."
|
1051 | else:
|
1052 | msg = "Parameters to generic types must be types."
|
1053 | parameters = tuple(_type_check(p, msg) for p in parameters)
|
1054 | if self is not Union:
|
1055 | _check_generic(self, parameters)
|
1056 | return self.__class__(parameters, origin=self, _root=True)
|
1057 |
|
1058 | def _subs_tree(self, tvars=None, args=None):
|
1059 | if self is Union:
|
1060 | return Union # Nothing to substitute
|
1061 | tree_args = _subs_tree(self, tvars, args)
|
1062 | tree_args = _remove_dups_flatten(tree_args)
|
1063 | if len(tree_args) == 1:
|
1064 | return tree_args[0] # Union of a single type is that type
|
1065 | return (Union,) + tree_args
|
1066 |
|
1067 | def __eq__(self, other):
|
1068 | if isinstance(other, _Union):
|
1069 | return self.__tree_hash__ == other.__tree_hash__
|
1070 | elif self is not Union:
|
1071 | return self._subs_tree() == other
|
1072 | else:
|
1073 | return self is other
|
1074 |
|
1075 | def __hash__(self):
|
1076 | return self.__tree_hash__
|
1077 |
|
1078 | def __instancecheck__(self, obj):
|
1079 | raise TypeError("Unions cannot be used with isinstance().")
|
1080 |
|
1081 | def __subclasscheck__(self, cls):
|
1082 | raise TypeError("Unions cannot be used with issubclass().")
|
1083 |
|
1084 |
|
1085 | Union = _Union(_root=True)
|
1086 |
|
1087 |
|
1088 | class OptionalMeta(TypingMeta):
|
1089 | """Metaclass for Optional."""
|
1090 |
|
1091 | def __new__(cls, name, bases, namespace):
|
1092 | cls.assert_no_subclassing(bases)
|
1093 | return super(OptionalMeta, cls).__new__(cls, name, bases, namespace)
|
1094 |
|
1095 |
|
1096 | class _Optional(_FinalTypingBase):
|
1097 | """Optional type.
|
1098 |
|
1099 | Optional[X] is equivalent to Union[X, None].
|
1100 | """
|
1101 |
|
1102 | __metaclass__ = OptionalMeta
|
1103 | __slots__ = ()
|
1104 |
|
1105 | @_tp_cache
|
1106 | def __getitem__(self, arg):
|
1107 | arg = _type_check(arg, "Optional[t] requires a single type.")
|
1108 | return Union[arg, type(None)]
|
1109 |
|
1110 |
|
1111 | Optional = _Optional(_root=True)
|
1112 |
|
1113 |
|
1114 | def _next_in_mro(cls):
|
1115 | """Helper for Generic.__new__.
|
1116 |
|
1117 | Returns the class after the last occurrence of Generic or
|
1118 | Generic[...] in cls.__mro__.
|
1119 | """
|
1120 | next_in_mro = object
|
1121 | # Look for the last occurrence of Generic or Generic[...].
|
1122 | for i, c in enumerate(cls.__mro__[:-1]):
|
1123 | if isinstance(c, GenericMeta) and c._gorg is Generic:
|
1124 | next_in_mro = cls.__mro__[i + 1]
|
1125 | return next_in_mro
|
1126 |
|
1127 |
|
1128 | def _make_subclasshook(cls):
|
1129 | """Construct a __subclasshook__ callable that incorporates
|
1130 | the associated __extra__ class in subclass checks performed
|
1131 | against cls.
|
1132 | """
|
1133 | if isinstance(cls.__extra__, abc.ABCMeta):
|
1134 | # The logic mirrors that of ABCMeta.__subclasscheck__.
|
1135 | # Registered classes need not be checked here because
|
1136 | # cls and its extra share the same _abc_registry.
|
1137 | def __extrahook__(cls, subclass):
|
1138 | res = cls.__extra__.__subclasshook__(subclass)
|
1139 | if res is not NotImplemented:
|
1140 | return res
|
1141 | if cls.__extra__ in getattr(subclass, '__mro__', ()):
|
1142 | return True
|
1143 | for scls in cls.__extra__.__subclasses__():
|
1144 | if isinstance(scls, GenericMeta):
|
1145 | continue
|
1146 | if issubclass(subclass, scls):
|
1147 | return True
|
1148 | return NotImplemented
|
1149 | else:
|
1150 | # For non-ABC extras we'll just call issubclass().
|
1151 | def __extrahook__(cls, subclass):
|
1152 | if cls.__extra__ and issubclass(subclass, cls.__extra__):
|
1153 | return True
|
1154 | return NotImplemented
|
1155 | return classmethod(__extrahook__)
|
1156 |
|
1157 |
|
1158 | class GenericMeta(TypingMeta, abc.ABCMeta):
|
1159 | """Metaclass for generic types.
|
1160 |
|
1161 | This is a metaclass for typing.Generic and generic ABCs defined in
|
1162 | typing module. User defined subclasses of GenericMeta can override
|
1163 | __new__ and invoke super().__new__. Note that GenericMeta.__new__
|
1164 | has strict rules on what is allowed in its bases argument:
|
1165 | * plain Generic is disallowed in bases;
|
1166 | * Generic[...] should appear in bases at most once;
|
1167 | * if Generic[...] is present, then it should list all type variables
|
1168 | that appear in other bases.
|
1169 | In addition, type of all generic bases is erased, e.g., C[int] is
|
1170 | stripped to plain C.
|
1171 | """
|
1172 |
|
1173 | def __new__(cls, name, bases, namespace,
|
1174 | tvars=None, args=None, origin=None, extra=None, orig_bases=None):
|
1175 | """Create a new generic class. GenericMeta.__new__ accepts
|
1176 | keyword arguments that are used for internal bookkeeping, therefore
|
1177 | an override should pass unused keyword arguments to super().
|
1178 | """
|
1179 | if tvars is not None:
|
1180 | # Called from __getitem__() below.
|
1181 | assert origin is not None
|
1182 | assert all(isinstance(t, TypeVar) for t in tvars), tvars
|
1183 | else:
|
1184 | # Called from class statement.
|
1185 | assert tvars is None, tvars
|
1186 | assert args is None, args
|
1187 | assert origin is None, origin
|
1188 |
|
1189 | # Get the full set of tvars from the bases.
|
1190 | tvars = _type_vars(bases)
|
1191 | # Look for Generic[T1, ..., Tn].
|
1192 | # If found, tvars must be a subset of it.
|
1193 | # If not found, tvars is it.
|
1194 | # Also check for and reject plain Generic,
|
1195 | # and reject multiple Generic[...].
|
1196 | gvars = None
|
1197 | for base in bases:
|
1198 | if base is Generic:
|
1199 | raise TypeError("Cannot inherit from plain Generic")
|
1200 | if (isinstance(base, GenericMeta) and
|
1201 | base.__origin__ in (Generic, Protocol)):
|
1202 | if gvars is not None:
|
1203 | raise TypeError(
|
1204 | "Cannot inherit from Generic[...] or"
|
1205 | " Protocol[...] multiple times.")
|
1206 | gvars = base.__parameters__
|
1207 | if gvars is None:
|
1208 | gvars = tvars
|
1209 | else:
|
1210 | tvarset = set(tvars)
|
1211 | gvarset = set(gvars)
|
1212 | if not tvarset <= gvarset:
|
1213 | raise TypeError(
|
1214 | "Some type variables (%s) "
|
1215 | "are not listed in %s[%s]" %
|
1216 | (", ".join(str(t) for t in tvars if t not in gvarset),
|
1217 | "Generic" if any(b.__origin__ is Generic
|
1218 | for b in bases) else "Protocol",
|
1219 | ", ".join(str(g) for g in gvars)))
|
1220 | tvars = gvars
|
1221 |
|
1222 | initial_bases = bases
|
1223 | if extra is None:
|
1224 | extra = namespace.get('__extra__')
|
1225 | if extra is not None and type(extra) is abc.ABCMeta and extra not in bases:
|
1226 | bases = (extra,) + bases
|
1227 | bases = tuple(b._gorg if isinstance(b, GenericMeta) else b for b in bases)
|
1228 |
|
1229 | # remove bare Generic from bases if there are other generic bases
|
1230 | if any(isinstance(b, GenericMeta) and b is not Generic for b in bases):
|
1231 | bases = tuple(b for b in bases if b is not Generic)
|
1232 | namespace.update({'__origin__': origin, '__extra__': extra})
|
1233 | self = super(GenericMeta, cls).__new__(cls, name, bases, namespace)
|
1234 | super(GenericMeta, self).__setattr__('_gorg',
|
1235 | self if not origin else origin._gorg)
|
1236 |
|
1237 | self.__parameters__ = tvars
|
1238 | # Be prepared that GenericMeta will be subclassed by TupleMeta
|
1239 | # and CallableMeta, those two allow ..., (), or [] in __args___.
|
1240 | self.__args__ = tuple(Ellipsis if a is _TypingEllipsis else
|
1241 | () if a is _TypingEmpty else
|
1242 | a for a in args) if args else None
|
1243 | # Speed hack (https://github.com/python/typing/issues/196).
|
1244 | self.__next_in_mro__ = _next_in_mro(self)
|
1245 | # Preserve base classes on subclassing (__bases__ are type erased now).
|
1246 | if orig_bases is None:
|
1247 | self.__orig_bases__ = initial_bases
|
1248 |
|
1249 | # This allows unparameterized generic collections to be used
|
1250 | # with issubclass() and isinstance() in the same way as their
|
1251 | # collections.abc counterparts (e.g., isinstance([], Iterable)).
|
1252 | if (
|
1253 | '__subclasshook__' not in namespace and extra or
|
1254 | # allow overriding
|
1255 | getattr(self.__subclasshook__, '__name__', '') == '__extrahook__'
|
1256 | ):
|
1257 | self.__subclasshook__ = _make_subclasshook(self)
|
1258 |
|
1259 | if origin and hasattr(origin, '__qualname__'): # Fix for Python 3.2.
|
1260 | self.__qualname__ = origin.__qualname__
|
1261 | self.__tree_hash__ = (hash(self._subs_tree()) if origin else
|
1262 | super(GenericMeta, self).__hash__())
|
1263 | return self
|
1264 |
|
1265 | def __init__(self, *args, **kwargs):
|
1266 | super(GenericMeta, self).__init__(*args, **kwargs)
|
1267 | if isinstance(self.__extra__, abc.ABCMeta):
|
1268 | self._abc_registry = self.__extra__._abc_registry
|
1269 | self._abc_cache = self.__extra__._abc_cache
|
1270 | elif self.__origin__ is not None:
|
1271 | self._abc_registry = self.__origin__._abc_registry
|
1272 | self._abc_cache = self.__origin__._abc_cache
|
1273 |
|
1274 | # _abc_negative_cache and _abc_negative_cache_version
|
1275 | # realised as descriptors, since GenClass[t1, t2, ...] always
|
1276 | # share subclass info with GenClass.
|
1277 | # This is an important memory optimization.
|
1278 | @property
|
1279 | def _abc_negative_cache(self):
|
1280 | if isinstance(self.__extra__, abc.ABCMeta):
|
1281 | return self.__extra__._abc_negative_cache
|
1282 | return self._gorg._abc_generic_negative_cache
|
1283 |
|
1284 | @_abc_negative_cache.setter
|
1285 | def _abc_negative_cache(self, value):
|
1286 | if self.__origin__ is None:
|
1287 | if isinstance(self.__extra__, abc.ABCMeta):
|
1288 | self.__extra__._abc_negative_cache = value
|
1289 | else:
|
1290 | self._abc_generic_negative_cache = value
|
1291 |
|
1292 | @property
|
1293 | def _abc_negative_cache_version(self):
|
1294 | if isinstance(self.__extra__, abc.ABCMeta):
|
1295 | return self.__extra__._abc_negative_cache_version
|
1296 | return self._gorg._abc_generic_negative_cache_version
|
1297 |
|
1298 | @_abc_negative_cache_version.setter
|
1299 | def _abc_negative_cache_version(self, value):
|
1300 | if self.__origin__ is None:
|
1301 | if isinstance(self.__extra__, abc.ABCMeta):
|
1302 | self.__extra__._abc_negative_cache_version = value
|
1303 | else:
|
1304 | self._abc_generic_negative_cache_version = value
|
1305 |
|
1306 | def _get_type_vars(self, tvars):
|
1307 | if self.__origin__ and self.__parameters__:
|
1308 | _get_type_vars(self.__parameters__, tvars)
|
1309 |
|
1310 | def _eval_type(self, globalns, localns):
|
1311 | ev_origin = (self.__origin__._eval_type(globalns, localns)
|
1312 | if self.__origin__ else None)
|
1313 | ev_args = tuple(_eval_type(a, globalns, localns) for a
|
1314 | in self.__args__) if self.__args__ else None
|
1315 | if ev_origin == self.__origin__ and ev_args == self.__args__:
|
1316 | return self
|
1317 | return self.__class__(self.__name__,
|
1318 | self.__bases__,
|
1319 | dict(self.__dict__),
|
1320 | tvars=_type_vars(ev_args) if ev_args else None,
|
1321 | args=ev_args,
|
1322 | origin=ev_origin,
|
1323 | extra=self.__extra__,
|
1324 | orig_bases=self.__orig_bases__)
|
1325 |
|
1326 | def __repr__(self):
|
1327 | if self.__origin__ is None:
|
1328 | return super(GenericMeta, self).__repr__()
|
1329 | return self._tree_repr(self._subs_tree())
|
1330 |
|
1331 | def _tree_repr(self, tree):
|
1332 | arg_list = []
|
1333 | for arg in tree[1:]:
|
1334 | if arg == ():
|
1335 | arg_list.append('()')
|
1336 | elif not isinstance(arg, tuple):
|
1337 | arg_list.append(_type_repr(arg))
|
1338 | else:
|
1339 | arg_list.append(arg[0]._tree_repr(arg))
|
1340 | return super(GenericMeta, self).__repr__() + '[%s]' % ', '.join(arg_list)
|
1341 |
|
1342 | def _subs_tree(self, tvars=None, args=None):
|
1343 | if self.__origin__ is None:
|
1344 | return self
|
1345 | tree_args = _subs_tree(self, tvars, args)
|
1346 | return (self._gorg,) + tuple(tree_args)
|
1347 |
|
1348 | def __eq__(self, other):
|
1349 | if not isinstance(other, GenericMeta):
|
1350 | return NotImplemented
|
1351 | if self.__origin__ is None or other.__origin__ is None:
|
1352 | return self is other
|
1353 | return self.__tree_hash__ == other.__tree_hash__
|
1354 |
|
1355 | def __hash__(self):
|
1356 | return self.__tree_hash__
|
1357 |
|
1358 | @_tp_cache
|
1359 | def __getitem__(self, params):
|
1360 | if not isinstance(params, tuple):
|
1361 | params = (params,)
|
1362 | if not params and self._gorg is not Tuple:
|
1363 | raise TypeError(
|
1364 | "Parameter list to %s[...] cannot be empty" % _qualname(self))
|
1365 | msg = "Parameters to generic types must be types."
|
1366 | params = tuple(_type_check(p, msg) for p in params)
|
1367 | if self in (Generic, Protocol):
|
1368 | # Generic can only be subscripted with unique type variables.
|
1369 | if not all(isinstance(p, TypeVar) for p in params):
|
1370 | raise TypeError(
|
1371 | "Parameters to %s[...] must all be type variables" % self.__name__)
|
1372 | if len(set(params)) != len(params):
|
1373 | raise TypeError(
|
1374 | "Parameters to %s[...] must all be unique" % self.__name__)
|
1375 | tvars = params
|
1376 | args = params
|
1377 | elif self in (Tuple, Callable):
|
1378 | tvars = _type_vars(params)
|
1379 | args = params
|
1380 | elif self.__origin__ in (Generic, Protocol):
|
1381 | # Can't subscript Generic[...] or Protocol[...].
|
1382 | raise TypeError("Cannot subscript already-subscripted %s" %
|
1383 | repr(self))
|
1384 | else:
|
1385 | # Subscripting a regular Generic subclass.
|
1386 | _check_generic(self, params)
|
1387 | tvars = _type_vars(params)
|
1388 | args = params
|
1389 |
|
1390 | prepend = (self,) if self.__origin__ is None else ()
|
1391 | return self.__class__(self.__name__,
|
1392 | prepend + self.__bases__,
|
1393 | dict(self.__dict__),
|
1394 | tvars=tvars,
|
1395 | args=args,
|
1396 | origin=self,
|
1397 | extra=self.__extra__,
|
1398 | orig_bases=self.__orig_bases__)
|
1399 |
|
1400 | def __subclasscheck__(self, cls):
|
1401 | if self.__origin__ is not None:
|
1402 | # These should only be modules within the standard library.
|
1403 | # singledispatch is an exception, because it's a Python 2 backport
|
1404 | # of functools.singledispatch.
|
1405 | whitelist = ['abc', 'functools', 'singledispatch']
|
1406 | if (sys._getframe(1).f_globals['__name__'] in whitelist or
|
1407 | # The second frame is needed for the case where we came
|
1408 | # from _ProtocolMeta.__subclasscheck__.
|
1409 | sys._getframe(2).f_globals['__name__'] in whitelist):
|
1410 | return False
|
1411 | raise TypeError("Parameterized generics cannot be used with class "
|
1412 | "or instance checks")
|
1413 | if self is Generic:
|
1414 | raise TypeError("Class %r cannot be used with class "
|
1415 | "or instance checks" % self)
|
1416 | return super(GenericMeta, self).__subclasscheck__(cls)
|
1417 |
|
1418 | def __instancecheck__(self, instance):
|
1419 | # Since we extend ABC.__subclasscheck__ and
|
1420 | # ABC.__instancecheck__ inlines the cache checking done by the
|
1421 | # latter, we must extend __instancecheck__ too. For simplicity
|
1422 | # we just skip the cache check -- instance checks for generic
|
1423 | # classes are supposed to be rare anyways.
|
1424 | if hasattr(instance, "__class__"):
|
1425 | return issubclass(instance.__class__, self)
|
1426 | return False
|
1427 |
|
1428 | def __setattr__(self, attr, value):
|
1429 | # We consider all the subscripted genrics as proxies for original class
|
1430 | if (
|
1431 | attr.startswith('__') and attr.endswith('__') or
|
1432 | attr.startswith('_abc_')
|
1433 | ):
|
1434 | super(GenericMeta, self).__setattr__(attr, value)
|
1435 | else:
|
1436 | super(GenericMeta, self._gorg).__setattr__(attr, value)
|
1437 |
|
1438 |
|
1439 | def _copy_generic(self):
|
1440 | """Hack to work around https://bugs.python.org/issue11480 on Python 2"""
|
1441 | return self.__class__(self.__name__, self.__bases__, dict(self.__dict__),
|
1442 | self.__parameters__, self.__args__, self.__origin__,
|
1443 | self.__extra__, self.__orig_bases__)
|
1444 |
|
1445 |
|
1446 | copy._copy_dispatch[GenericMeta] = _copy_generic
|
1447 |
|
1448 |
|
1449 | # Prevent checks for Generic to crash when defining Generic.
|
1450 | Generic = None
|
1451 |
|
1452 |
|
1453 | def _generic_new(base_cls, cls, *args, **kwds):
|
1454 | # Assure type is erased on instantiation,
|
1455 | # but attempt to store it in __orig_class__
|
1456 | if cls.__origin__ is None:
|
1457 | if (base_cls.__new__ is object.__new__ and
|
1458 | cls.__init__ is not object.__init__):
|
1459 | return base_cls.__new__(cls)
|
1460 | else:
|
1461 | return base_cls.__new__(cls, *args, **kwds)
|
1462 | else:
|
1463 | origin = cls._gorg
|
1464 | if (base_cls.__new__ is object.__new__ and
|
1465 | cls.__init__ is not object.__init__):
|
1466 | obj = base_cls.__new__(origin)
|
1467 | else:
|
1468 | obj = base_cls.__new__(origin, *args, **kwds)
|
1469 | try:
|
1470 | obj.__orig_class__ = cls
|
1471 | except AttributeError:
|
1472 | pass
|
1473 | obj.__init__(*args, **kwds)
|
1474 | return obj
|
1475 |
|
1476 |
|
1477 | class Generic(object):
|
1478 | """Abstract base class for generic types.
|
1479 |
|
1480 | A generic type is typically declared by inheriting from
|
1481 | this class parameterized with one or more type variables.
|
1482 | For example, a generic mapping type might be defined as::
|
1483 |
|
1484 | class Mapping(Generic[KT, VT]):
|
1485 | def __getitem__(self, key: KT) -> VT:
|
1486 | ...
|
1487 | # Etc.
|
1488 |
|
1489 | This class can then be used as follows::
|
1490 |
|
1491 | def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
|
1492 | try:
|
1493 | return mapping[key]
|
1494 | except KeyError:
|
1495 | return default
|
1496 | """
|
1497 |
|
1498 | __metaclass__ = GenericMeta
|
1499 | __slots__ = ()
|
1500 |
|
1501 | def __new__(cls, *args, **kwds):
|
1502 | if cls._gorg is Generic:
|
1503 | raise TypeError("Type Generic cannot be instantiated; "
|
1504 | "it can be used only as a base class")
|
1505 | return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
|
1506 |
|
1507 |
|
1508 | class _TypingEmpty(object):
|
1509 | """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
|
1510 | to allow empty list/tuple in specific places, without allowing them
|
1511 | to sneak in where prohibited.
|
1512 | """
|
1513 |
|
1514 |
|
1515 | class _TypingEllipsis(object):
|
1516 | """Internal placeholder for ... (ellipsis)."""
|
1517 |
|
1518 |
|
1519 | class TupleMeta(GenericMeta):
|
1520 | """Metaclass for Tuple (internal)."""
|
1521 |
|
1522 | @_tp_cache
|
1523 | def __getitem__(self, parameters):
|
1524 | if self.__origin__ is not None or self._gorg is not Tuple:
|
1525 | # Normal generic rules apply if this is not the first subscription
|
1526 | # or a subscription of a subclass.
|
1527 | return super(TupleMeta, self).__getitem__(parameters)
|
1528 | if parameters == ():
|
1529 | return super(TupleMeta, self).__getitem__((_TypingEmpty,))
|
1530 | if not isinstance(parameters, tuple):
|
1531 | parameters = (parameters,)
|
1532 | if len(parameters) == 2 and parameters[1] is Ellipsis:
|
1533 | msg = "Tuple[t, ...]: t must be a type."
|
1534 | p = _type_check(parameters[0], msg)
|
1535 | return super(TupleMeta, self).__getitem__((p, _TypingEllipsis))
|
1536 | msg = "Tuple[t0, t1, ...]: each t must be a type."
|
1537 | parameters = tuple(_type_check(p, msg) for p in parameters)
|
1538 | return super(TupleMeta, self).__getitem__(parameters)
|
1539 |
|
1540 | def __instancecheck__(self, obj):
|
1541 | if self.__args__ is None:
|
1542 | return isinstance(obj, tuple)
|
1543 | raise TypeError("Parameterized Tuple cannot be used "
|
1544 | "with isinstance().")
|
1545 |
|
1546 | def __subclasscheck__(self, cls):
|
1547 | if self.__args__ is None:
|
1548 | return issubclass(cls, tuple)
|
1549 | raise TypeError("Parameterized Tuple cannot be used "
|
1550 | "with issubclass().")
|
1551 |
|
1552 |
|
1553 | copy._copy_dispatch[TupleMeta] = _copy_generic
|
1554 |
|
1555 |
|
1556 | class Tuple(tuple):
|
1557 | """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
|
1558 |
|
1559 | Example: Tuple[T1, T2] is a tuple of two elements corresponding
|
1560 | to type variables T1 and T2. Tuple[int, float, str] is a tuple
|
1561 | of an int, a float and a string.
|
1562 |
|
1563 | To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
|
1564 | """
|
1565 |
|
1566 | __metaclass__ = TupleMeta
|
1567 | __extra__ = tuple
|
1568 | __slots__ = ()
|
1569 |
|
1570 | def __new__(cls, *args, **kwds):
|
1571 | if cls._gorg is Tuple:
|
1572 | raise TypeError("Type Tuple cannot be instantiated; "
|
1573 | "use tuple() instead")
|
1574 | return _generic_new(tuple, cls, *args, **kwds)
|
1575 |
|
1576 |
|
1577 | class CallableMeta(GenericMeta):
|
1578 | """ Metaclass for Callable."""
|
1579 |
|
1580 | def __repr__(self):
|
1581 | if self.__origin__ is None:
|
1582 | return super(CallableMeta, self).__repr__()
|
1583 | return self._tree_repr(self._subs_tree())
|
1584 |
|
1585 | def _tree_repr(self, tree):
|
1586 | if self._gorg is not Callable:
|
1587 | return super(CallableMeta, self)._tree_repr(tree)
|
1588 | # For actual Callable (not its subclass) we override
|
1589 | # super(CallableMeta, self)._tree_repr() for nice formatting.
|
1590 | arg_list = []
|
1591 | for arg in tree[1:]:
|
1592 | if not isinstance(arg, tuple):
|
1593 | arg_list.append(_type_repr(arg))
|
1594 | else:
|
1595 | arg_list.append(arg[0]._tree_repr(arg))
|
1596 | if arg_list[0] == '...':
|
1597 | return repr(tree[0]) + '[..., %s]' % arg_list[1]
|
1598 | return (repr(tree[0]) +
|
1599 | '[[%s], %s]' % (', '.join(arg_list[:-1]), arg_list[-1]))
|
1600 |
|
1601 | def __getitem__(self, parameters):
|
1602 | """A thin wrapper around __getitem_inner__ to provide the latter
|
1603 | with hashable arguments to improve speed.
|
1604 | """
|
1605 |
|
1606 | if self.__origin__ is not None or self._gorg is not Callable:
|
1607 | return super(CallableMeta, self).__getitem__(parameters)
|
1608 | if not isinstance(parameters, tuple) or len(parameters) != 2:
|
1609 | raise TypeError("Callable must be used as "
|
1610 | "Callable[[arg, ...], result].")
|
1611 | args, result = parameters
|
1612 | if args is Ellipsis:
|
1613 | parameters = (Ellipsis, result)
|
1614 | else:
|
1615 | if not isinstance(args, list):
|
1616 | raise TypeError("Callable[args, result]: args must be a list."
|
1617 | " Got %.100r." % (args,))
|
1618 | parameters = (tuple(args), result)
|
1619 | return self.__getitem_inner__(parameters)
|
1620 |
|
1621 | @_tp_cache
|
1622 | def __getitem_inner__(self, parameters):
|
1623 | args, result = parameters
|
1624 | msg = "Callable[args, result]: result must be a type."
|
1625 | result = _type_check(result, msg)
|
1626 | if args is Ellipsis:
|
1627 | return super(CallableMeta, self).__getitem__((_TypingEllipsis, result))
|
1628 | msg = "Callable[[arg, ...], result]: each arg must be a type."
|
1629 | args = tuple(_type_check(arg, msg) for arg in args)
|
1630 | parameters = args + (result,)
|
1631 | return super(CallableMeta, self).__getitem__(parameters)
|
1632 |
|
1633 |
|
1634 | copy._copy_dispatch[CallableMeta] = _copy_generic
|
1635 |
|
1636 |
|
1637 | class Callable(object):
|
1638 | """Callable type; Callable[[int], str] is a function of (int) -> str.
|
1639 |
|
1640 | The subscription syntax must always be used with exactly two
|
1641 | values: the argument list and the return type. The argument list
|
1642 | must be a list of types or ellipsis; the return type must be a single type.
|
1643 |
|
1644 | There is no syntax to indicate optional or keyword arguments,
|
1645 | such function types are rarely used as callback types.
|
1646 | """
|
1647 |
|
1648 | __metaclass__ = CallableMeta
|
1649 | __extra__ = collections_abc.Callable
|
1650 | __slots__ = ()
|
1651 |
|
1652 | def __new__(cls, *args, **kwds):
|
1653 | if cls._gorg is Callable:
|
1654 | raise TypeError("Type Callable cannot be instantiated; "
|
1655 | "use a non-abstract subclass instead")
|
1656 | return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
|
1657 |
|
1658 |
|
1659 | def cast(typ, val):
|
1660 | """Cast a value to a type.
|
1661 |
|
1662 | This returns the value unchanged. To the type checker this
|
1663 | signals that the return value has the designated type, but at
|
1664 | runtime we intentionally don't check anything (we want this
|
1665 | to be as fast as possible).
|
1666 | """
|
1667 | return val
|
1668 |
|
1669 |
|
1670 | def _get_defaults(func):
|
1671 | """Internal helper to extract the default arguments, by name."""
|
1672 | code = func.__code__
|
1673 | pos_count = code.co_argcount
|
1674 | arg_names = code.co_varnames
|
1675 | arg_names = arg_names[:pos_count]
|
1676 | defaults = func.__defaults__ or ()
|
1677 | kwdefaults = func.__kwdefaults__
|
1678 | res = dict(kwdefaults) if kwdefaults else {}
|
1679 | pos_offset = pos_count - len(defaults)
|
1680 | for name, value in zip(arg_names[pos_offset:], defaults):
|
1681 | assert name not in res
|
1682 | res[name] = value
|
1683 | return res
|
1684 |
|
1685 |
|
1686 | def get_type_hints(obj, globalns=None, localns=None):
|
1687 | """In Python 2 this is not supported and always returns None."""
|
1688 | return None
|
1689 |
|
1690 |
|
1691 | def no_type_check(arg):
|
1692 | """Decorator to indicate that annotations are not type hints.
|
1693 |
|
1694 | The argument must be a class or function; if it is a class, it
|
1695 | applies recursively to all methods and classes defined in that class
|
1696 | (but not to methods defined in its superclasses or subclasses).
|
1697 |
|
1698 | This mutates the function(s) or class(es) in place.
|
1699 | """
|
1700 | if isinstance(arg, type):
|
1701 | arg_attrs = arg.__dict__.copy()
|
1702 | for attr, val in arg.__dict__.items():
|
1703 | if val in arg.__bases__ + (arg,):
|
1704 | arg_attrs.pop(attr)
|
1705 | for obj in arg_attrs.values():
|
1706 | if isinstance(obj, types.FunctionType):
|
1707 | obj.__no_type_check__ = True
|
1708 | if isinstance(obj, type):
|
1709 | no_type_check(obj)
|
1710 | try:
|
1711 | arg.__no_type_check__ = True
|
1712 | except TypeError: # built-in classes
|
1713 | pass
|
1714 | return arg
|
1715 |
|
1716 |
|
1717 | def no_type_check_decorator(decorator):
|
1718 | """Decorator to give another decorator the @no_type_check effect.
|
1719 |
|
1720 | This wraps the decorator with something that wraps the decorated
|
1721 | function in @no_type_check.
|
1722 | """
|
1723 |
|
1724 | @functools.wraps(decorator)
|
1725 | def wrapped_decorator(*args, **kwds):
|
1726 | func = decorator(*args, **kwds)
|
1727 | func = no_type_check(func)
|
1728 | return func
|
1729 |
|
1730 | return wrapped_decorator
|
1731 |
|
1732 |
|
1733 | def _overload_dummy(*args, **kwds):
|
1734 | """Helper for @overload to raise when called."""
|
1735 | raise NotImplementedError(
|
1736 | "You should not call an overloaded function. "
|
1737 | "A series of @overload-decorated functions "
|
1738 | "outside a stub module should always be followed "
|
1739 | "by an implementation that is not @overload-ed.")
|
1740 |
|
1741 |
|
1742 | def overload(func):
|
1743 | """Decorator for overloaded functions/methods.
|
1744 |
|
1745 | In a stub file, place two or more stub definitions for the same
|
1746 | function in a row, each decorated with @overload. For example:
|
1747 |
|
1748 | @overload
|
1749 | def utf8(value: None) -> None: ...
|
1750 | @overload
|
1751 | def utf8(value: bytes) -> bytes: ...
|
1752 | @overload
|
1753 | def utf8(value: str) -> bytes: ...
|
1754 |
|
1755 | In a non-stub file (i.e. a regular .py file), do the same but
|
1756 | follow it with an implementation. The implementation should *not*
|
1757 | be decorated with @overload. For example:
|
1758 |
|
1759 | @overload
|
1760 | def utf8(value: None) -> None: ...
|
1761 | @overload
|
1762 | def utf8(value: bytes) -> bytes: ...
|
1763 | @overload
|
1764 | def utf8(value: str) -> bytes: ...
|
1765 | def utf8(value):
|
1766 | # implementation goes here
|
1767 | """
|
1768 | return _overload_dummy
|
1769 |
|
1770 |
|
1771 | _PROTO_WHITELIST = ['Callable', 'Iterable', 'Iterator',
|
1772 | 'Hashable', 'Sized', 'Container', 'Collection',
|
1773 | 'Reversible', 'ContextManager']
|
1774 |
|
1775 |
|
1776 | class _ProtocolMeta(GenericMeta):
|
1777 | """Internal metaclass for Protocol.
|
1778 |
|
1779 | This exists so Protocol classes can be generic without deriving
|
1780 | from Generic.
|
1781 | """
|
1782 | def __init__(cls, *args, **kwargs):
|
1783 | super(_ProtocolMeta, cls).__init__(*args, **kwargs)
|
1784 | if not cls.__dict__.get('_is_protocol', None):
|
1785 | cls._is_protocol = any(b is Protocol or
|
1786 | isinstance(b, _ProtocolMeta) and
|
1787 | b.__origin__ is Protocol
|
1788 | for b in cls.__bases__)
|
1789 | if cls._is_protocol:
|
1790 | for base in cls.__mro__[1:]:
|
1791 | if not (base in (object, Generic) or
|
1792 | base.__module__ == '_abcoll' and
|
1793 | base.__name__ in _PROTO_WHITELIST or
|
1794 | isinstance(base, TypingMeta) and base._is_protocol or
|
1795 | isinstance(base, GenericMeta) and base.__origin__ is Generic):
|
1796 | raise TypeError('Protocols can only inherit from other protocols,'
|
1797 | ' got %r' % base)
|
1798 | cls._callable_members_only = all(callable(getattr(cls, attr))
|
1799 | for attr in cls._get_protocol_attrs())
|
1800 |
|
1801 | def _no_init(self, *args, **kwargs):
|
1802 | if type(self)._is_protocol:
|
1803 | raise TypeError('Protocols cannot be instantiated')
|
1804 | cls.__init__ = _no_init
|
1805 |
|
1806 | def _proto_hook(cls, other):
|
1807 | if not cls.__dict__.get('_is_protocol', None):
|
1808 | return NotImplemented
|
1809 | if not isinstance(other, type):
|
1810 | # Similar error as for issubclass(1, int)
|
1811 | # (also not a chance for old-style classes)
|
1812 | raise TypeError('issubclass() arg 1 must be a new-style class')
|
1813 | for attr in cls._get_protocol_attrs():
|
1814 | for base in other.__mro__:
|
1815 | if attr in base.__dict__:
|
1816 | if base.__dict__[attr] is None:
|
1817 | return NotImplemented
|
1818 | break
|
1819 | else:
|
1820 | return NotImplemented
|
1821 | return True
|
1822 | if '__subclasshook__' not in cls.__dict__:
|
1823 | cls.__subclasshook__ = classmethod(_proto_hook)
|
1824 |
|
1825 | def __instancecheck__(self, instance):
|
1826 | # We need this method for situations where attributes are assigned in __init__
|
1827 | if isinstance(instance, type):
|
1828 | # This looks like a fundamental limitation of Python 2.
|
1829 | # It cannot support runtime protocol metaclasses, On Python 2 classes
|
1830 | # cannot be correctly inspected as instances of protocols.
|
1831 | return False
|
1832 | if ((not getattr(self, '_is_protocol', False) or
|
1833 | self._callable_members_only) and
|
1834 | issubclass(instance.__class__, self)):
|
1835 | return True
|
1836 | if self._is_protocol:
|
1837 | if all(hasattr(instance, attr) and
|
1838 | (not callable(getattr(self, attr)) or
|
1839 | getattr(instance, attr) is not None)
|
1840 | for attr in self._get_protocol_attrs()):
|
1841 | return True
|
1842 | return super(GenericMeta, self).__instancecheck__(instance)
|
1843 |
|
1844 | def __subclasscheck__(self, cls):
|
1845 | if (self.__dict__.get('_is_protocol', None) and
|
1846 | not self.__dict__.get('_is_runtime_protocol', None)):
|
1847 | if (sys._getframe(1).f_globals['__name__'] in ['abc', 'functools'] or
|
1848 | # This is needed because we remove subclasses from unions on Python 2.
|
1849 | sys._getframe(2).f_globals['__name__'] == 'typing'):
|
1850 | return False
|
1851 | raise TypeError("Instance and class checks can only be used with"
|
1852 | " @runtime_checkable protocols")
|
1853 | if (self.__dict__.get('_is_runtime_protocol', None) and
|
1854 | not self._callable_members_only):
|
1855 | if sys._getframe(1).f_globals['__name__'] in ['abc', 'functools']:
|
1856 | return super(GenericMeta, self).__subclasscheck__(cls)
|
1857 | raise TypeError("Protocols with non-method members"
|
1858 | " don't support issubclass()")
|
1859 | return super(_ProtocolMeta, self).__subclasscheck__(cls)
|
1860 |
|
1861 | def _get_protocol_attrs(self):
|
1862 | attrs = set()
|
1863 | for base in self.__mro__[:-1]: # without object
|
1864 | if base.__name__ in ('Protocol', 'Generic'):
|
1865 | continue
|
1866 | annotations = getattr(base, '__annotations__', {})
|
1867 | for attr in list(base.__dict__.keys()) + list(annotations.keys()):
|
1868 | if (not attr.startswith('_abc_') and attr not in (
|
1869 | '__abstractmethods__', '__annotations__', '__weakref__',
|
1870 | '_is_protocol', '_is_runtime_protocol', '__dict__',
|
1871 | '__args__', '__slots__', '_get_protocol_attrs',
|
1872 | '__next_in_mro__', '__parameters__', '__origin__',
|
1873 | '__orig_bases__', '__extra__', '__tree_hash__',
|
1874 | '__doc__', '__subclasshook__', '__init__', '__new__',
|
1875 | '__module__', '_MutableMapping__marker',
|
1876 | '__metaclass__', '_gorg', '_callable_members_only')):
|
1877 | attrs.add(attr)
|
1878 | return attrs
|
1879 |
|
1880 |
|
1881 | class Protocol(object):
|
1882 | """Base class for protocol classes. Protocol classes are defined as::
|
1883 |
|
1884 | class Proto(Protocol):
|
1885 | def meth(self):
|
1886 | # type: () -> int
|
1887 | pass
|
1888 |
|
1889 | Such classes are primarily used with static type checkers that recognize
|
1890 | structural subtyping (static duck-typing), for example::
|
1891 |
|
1892 | class C:
|
1893 | def meth(self):
|
1894 | # type: () -> int
|
1895 | return 0
|
1896 |
|
1897 | def func(x):
|
1898 | # type: (Proto) -> int
|
1899 | return x.meth()
|
1900 |
|
1901 | func(C()) # Passes static type check
|
1902 |
|
1903 | See PEP 544 for details. Protocol classes decorated with @typing.runtime_checkable
|
1904 | act as simple-minded runtime protocols that checks only the presence of
|
1905 | given attributes, ignoring their type signatures.
|
1906 |
|
1907 | Protocol classes can be generic, they are defined as::
|
1908 |
|
1909 | class GenProto(Protocol[T]):
|
1910 | def meth(self):
|
1911 | # type: () -> T
|
1912 | pass
|
1913 | """
|
1914 |
|
1915 | __metaclass__ = _ProtocolMeta
|
1916 | __slots__ = ()
|
1917 | _is_protocol = True
|
1918 |
|
1919 | def __new__(cls, *args, **kwds):
|
1920 | if cls._gorg is Protocol:
|
1921 | raise TypeError("Type Protocol cannot be instantiated; "
|
1922 | "it can be used only as a base class")
|
1923 | return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
|
1924 |
|
1925 |
|
1926 | def runtime_checkable(cls):
|
1927 | """Mark a protocol class as a runtime protocol, so that it
|
1928 | can be used with isinstance() and issubclass(). Raise TypeError
|
1929 | if applied to a non-protocol class.
|
1930 |
|
1931 | This allows a simple-minded structural check very similar to the
|
1932 | one-offs in collections.abc such as Hashable.
|
1933 | """
|
1934 | if not isinstance(cls, _ProtocolMeta) or not cls._is_protocol:
|
1935 | raise TypeError('@runtime_checkable can be only applied to protocol classes,'
|
1936 | ' got %r' % cls)
|
1937 | cls._is_runtime_protocol = True
|
1938 | return cls
|
1939 |
|
1940 |
|
1941 | # Various ABCs mimicking those in collections.abc.
|
1942 | # A few are simply re-exported for completeness.
|
1943 |
|
1944 | Hashable = collections_abc.Hashable # Not generic.
|
1945 |
|
1946 |
|
1947 | class Iterable(Generic[T_co]):
|
1948 | __slots__ = ()
|
1949 | __extra__ = collections_abc.Iterable
|
1950 |
|
1951 |
|
1952 | class Iterator(Iterable[T_co]):
|
1953 | __slots__ = ()
|
1954 | __extra__ = collections_abc.Iterator
|
1955 |
|
1956 |
|
1957 | @runtime_checkable
|
1958 | class SupportsInt(Protocol):
|
1959 | __slots__ = ()
|
1960 |
|
1961 | @abstractmethod
|
1962 | def __int__(self):
|
1963 | pass
|
1964 |
|
1965 |
|
1966 | @runtime_checkable
|
1967 | class SupportsFloat(Protocol):
|
1968 | __slots__ = ()
|
1969 |
|
1970 | @abstractmethod
|
1971 | def __float__(self):
|
1972 | pass
|
1973 |
|
1974 |
|
1975 | @runtime_checkable
|
1976 | class SupportsComplex(Protocol):
|
1977 | __slots__ = ()
|
1978 |
|
1979 | @abstractmethod
|
1980 | def __complex__(self):
|
1981 | pass
|
1982 |
|
1983 |
|
1984 | @runtime_checkable
|
1985 | class SupportsIndex(Protocol):
|
1986 | __slots__ = ()
|
1987 |
|
1988 | @abstractmethod
|
1989 | def __index__(self):
|
1990 | pass
|
1991 |
|
1992 |
|
1993 | @runtime_checkable
|
1994 | class SupportsAbs(Protocol[T_co]):
|
1995 | __slots__ = ()
|
1996 |
|
1997 | @abstractmethod
|
1998 | def __abs__(self):
|
1999 | pass
|
2000 |
|
2001 |
|
2002 | if hasattr(collections_abc, 'Reversible'):
|
2003 | class Reversible(Iterable[T_co]):
|
2004 | __slots__ = ()
|
2005 | __extra__ = collections_abc.Reversible
|
2006 | else:
|
2007 | @runtime_checkable
|
2008 | class Reversible(Protocol[T_co]):
|
2009 | __slots__ = ()
|
2010 |
|
2011 | @abstractmethod
|
2012 | def __reversed__(self):
|
2013 | pass
|
2014 |
|
2015 |
|
2016 | Sized = collections_abc.Sized # Not generic.
|
2017 |
|
2018 |
|
2019 | class Container(Generic[T_co]):
|
2020 | __slots__ = ()
|
2021 | __extra__ = collections_abc.Container
|
2022 |
|
2023 |
|
2024 | # Callable was defined earlier.
|
2025 |
|
2026 |
|
2027 | class AbstractSet(Sized, Iterable[T_co], Container[T_co]):
|
2028 | __slots__ = ()
|
2029 | __extra__ = collections_abc.Set
|
2030 |
|
2031 |
|
2032 | class MutableSet(AbstractSet[T]):
|
2033 | __slots__ = ()
|
2034 | __extra__ = collections_abc.MutableSet
|
2035 |
|
2036 |
|
2037 | # NOTE: It is only covariant in the value type.
|
2038 | class Mapping(Sized, Iterable[KT], Container[KT], Generic[KT, VT_co]):
|
2039 | __slots__ = ()
|
2040 | __extra__ = collections_abc.Mapping
|
2041 |
|
2042 |
|
2043 | class MutableMapping(Mapping[KT, VT]):
|
2044 | __slots__ = ()
|
2045 | __extra__ = collections_abc.MutableMapping
|
2046 |
|
2047 |
|
2048 | if hasattr(collections_abc, 'Reversible'):
|
2049 | class Sequence(Sized, Reversible[T_co], Container[T_co]):
|
2050 | __slots__ = ()
|
2051 | __extra__ = collections_abc.Sequence
|
2052 | else:
|
2053 | class Sequence(Sized, Iterable[T_co], Container[T_co]):
|
2054 | __slots__ = ()
|
2055 | __extra__ = collections_abc.Sequence
|
2056 |
|
2057 |
|
2058 | class MutableSequence(Sequence[T]):
|
2059 | __slots__ = ()
|
2060 | __extra__ = collections_abc.MutableSequence
|
2061 |
|
2062 |
|
2063 | class ByteString(Sequence[int]):
|
2064 | pass
|
2065 |
|
2066 |
|
2067 | ByteString.register(str)
|
2068 | # OVM_MAIN PATCH: don't need bytearray
|
2069 | #ByteString.register(bytearray)
|
2070 |
|
2071 |
|
2072 | class List(list, MutableSequence[T]):
|
2073 | __slots__ = ()
|
2074 | __extra__ = list
|
2075 |
|
2076 | def __new__(cls, *args, **kwds):
|
2077 | if cls._gorg is List:
|
2078 | raise TypeError("Type List cannot be instantiated; "
|
2079 | "use list() instead")
|
2080 | return _generic_new(list, cls, *args, **kwds)
|
2081 |
|
2082 |
|
2083 | class Deque(collections.deque, MutableSequence[T]):
|
2084 | __slots__ = ()
|
2085 | __extra__ = collections.deque
|
2086 |
|
2087 | def __new__(cls, *args, **kwds):
|
2088 | if cls._gorg is Deque:
|
2089 | return collections.deque(*args, **kwds)
|
2090 | return _generic_new(collections.deque, cls, *args, **kwds)
|
2091 |
|
2092 |
|
2093 | class Set(set, MutableSet[T]):
|
2094 | __slots__ = ()
|
2095 | __extra__ = set
|
2096 |
|
2097 | def __new__(cls, *args, **kwds):
|
2098 | if cls._gorg is Set:
|
2099 | raise TypeError("Type Set cannot be instantiated; "
|
2100 | "use set() instead")
|
2101 | return _generic_new(set, cls, *args, **kwds)
|
2102 |
|
2103 |
|
2104 | class FrozenSet(frozenset, AbstractSet[T_co]):
|
2105 | __slots__ = ()
|
2106 | __extra__ = frozenset
|
2107 |
|
2108 | def __new__(cls, *args, **kwds):
|
2109 | if cls._gorg is FrozenSet:
|
2110 | raise TypeError("Type FrozenSet cannot be instantiated; "
|
2111 | "use frozenset() instead")
|
2112 | return _generic_new(frozenset, cls, *args, **kwds)
|
2113 |
|
2114 |
|
2115 | class MappingView(Sized, Iterable[T_co]):
|
2116 | __slots__ = ()
|
2117 | __extra__ = collections_abc.MappingView
|
2118 |
|
2119 |
|
2120 | class KeysView(MappingView[KT], AbstractSet[KT]):
|
2121 | __slots__ = ()
|
2122 | __extra__ = collections_abc.KeysView
|
2123 |
|
2124 |
|
2125 | class ItemsView(MappingView[Tuple[KT, VT_co]],
|
2126 | AbstractSet[Tuple[KT, VT_co]],
|
2127 | Generic[KT, VT_co]):
|
2128 | __slots__ = ()
|
2129 | __extra__ = collections_abc.ItemsView
|
2130 |
|
2131 |
|
2132 | class ValuesView(MappingView[VT_co]):
|
2133 | __slots__ = ()
|
2134 | __extra__ = collections_abc.ValuesView
|
2135 |
|
2136 |
|
2137 | class ContextManager(Generic[T_co]):
|
2138 | __slots__ = ()
|
2139 |
|
2140 | def __enter__(self):
|
2141 | return self
|
2142 |
|
2143 | @abc.abstractmethod
|
2144 | def __exit__(self, exc_type, exc_value, traceback):
|
2145 | return None
|
2146 |
|
2147 | @classmethod
|
2148 | def __subclasshook__(cls, C):
|
2149 | if cls is ContextManager:
|
2150 | # In Python 3.6+, it is possible to set a method to None to
|
2151 | # explicitly indicate that the class does not implement an ABC
|
2152 | # (https://bugs.python.org/issue25958), but we do not support
|
2153 | # that pattern here because this fallback class is only used
|
2154 | # in Python 3.5 and earlier.
|
2155 | if (any("__enter__" in B.__dict__ for B in C.__mro__) and
|
2156 | any("__exit__" in B.__dict__ for B in C.__mro__)):
|
2157 | return True
|
2158 | return NotImplemented
|
2159 |
|
2160 |
|
2161 | class Dict(dict, MutableMapping[KT, VT]):
|
2162 | __slots__ = ()
|
2163 | __extra__ = dict
|
2164 |
|
2165 | def __new__(cls, *args, **kwds):
|
2166 | if cls._gorg is Dict:
|
2167 | raise TypeError("Type Dict cannot be instantiated; "
|
2168 | "use dict() instead")
|
2169 | return _generic_new(dict, cls, *args, **kwds)
|
2170 |
|
2171 |
|
2172 | class DefaultDict(collections.defaultdict, MutableMapping[KT, VT]):
|
2173 | __slots__ = ()
|
2174 | __extra__ = collections.defaultdict
|
2175 |
|
2176 | def __new__(cls, *args, **kwds):
|
2177 | if cls._gorg is DefaultDict:
|
2178 | return collections.defaultdict(*args, **kwds)
|
2179 | return _generic_new(collections.defaultdict, cls, *args, **kwds)
|
2180 |
|
2181 |
|
2182 | class Counter(collections.Counter, Dict[T, int]):
|
2183 | __slots__ = ()
|
2184 | __extra__ = collections.Counter
|
2185 |
|
2186 | def __new__(cls, *args, **kwds):
|
2187 | if cls._gorg is Counter:
|
2188 | return collections.Counter(*args, **kwds)
|
2189 | return _generic_new(collections.Counter, cls, *args, **kwds)
|
2190 |
|
2191 |
|
2192 | # Determine what base class to use for Generator.
|
2193 | if hasattr(collections_abc, 'Generator'):
|
2194 | # Sufficiently recent versions of 3.5 have a Generator ABC.
|
2195 | _G_base = collections_abc.Generator
|
2196 | else:
|
2197 | # Fall back on the exact type.
|
2198 | _G_base = types.GeneratorType
|
2199 |
|
2200 |
|
2201 | class Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]):
|
2202 | __slots__ = ()
|
2203 | __extra__ = _G_base
|
2204 |
|
2205 | def __new__(cls, *args, **kwds):
|
2206 | if cls._gorg is Generator:
|
2207 | raise TypeError("Type Generator cannot be instantiated; "
|
2208 | "create a subclass instead")
|
2209 | return _generic_new(_G_base, cls, *args, **kwds)
|
2210 |
|
2211 |
|
2212 | # Internal type variable used for Type[].
|
2213 | CT_co = TypeVar('CT_co', covariant=True, bound=type)
|
2214 |
|
2215 |
|
2216 | # This is not a real generic class. Don't use outside annotations.
|
2217 | class Type(Generic[CT_co]):
|
2218 | """A special construct usable to annotate class objects.
|
2219 |
|
2220 | For example, suppose we have the following classes::
|
2221 |
|
2222 | class User: ... # Abstract base for User classes
|
2223 | class BasicUser(User): ...
|
2224 | class ProUser(User): ...
|
2225 | class TeamUser(User): ...
|
2226 |
|
2227 | And a function that takes a class argument that's a subclass of
|
2228 | User and returns an instance of the corresponding class::
|
2229 |
|
2230 | U = TypeVar('U', bound=User)
|
2231 | def new_user(user_class: Type[U]) -> U:
|
2232 | user = user_class()
|
2233 | # (Here we could write the user object to a database)
|
2234 | return user
|
2235 |
|
2236 | joe = new_user(BasicUser)
|
2237 |
|
2238 | At this point the type checker knows that joe has type BasicUser.
|
2239 | """
|
2240 | __slots__ = ()
|
2241 | __extra__ = type
|
2242 |
|
2243 |
|
2244 | def NamedTuple(typename, fields):
|
2245 | """Typed version of namedtuple.
|
2246 |
|
2247 | Usage::
|
2248 |
|
2249 | Employee = typing.NamedTuple('Employee', [('name', str), ('id', int)])
|
2250 |
|
2251 | This is equivalent to::
|
2252 |
|
2253 | Employee = collections.namedtuple('Employee', ['name', 'id'])
|
2254 |
|
2255 | The resulting class has one extra attribute: _field_types,
|
2256 | giving a dict mapping field names to types. (The field names
|
2257 | are in the _fields attribute, which is part of the namedtuple
|
2258 | API.)
|
2259 | """
|
2260 | fields = [(n, t) for n, t in fields]
|
2261 | cls = collections.namedtuple(typename, [n for n, t in fields])
|
2262 | cls._field_types = dict(fields)
|
2263 | # Set the module to the caller's module (otherwise it'd be 'typing').
|
2264 | try:
|
2265 | cls.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__')
|
2266 | except (AttributeError, ValueError):
|
2267 | pass
|
2268 | return cls
|
2269 |
|
2270 |
|
2271 | def _check_fails(cls, other):
|
2272 | try:
|
2273 | if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools', 'typing']:
|
2274 | # Typed dicts are only for static structural subtyping.
|
2275 | raise TypeError('TypedDict does not support instance and class checks')
|
2276 | except (AttributeError, ValueError):
|
2277 | pass
|
2278 | return False
|
2279 |
|
2280 |
|
2281 | def _dict_new(cls, *args, **kwargs):
|
2282 | return dict(*args, **kwargs)
|
2283 |
|
2284 |
|
2285 | def _typeddict_new(cls, _typename, _fields=None, **kwargs):
|
2286 | total = kwargs.pop('total', True)
|
2287 | if _fields is None:
|
2288 | _fields = kwargs
|
2289 | elif kwargs:
|
2290 | raise TypeError("TypedDict takes either a dict or keyword arguments,"
|
2291 | " but not both")
|
2292 |
|
2293 | ns = {'__annotations__': dict(_fields), '__total__': total}
|
2294 | try:
|
2295 | # Setting correct module is necessary to make typed dict classes pickleable.
|
2296 | ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
|
2297 | except (AttributeError, ValueError):
|
2298 | pass
|
2299 |
|
2300 | return _TypedDictMeta(_typename, (), ns)
|
2301 |
|
2302 |
|
2303 | class _TypedDictMeta(type):
|
2304 | def __new__(cls, name, bases, ns, total=True):
|
2305 | # Create new typed dict class object.
|
2306 | # This method is called directly when TypedDict is subclassed,
|
2307 | # or via _typeddict_new when TypedDict is instantiated. This way
|
2308 | # TypedDict supports all three syntaxes described in its docstring.
|
2309 | # Subclasses and instances of TypedDict return actual dictionaries
|
2310 | # via _dict_new.
|
2311 | ns['__new__'] = _typeddict_new if name == b'TypedDict' else _dict_new
|
2312 | tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns)
|
2313 |
|
2314 | anns = ns.get('__annotations__', {})
|
2315 | msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
|
2316 | anns = {n: _type_check(tp, msg) for n, tp in anns.items()}
|
2317 | for base in bases:
|
2318 | anns.update(base.__dict__.get('__annotations__', {}))
|
2319 | tp_dict.__annotations__ = anns
|
2320 | if not hasattr(tp_dict, '__total__'):
|
2321 | tp_dict.__total__ = total
|
2322 | return tp_dict
|
2323 |
|
2324 | __instancecheck__ = __subclasscheck__ = _check_fails
|
2325 |
|
2326 |
|
2327 | TypedDict = _TypedDictMeta(b'TypedDict', (dict,), {})
|
2328 | TypedDict.__module__ = __name__
|
2329 | TypedDict.__doc__ = \
|
2330 | """A simple typed name space. At runtime it is equivalent to a plain dict.
|
2331 |
|
2332 | TypedDict creates a dictionary type that expects all of its
|
2333 | instances to have a certain set of keys, with each key
|
2334 | associated with a value of a consistent type. This expectation
|
2335 | is not checked at runtime but is only enforced by type checkers.
|
2336 | Usage::
|
2337 |
|
2338 | Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
|
2339 |
|
2340 | a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK
|
2341 | b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check
|
2342 |
|
2343 | assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
|
2344 |
|
2345 | The type info could be accessed via Point2D.__annotations__. TypedDict
|
2346 | supports an additional equivalent form::
|
2347 |
|
2348 | Point2D = TypedDict('Point2D', x=int, y=int, label=str)
|
2349 | """
|
2350 |
|
2351 |
|
2352 | def NewType(name, tp):
|
2353 | """NewType creates simple unique types with almost zero
|
2354 | runtime overhead. NewType(name, tp) is considered a subtype of tp
|
2355 | by static type checkers. At runtime, NewType(name, tp) returns
|
2356 | a dummy function that simply returns its argument. Usage::
|
2357 |
|
2358 | UserId = NewType('UserId', int)
|
2359 |
|
2360 | def name_by_id(user_id):
|
2361 | # type: (UserId) -> str
|
2362 | ...
|
2363 |
|
2364 | UserId('user') # Fails type check
|
2365 |
|
2366 | name_by_id(42) # Fails type check
|
2367 | name_by_id(UserId(42)) # OK
|
2368 |
|
2369 | num = UserId(5) + 1 # type: int
|
2370 | """
|
2371 |
|
2372 | def new_type(x):
|
2373 | return x
|
2374 |
|
2375 | # Some versions of Python 2 complain because of making all strings unicode
|
2376 | new_type.__name__ = str(name)
|
2377 | new_type.__supertype__ = tp
|
2378 | return new_type
|
2379 |
|
2380 |
|
2381 | # Python-version-specific alias (Python 2: unicode; Python 3: str)
|
2382 | Text = unicode
|
2383 |
|
2384 |
|
2385 | # Constant that's True when type checking, but False here.
|
2386 | TYPE_CHECKING = False
|
2387 |
|
2388 |
|
2389 | class IO(Generic[AnyStr]):
|
2390 | """Generic base class for TextIO and BinaryIO.
|
2391 |
|
2392 | This is an abstract, generic version of the return of open().
|
2393 |
|
2394 | NOTE: This does not distinguish between the different possible
|
2395 | classes (text vs. binary, read vs. write vs. read/write,
|
2396 | append-only, unbuffered). The TextIO and BinaryIO subclasses
|
2397 | below capture the distinctions between text vs. binary, which is
|
2398 | pervasive in the interface; however we currently do not offer a
|
2399 | way to track the other distinctions in the type system.
|
2400 | """
|
2401 |
|
2402 | __slots__ = ()
|
2403 |
|
2404 | @abstractproperty
|
2405 | def mode(self):
|
2406 | pass
|
2407 |
|
2408 | @abstractproperty
|
2409 | def name(self):
|
2410 | pass
|
2411 |
|
2412 | @abstractmethod
|
2413 | def close(self):
|
2414 | pass
|
2415 |
|
2416 | @abstractproperty
|
2417 | def closed(self):
|
2418 | pass
|
2419 |
|
2420 | @abstractmethod
|
2421 | def fileno(self):
|
2422 | pass
|
2423 |
|
2424 | @abstractmethod
|
2425 | def flush(self):
|
2426 | pass
|
2427 |
|
2428 | @abstractmethod
|
2429 | def isatty(self):
|
2430 | pass
|
2431 |
|
2432 | @abstractmethod
|
2433 | def read(self, n=-1):
|
2434 | pass
|
2435 |
|
2436 | @abstractmethod
|
2437 | def readable(self):
|
2438 | pass
|
2439 |
|
2440 | @abstractmethod
|
2441 | def readline(self, limit=-1):
|
2442 | pass
|
2443 |
|
2444 | @abstractmethod
|
2445 | def readlines(self, hint=-1):
|
2446 | pass
|
2447 |
|
2448 | @abstractmethod
|
2449 | def seek(self, offset, whence=0):
|
2450 | pass
|
2451 |
|
2452 | @abstractmethod
|
2453 | def seekable(self):
|
2454 | pass
|
2455 |
|
2456 | @abstractmethod
|
2457 | def tell(self):
|
2458 | pass
|
2459 |
|
2460 | @abstractmethod
|
2461 | def truncate(self, size=None):
|
2462 | pass
|
2463 |
|
2464 | @abstractmethod
|
2465 | def writable(self):
|
2466 | pass
|
2467 |
|
2468 | @abstractmethod
|
2469 | def write(self, s):
|
2470 | pass
|
2471 |
|
2472 | @abstractmethod
|
2473 | def writelines(self, lines):
|
2474 | pass
|
2475 |
|
2476 | @abstractmethod
|
2477 | def __enter__(self):
|
2478 | pass
|
2479 |
|
2480 | @abstractmethod
|
2481 | def __exit__(self, type, value, traceback):
|
2482 | pass
|
2483 |
|
2484 |
|
2485 | class BinaryIO(IO[bytes]):
|
2486 | """Typed version of the return of open() in binary mode."""
|
2487 |
|
2488 | __slots__ = ()
|
2489 |
|
2490 | @abstractmethod
|
2491 | def write(self, s):
|
2492 | pass
|
2493 |
|
2494 | @abstractmethod
|
2495 | def __enter__(self):
|
2496 | pass
|
2497 |
|
2498 |
|
2499 | class TextIO(IO[unicode]):
|
2500 | """Typed version of the return of open() in text mode."""
|
2501 |
|
2502 | __slots__ = ()
|
2503 |
|
2504 | @abstractproperty
|
2505 | def buffer(self):
|
2506 | pass
|
2507 |
|
2508 | @abstractproperty
|
2509 | def encoding(self):
|
2510 | pass
|
2511 |
|
2512 | @abstractproperty
|
2513 | def errors(self):
|
2514 | pass
|
2515 |
|
2516 | @abstractproperty
|
2517 | def line_buffering(self):
|
2518 | pass
|
2519 |
|
2520 | @abstractproperty
|
2521 | def newlines(self):
|
2522 | pass
|
2523 |
|
2524 | @abstractmethod
|
2525 | def __enter__(self):
|
2526 | pass
|
2527 |
|
2528 |
|
2529 | class io(object):
|
2530 | """Wrapper namespace for IO generic classes."""
|
2531 |
|
2532 | __all__ = ['IO', 'TextIO', 'BinaryIO']
|
2533 | IO = IO
|
2534 | TextIO = TextIO
|
2535 | BinaryIO = BinaryIO
|
2536 |
|
2537 |
|
2538 | io.__name__ = __name__ + b'.io'
|
2539 | sys.modules[io.__name__] = io
|
2540 |
|
2541 |
|
2542 | Pattern = _TypeAlias('Pattern', AnyStr, type(stdlib_re.compile('')),
|
2543 | lambda p: p.pattern)
|
2544 | Match = _TypeAlias('Match', AnyStr, type(stdlib_re.match('', '')),
|
2545 | lambda m: m.re.pattern)
|
2546 |
|
2547 |
|
2548 | class re(object):
|
2549 | """Wrapper namespace for re type aliases."""
|
2550 |
|
2551 | __all__ = ['Pattern', 'Match']
|
2552 | Pattern = Pattern
|
2553 | Match = Match
|
2554 |
|
2555 |
|
2556 | re.__name__ = __name__ + b'.re'
|
2557 | sys.modules[re.__name__] = re
|