mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 15:41:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			2403 lines
		
	
	
	
		
			78 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			2403 lines
		
	
	
	
		
			78 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import abc
 | 
						|
from abc import abstractmethod, abstractproperty
 | 
						|
import collections
 | 
						|
import contextlib
 | 
						|
import functools
 | 
						|
import re as stdlib_re  # Avoid confusion with the re we export.
 | 
						|
import sys
 | 
						|
import types
 | 
						|
try:
 | 
						|
    import collections.abc as collections_abc
 | 
						|
except ImportError:
 | 
						|
    import collections as collections_abc  # Fallback for PY3.2.
 | 
						|
if sys.version_info[:2] >= (3, 6):
 | 
						|
    import _collections_abc  # Needed for private function _check_methods # noqa
 | 
						|
try:
 | 
						|
    from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType
 | 
						|
except ImportError:
 | 
						|
    WrapperDescriptorType = type(object.__init__)
 | 
						|
    MethodWrapperType = type(object().__str__)
 | 
						|
    MethodDescriptorType = type(str.join)
 | 
						|
 | 
						|
 | 
						|
# Please keep __all__ alphabetized within each category.
 | 
						|
__all__ = [
 | 
						|
    # Super-special typing primitives.
 | 
						|
    'Any',
 | 
						|
    'Callable',
 | 
						|
    'ClassVar',
 | 
						|
    'Generic',
 | 
						|
    'Optional',
 | 
						|
    'Tuple',
 | 
						|
    'Type',
 | 
						|
    'TypeVar',
 | 
						|
    'Union',
 | 
						|
 | 
						|
    # ABCs (from collections.abc).
 | 
						|
    'AbstractSet',  # collections.abc.Set.
 | 
						|
    'GenericMeta',  # subclass of abc.ABCMeta and a metaclass
 | 
						|
                    # for 'Generic' and ABCs below.
 | 
						|
    'ByteString',
 | 
						|
    'Container',
 | 
						|
    'ContextManager',
 | 
						|
    'Hashable',
 | 
						|
    'ItemsView',
 | 
						|
    'Iterable',
 | 
						|
    'Iterator',
 | 
						|
    'KeysView',
 | 
						|
    'Mapping',
 | 
						|
    'MappingView',
 | 
						|
    'MutableMapping',
 | 
						|
    'MutableSequence',
 | 
						|
    'MutableSet',
 | 
						|
    'Sequence',
 | 
						|
    'Sized',
 | 
						|
    'ValuesView',
 | 
						|
    # The following are added depending on presence
 | 
						|
    # of their non-generic counterparts in stdlib:
 | 
						|
    # Awaitable,
 | 
						|
    # AsyncIterator,
 | 
						|
    # AsyncIterable,
 | 
						|
    # Coroutine,
 | 
						|
    # Collection,
 | 
						|
    # AsyncGenerator,
 | 
						|
    # AsyncContextManager
 | 
						|
 | 
						|
    # Structural checks, a.k.a. protocols.
 | 
						|
    'Reversible',
 | 
						|
    'SupportsAbs',
 | 
						|
    'SupportsBytes',
 | 
						|
    'SupportsComplex',
 | 
						|
    'SupportsFloat',
 | 
						|
    'SupportsInt',
 | 
						|
    'SupportsRound',
 | 
						|
 | 
						|
    # Concrete collection types.
 | 
						|
    'Counter',
 | 
						|
    'Deque',
 | 
						|
    'Dict',
 | 
						|
    'DefaultDict',
 | 
						|
    'List',
 | 
						|
    'Set',
 | 
						|
    'FrozenSet',
 | 
						|
    'NamedTuple',  # Not really a type.
 | 
						|
    'Generator',
 | 
						|
 | 
						|
    # One-off things.
 | 
						|
    'AnyStr',
 | 
						|
    'cast',
 | 
						|
    'get_type_hints',
 | 
						|
    'NewType',
 | 
						|
    'no_type_check',
 | 
						|
    'no_type_check_decorator',
 | 
						|
    'overload',
 | 
						|
    'Text',
 | 
						|
    'TYPE_CHECKING',
 | 
						|
]
 | 
						|
 | 
						|
# The pseudo-submodules 're' and 'io' are part of the public
 | 
						|
# namespace, but excluded from __all__ because they might stomp on
 | 
						|
# legitimate imports of those modules.
 | 
						|
 | 
						|
 | 
						|
def _qualname(x):
 | 
						|
    if sys.version_info[:2] >= (3, 3):
 | 
						|
        return x.__qualname__
 | 
						|
    else:
 | 
						|
        # Fall back to just name.
 | 
						|
        return x.__name__
 | 
						|
 | 
						|
 | 
						|
def _trim_name(nm):
 | 
						|
    whitelist = ('_TypeAlias', '_ForwardRef', '_TypingBase', '_FinalTypingBase')
 | 
						|
    if nm.startswith('_') and nm not in whitelist:
 | 
						|
        nm = nm[1:]
 | 
						|
    return nm
 | 
						|
 | 
						|
 | 
						|
class TypingMeta(type):
 | 
						|
    """Metaclass for most types defined in typing module
 | 
						|
    (not a part of public API).
 | 
						|
 | 
						|
    This overrides __new__() to require an extra keyword parameter
 | 
						|
    '_root', which serves as a guard against naive subclassing of the
 | 
						|
    typing classes.  Any legitimate class defined using a metaclass
 | 
						|
    derived from TypingMeta must pass _root=True.
 | 
						|
 | 
						|
    This also defines a dummy constructor (all the work for most typing
 | 
						|
    constructs is done in __new__) and a nicer repr().
 | 
						|
    """
 | 
						|
 | 
						|
    _is_protocol = False
 | 
						|
 | 
						|
    def __new__(cls, name, bases, namespace, *, _root=False):
 | 
						|
        if not _root:
 | 
						|
            raise TypeError("Cannot subclass %s" %
 | 
						|
                            (', '.join(map(_type_repr, bases)) or '()'))
 | 
						|
        return super().__new__(cls, name, bases, namespace)
 | 
						|
 | 
						|
    def __init__(self, *args, **kwds):
 | 
						|
        pass
 | 
						|
 | 
						|
    def _eval_type(self, globalns, localns):
 | 
						|
        """Override this in subclasses to interpret forward references.
 | 
						|
 | 
						|
        For example, List['C'] is internally stored as
 | 
						|
        List[_ForwardRef('C')], which should evaluate to List[C],
 | 
						|
        where C is an object found in globalns or localns (searching
 | 
						|
        localns first, of course).
 | 
						|
        """
 | 
						|
        return self
 | 
						|
 | 
						|
    def _get_type_vars(self, tvars):
 | 
						|
        pass
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        qname = _trim_name(_qualname(self))
 | 
						|
        return '%s.%s' % (self.__module__, qname)
 | 
						|
 | 
						|
 | 
						|
class _TypingBase(metaclass=TypingMeta, _root=True):
 | 
						|
    """Internal indicator of special typing constructs."""
 | 
						|
 | 
						|
    __slots__ = ('__weakref__',)
 | 
						|
 | 
						|
    def __init__(self, *args, **kwds):
 | 
						|
        pass
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        """Constructor.
 | 
						|
 | 
						|
        This only exists to give a better error message in case
 | 
						|
        someone tries to subclass a special typing object (not a good idea).
 | 
						|
        """
 | 
						|
        if (len(args) == 3 and
 | 
						|
                isinstance(args[0], str) and
 | 
						|
                isinstance(args[1], tuple)):
 | 
						|
            # Close enough.
 | 
						|
            raise TypeError("Cannot subclass %r" % cls)
 | 
						|
        return super().__new__(cls)
 | 
						|
 | 
						|
    # Things that are not classes also need these.
 | 
						|
    def _eval_type(self, globalns, localns):
 | 
						|
        return self
 | 
						|
 | 
						|
    def _get_type_vars(self, tvars):
 | 
						|
        pass
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        cls = type(self)
 | 
						|
        qname = _trim_name(_qualname(cls))
 | 
						|
        return '%s.%s' % (cls.__module__, qname)
 | 
						|
 | 
						|
    def __call__(self, *args, **kwds):
 | 
						|
        raise TypeError("Cannot instantiate %r" % type(self))
 | 
						|
 | 
						|
 | 
						|
class _FinalTypingBase(_TypingBase, _root=True):
 | 
						|
    """Internal mix-in class to prevent instantiation.
 | 
						|
 | 
						|
    Prevents instantiation unless _root=True is given in class call.
 | 
						|
    It is used to create pseudo-singleton instances Any, Union, Optional, etc.
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, _root=False, **kwds):
 | 
						|
        self = super().__new__(cls, *args, **kwds)
 | 
						|
        if _root is True:
 | 
						|
            return self
 | 
						|
        raise TypeError("Cannot instantiate %r" % cls)
 | 
						|
 | 
						|
    def __reduce__(self):
 | 
						|
        return _trim_name(type(self).__name__)
 | 
						|
 | 
						|
 | 
						|
class _ForwardRef(_TypingBase, _root=True):
 | 
						|
    """Internal wrapper to hold a forward reference."""
 | 
						|
 | 
						|
    __slots__ = ('__forward_arg__', '__forward_code__',
 | 
						|
                 '__forward_evaluated__', '__forward_value__')
 | 
						|
 | 
						|
    def __init__(self, arg):
 | 
						|
        super().__init__(arg)
 | 
						|
        if not isinstance(arg, str):
 | 
						|
            raise TypeError('Forward reference must be a string -- got %r' % (arg,))
 | 
						|
        try:
 | 
						|
            code = compile(arg, '<string>', 'eval')
 | 
						|
        except SyntaxError:
 | 
						|
            raise SyntaxError('Forward reference must be an expression -- got %r' %
 | 
						|
                              (arg,))
 | 
						|
        self.__forward_arg__ = arg
 | 
						|
        self.__forward_code__ = code
 | 
						|
        self.__forward_evaluated__ = False
 | 
						|
        self.__forward_value__ = None
 | 
						|
 | 
						|
    def _eval_type(self, globalns, localns):
 | 
						|
        if not self.__forward_evaluated__ or localns is not globalns:
 | 
						|
            if globalns is None and localns is None:
 | 
						|
                globalns = localns = {}
 | 
						|
            elif globalns is None:
 | 
						|
                globalns = localns
 | 
						|
            elif localns is None:
 | 
						|
                localns = globalns
 | 
						|
            self.__forward_value__ = _type_check(
 | 
						|
                eval(self.__forward_code__, globalns, localns),
 | 
						|
                "Forward references must evaluate to types.")
 | 
						|
            self.__forward_evaluated__ = True
 | 
						|
        return self.__forward_value__
 | 
						|
 | 
						|
    def __eq__(self, other):
 | 
						|
        if not isinstance(other, _ForwardRef):
 | 
						|
            return NotImplemented
 | 
						|
        return (self.__forward_arg__ == other.__forward_arg__ and
 | 
						|
                self.__forward_value__ == other.__forward_value__)
 | 
						|
 | 
						|
    def __hash__(self):
 | 
						|
        return hash((self.__forward_arg__, self.__forward_value__))
 | 
						|
 | 
						|
    def __instancecheck__(self, obj):
 | 
						|
        raise TypeError("Forward references cannot be used with isinstance().")
 | 
						|
 | 
						|
    def __subclasscheck__(self, cls):
 | 
						|
        raise TypeError("Forward references cannot be used with issubclass().")
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        return '_ForwardRef(%r)' % (self.__forward_arg__,)
 | 
						|
 | 
						|
 | 
						|
class _TypeAlias(_TypingBase, _root=True):
 | 
						|
    """Internal helper class for defining generic variants of concrete types.
 | 
						|
 | 
						|
    Note that this is not a type; let's call it a pseudo-type.  It cannot
 | 
						|
    be used in instance and subclass checks in parameterized form, i.e.
 | 
						|
    ``isinstance(42, Match[str])`` raises ``TypeError`` instead of returning
 | 
						|
    ``False``.
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ('name', 'type_var', 'impl_type', 'type_checker')
 | 
						|
 | 
						|
    def __init__(self, name, type_var, impl_type, type_checker):
 | 
						|
        """Initializer.
 | 
						|
 | 
						|
        Args:
 | 
						|
            name: The name, e.g. 'Pattern'.
 | 
						|
            type_var: The type parameter, e.g. AnyStr, or the
 | 
						|
                specific type, e.g. str.
 | 
						|
            impl_type: The implementation type.
 | 
						|
            type_checker: Function that takes an impl_type instance.
 | 
						|
                and returns a value that should be a type_var instance.
 | 
						|
        """
 | 
						|
        assert isinstance(name, str), repr(name)
 | 
						|
        assert isinstance(impl_type, type), repr(impl_type)
 | 
						|
        assert not isinstance(impl_type, TypingMeta), repr(impl_type)
 | 
						|
        assert isinstance(type_var, (type, _TypingBase)), repr(type_var)
 | 
						|
        self.name = name
 | 
						|
        self.type_var = type_var
 | 
						|
        self.impl_type = impl_type
 | 
						|
        self.type_checker = type_checker
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        return "%s[%s]" % (self.name, _type_repr(self.type_var))
 | 
						|
 | 
						|
    def __getitem__(self, parameter):
 | 
						|
        if not isinstance(self.type_var, TypeVar):
 | 
						|
            raise TypeError("%s cannot be further parameterized." % self)
 | 
						|
        if self.type_var.__constraints__ and isinstance(parameter, type):
 | 
						|
            if not issubclass(parameter, self.type_var.__constraints__):
 | 
						|
                raise TypeError("%s is not a valid substitution for %s." %
 | 
						|
                                (parameter, self.type_var))
 | 
						|
        if isinstance(parameter, TypeVar) and parameter is not self.type_var:
 | 
						|
            raise TypeError("%s cannot be re-parameterized." % self)
 | 
						|
        return self.__class__(self.name, parameter,
 | 
						|
                              self.impl_type, self.type_checker)
 | 
						|
 | 
						|
    def __eq__(self, other):
 | 
						|
        if not isinstance(other, _TypeAlias):
 | 
						|
            return NotImplemented
 | 
						|
        return self.name == other.name and self.type_var == other.type_var
 | 
						|
 | 
						|
    def __hash__(self):
 | 
						|
        return hash((self.name, self.type_var))
 | 
						|
 | 
						|
    def __instancecheck__(self, obj):
 | 
						|
        if not isinstance(self.type_var, TypeVar):
 | 
						|
            raise TypeError("Parameterized type aliases cannot be used "
 | 
						|
                            "with isinstance().")
 | 
						|
        return isinstance(obj, self.impl_type)
 | 
						|
 | 
						|
    def __subclasscheck__(self, cls):
 | 
						|
        if not isinstance(self.type_var, TypeVar):
 | 
						|
            raise TypeError("Parameterized type aliases cannot be used "
 | 
						|
                            "with issubclass().")
 | 
						|
        return issubclass(cls, self.impl_type)
 | 
						|
 | 
						|
 | 
						|
def _get_type_vars(types, tvars):
 | 
						|
    for t in types:
 | 
						|
        if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
 | 
						|
            t._get_type_vars(tvars)
 | 
						|
 | 
						|
 | 
						|
def _type_vars(types):
 | 
						|
    tvars = []
 | 
						|
    _get_type_vars(types, tvars)
 | 
						|
    return tuple(tvars)
 | 
						|
 | 
						|
 | 
						|
def _eval_type(t, globalns, localns):
 | 
						|
    if isinstance(t, TypingMeta) or isinstance(t, _TypingBase):
 | 
						|
        return t._eval_type(globalns, localns)
 | 
						|
    return t
 | 
						|
 | 
						|
 | 
						|
def _type_check(arg, msg):
 | 
						|
    """Check that the argument is a type, and return it (internal helper).
 | 
						|
 | 
						|
    As a special case, accept None and return type(None) instead.
 | 
						|
    Also, _TypeAlias instances (e.g. Match, Pattern) are acceptable.
 | 
						|
 | 
						|
    The msg argument is a human-readable error message, e.g.
 | 
						|
 | 
						|
        "Union[arg, ...]: arg should be a type."
 | 
						|
 | 
						|
    We append the repr() of the actual value (truncated to 100 chars).
 | 
						|
    """
 | 
						|
    if arg is None:
 | 
						|
        return type(None)
 | 
						|
    if isinstance(arg, str):
 | 
						|
        arg = _ForwardRef(arg)
 | 
						|
    if (
 | 
						|
        isinstance(arg, _TypingBase) and type(arg).__name__ == '_ClassVar' or
 | 
						|
        not isinstance(arg, (type, _TypingBase)) and not callable(arg)
 | 
						|
    ):
 | 
						|
        raise TypeError(msg + " Got %.100r." % (arg,))
 | 
						|
    # Bare Union etc. are not valid as type arguments
 | 
						|
    if (
 | 
						|
        type(arg).__name__ in ('_Union', '_Optional') and
 | 
						|
        not getattr(arg, '__origin__', None) or
 | 
						|
        isinstance(arg, TypingMeta) and arg._gorg in (Generic, _Protocol)
 | 
						|
    ):
 | 
						|
        raise TypeError("Plain %s is not valid as type argument" % arg)
 | 
						|
    return arg
 | 
						|
 | 
						|
 | 
						|
def _type_repr(obj):
 | 
						|
    """Return the repr() of an object, special-casing types (internal helper).
 | 
						|
 | 
						|
    If obj is a type, we return a shorter version than the default
 | 
						|
    type.__repr__, based on the module and qualified name, which is
 | 
						|
    typically enough to uniquely identify a type.  For everything
 | 
						|
    else, we fall back on repr(obj).
 | 
						|
    """
 | 
						|
    if isinstance(obj, type) and not isinstance(obj, TypingMeta):
 | 
						|
        if obj.__module__ == 'builtins':
 | 
						|
            return _qualname(obj)
 | 
						|
        return '%s.%s' % (obj.__module__, _qualname(obj))
 | 
						|
    if obj is ...:
 | 
						|
        return('...')
 | 
						|
    if isinstance(obj, types.FunctionType):
 | 
						|
        return obj.__name__
 | 
						|
    return repr(obj)
 | 
						|
 | 
						|
 | 
						|
class _Any(_FinalTypingBase, _root=True):
 | 
						|
    """Special type indicating an unconstrained type.
 | 
						|
 | 
						|
    - Any is compatible with every type.
 | 
						|
    - Any assumed to have all methods.
 | 
						|
    - All values assumed to be instances of Any.
 | 
						|
 | 
						|
    Note that all the above statements are true from the point of view of
 | 
						|
    static type checkers. At runtime, Any should not be used with instance
 | 
						|
    or class checks.
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __instancecheck__(self, obj):
 | 
						|
        raise TypeError("Any cannot be used with isinstance().")
 | 
						|
 | 
						|
    def __subclasscheck__(self, cls):
 | 
						|
        raise TypeError("Any cannot be used with issubclass().")
 | 
						|
 | 
						|
 | 
						|
Any = _Any(_root=True)
 | 
						|
 | 
						|
 | 
						|
class _NoReturn(_FinalTypingBase, _root=True):
 | 
						|
    """Special type indicating functions that never return.
 | 
						|
    Example::
 | 
						|
 | 
						|
      from typing import NoReturn
 | 
						|
 | 
						|
      def stop() -> NoReturn:
 | 
						|
          raise Exception('no way')
 | 
						|
 | 
						|
    This type is invalid in other positions, e.g., ``List[NoReturn]``
 | 
						|
    will fail in static type checkers.
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __instancecheck__(self, obj):
 | 
						|
        raise TypeError("NoReturn cannot be used with isinstance().")
 | 
						|
 | 
						|
    def __subclasscheck__(self, cls):
 | 
						|
        raise TypeError("NoReturn cannot be used with issubclass().")
 | 
						|
 | 
						|
 | 
						|
NoReturn = _NoReturn(_root=True)
 | 
						|
 | 
						|
 | 
						|
class TypeVar(_TypingBase, _root=True):
 | 
						|
    """Type variable.
 | 
						|
 | 
						|
    Usage::
 | 
						|
 | 
						|
      T = TypeVar('T')  # Can be anything
 | 
						|
      A = TypeVar('A', str, bytes)  # Must be str or bytes
 | 
						|
 | 
						|
    Type variables exist primarily for the benefit of static type
 | 
						|
    checkers.  They serve as the parameters for generic types as well
 | 
						|
    as for generic function definitions.  See class Generic for more
 | 
						|
    information on generic types.  Generic functions work as follows:
 | 
						|
 | 
						|
      def repeat(x: T, n: int) -> List[T]:
 | 
						|
          '''Return a list containing n references to x.'''
 | 
						|
          return [x]*n
 | 
						|
 | 
						|
      def longest(x: A, y: A) -> A:
 | 
						|
          '''Return the longest of two strings.'''
 | 
						|
          return x if len(x) >= len(y) else y
 | 
						|
 | 
						|
    The latter example's signature is essentially the overloading
 | 
						|
    of (str, str) -> str and (bytes, bytes) -> bytes.  Also note
 | 
						|
    that if the arguments are instances of some subclass of str,
 | 
						|
    the return type is still plain str.
 | 
						|
 | 
						|
    At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
 | 
						|
 | 
						|
    Type variables defined with covariant=True or contravariant=True
 | 
						|
    can be used do declare covariant or contravariant generic types.
 | 
						|
    See PEP 484 for more details. By default generic types are invariant
 | 
						|
    in all type variables.
 | 
						|
 | 
						|
    Type variables can be introspected. e.g.:
 | 
						|
 | 
						|
      T.__name__ == 'T'
 | 
						|
      T.__constraints__ == ()
 | 
						|
      T.__covariant__ == False
 | 
						|
      T.__contravariant__ = False
 | 
						|
      A.__constraints__ == (str, bytes)
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ('__name__', '__bound__', '__constraints__',
 | 
						|
                 '__covariant__', '__contravariant__')
 | 
						|
 | 
						|
    def __init__(self, name, *constraints, bound=None,
 | 
						|
                 covariant=False, contravariant=False):
 | 
						|
        super().__init__(name, *constraints, bound=bound,
 | 
						|
                         covariant=covariant, contravariant=contravariant)
 | 
						|
        self.__name__ = name
 | 
						|
        if covariant and contravariant:
 | 
						|
            raise ValueError("Bivariant types are not supported.")
 | 
						|
        self.__covariant__ = bool(covariant)
 | 
						|
        self.__contravariant__ = bool(contravariant)
 | 
						|
        if constraints and bound is not None:
 | 
						|
            raise TypeError("Constraints cannot be combined with bound=...")
 | 
						|
        if constraints and len(constraints) == 1:
 | 
						|
            raise TypeError("A single constraint is not allowed")
 | 
						|
        msg = "TypeVar(name, constraint, ...): constraints must be types."
 | 
						|
        self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
 | 
						|
        if bound:
 | 
						|
            self.__bound__ = _type_check(bound, "Bound must be a type.")
 | 
						|
        else:
 | 
						|
            self.__bound__ = None
 | 
						|
 | 
						|
    def _get_type_vars(self, tvars):
 | 
						|
        if self not in tvars:
 | 
						|
            tvars.append(self)
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        if self.__covariant__:
 | 
						|
            prefix = '+'
 | 
						|
        elif self.__contravariant__:
 | 
						|
            prefix = '-'
 | 
						|
        else:
 | 
						|
            prefix = '~'
 | 
						|
        return prefix + self.__name__
 | 
						|
 | 
						|
    def __instancecheck__(self, instance):
 | 
						|
        raise TypeError("Type variables cannot be used with isinstance().")
 | 
						|
 | 
						|
    def __subclasscheck__(self, cls):
 | 
						|
        raise TypeError("Type variables cannot be used with issubclass().")
 | 
						|
 | 
						|
 | 
						|
# Some unconstrained type variables.  These are used by the container types.
 | 
						|
# (These are not for export.)
 | 
						|
T = TypeVar('T')  # Any type.
 | 
						|
KT = TypeVar('KT')  # Key type.
 | 
						|
VT = TypeVar('VT')  # Value type.
 | 
						|
T_co = TypeVar('T_co', covariant=True)  # Any type covariant containers.
 | 
						|
V_co = TypeVar('V_co', covariant=True)  # Any type covariant containers.
 | 
						|
VT_co = TypeVar('VT_co', covariant=True)  # Value type covariant containers.
 | 
						|
T_contra = TypeVar('T_contra', contravariant=True)  # Ditto contravariant.
 | 
						|
 | 
						|
# A useful type variable with constraints.  This represents string types.
 | 
						|
# (This one *is* for export!)
 | 
						|
AnyStr = TypeVar('AnyStr', bytes, str)
 | 
						|
 | 
						|
 | 
						|
def _replace_arg(arg, tvars, args):
 | 
						|
    """An internal helper function: replace arg if it is a type variable
 | 
						|
    found in tvars with corresponding substitution from args or
 | 
						|
    with corresponding substitution sub-tree if arg is a generic type.
 | 
						|
    """
 | 
						|
 | 
						|
    if tvars is None:
 | 
						|
        tvars = []
 | 
						|
    if hasattr(arg, '_subs_tree') and isinstance(arg, (GenericMeta, _TypingBase)):
 | 
						|
        return arg._subs_tree(tvars, args)
 | 
						|
    if isinstance(arg, TypeVar):
 | 
						|
        for i, tvar in enumerate(tvars):
 | 
						|
            if arg == tvar:
 | 
						|
                return args[i]
 | 
						|
    return arg
 | 
						|
 | 
						|
 | 
						|
# Special typing constructs Union, Optional, Generic, Callable and Tuple
 | 
						|
# use three special attributes for internal bookkeeping of generic types:
 | 
						|
# * __parameters__ is a tuple of unique free type parameters of a generic
 | 
						|
#   type, for example, Dict[T, T].__parameters__ == (T,);
 | 
						|
# * __origin__ keeps a reference to a type that was subscripted,
 | 
						|
#   e.g., Union[T, int].__origin__ == Union;
 | 
						|
# * __args__ is a tuple of all arguments used in subscripting,
 | 
						|
#   e.g., Dict[T, int].__args__ == (T, int).
 | 
						|
 | 
						|
 | 
						|
def _subs_tree(cls, tvars=None, args=None):
 | 
						|
    """An internal helper function: calculate substitution tree
 | 
						|
    for generic cls after replacing its type parameters with
 | 
						|
    substitutions in tvars -> args (if any).
 | 
						|
    Repeat the same following __origin__'s.
 | 
						|
 | 
						|
    Return a list of arguments with all possible substitutions
 | 
						|
    performed. Arguments that are generic classes themselves are represented
 | 
						|
    as tuples (so that no new classes are created by this function).
 | 
						|
    For example: _subs_tree(List[Tuple[int, T]][str]) == [(Tuple, int, str)]
 | 
						|
    """
 | 
						|
 | 
						|
    if cls.__origin__ is None:
 | 
						|
        return cls
 | 
						|
    # Make of chain of origins (i.e. cls -> cls.__origin__)
 | 
						|
    current = cls.__origin__
 | 
						|
    orig_chain = []
 | 
						|
    while current.__origin__ is not None:
 | 
						|
        orig_chain.append(current)
 | 
						|
        current = current.__origin__
 | 
						|
    # Replace type variables in __args__ if asked ...
 | 
						|
    tree_args = []
 | 
						|
    for arg in cls.__args__:
 | 
						|
        tree_args.append(_replace_arg(arg, tvars, args))
 | 
						|
    # ... then continue replacing down the origin chain.
 | 
						|
    for ocls in orig_chain:
 | 
						|
        new_tree_args = []
 | 
						|
        for arg in ocls.__args__:
 | 
						|
            new_tree_args.append(_replace_arg(arg, ocls.__parameters__, tree_args))
 | 
						|
        tree_args = new_tree_args
 | 
						|
    return tree_args
 | 
						|
 | 
						|
 | 
						|
def _remove_dups_flatten(parameters):
 | 
						|
    """An internal helper for Union creation and substitution: flatten Union's
 | 
						|
    among parameters, then remove duplicates and strict subclasses.
 | 
						|
    """
 | 
						|
 | 
						|
    # Flatten out Union[Union[...], ...].
 | 
						|
    params = []
 | 
						|
    for p in parameters:
 | 
						|
        if isinstance(p, _Union) and p.__origin__ is Union:
 | 
						|
            params.extend(p.__args__)
 | 
						|
        elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
 | 
						|
            params.extend(p[1:])
 | 
						|
        else:
 | 
						|
            params.append(p)
 | 
						|
    # Weed out strict duplicates, preserving the first of each occurrence.
 | 
						|
    all_params = set(params)
 | 
						|
    if len(all_params) < len(params):
 | 
						|
        new_params = []
 | 
						|
        for t in params:
 | 
						|
            if t in all_params:
 | 
						|
                new_params.append(t)
 | 
						|
                all_params.remove(t)
 | 
						|
        params = new_params
 | 
						|
        assert not all_params, all_params
 | 
						|
    # Weed out subclasses.
 | 
						|
    # E.g. Union[int, Employee, Manager] == Union[int, Employee].
 | 
						|
    # If object is present it will be sole survivor among proper classes.
 | 
						|
    # Never discard type variables.
 | 
						|
    # (In particular, Union[str, AnyStr] != AnyStr.)
 | 
						|
    all_params = set(params)
 | 
						|
    for t1 in params:
 | 
						|
        if not isinstance(t1, type):
 | 
						|
            continue
 | 
						|
        if any(isinstance(t2, type) and issubclass(t1, t2)
 | 
						|
               for t2 in all_params - {t1}
 | 
						|
               if not (isinstance(t2, GenericMeta) and
 | 
						|
                       t2.__origin__ is not None)):
 | 
						|
            all_params.remove(t1)
 | 
						|
    return tuple(t for t in params if t in all_params)
 | 
						|
 | 
						|
 | 
						|
def _check_generic(cls, parameters):
 | 
						|
    # Check correct count for parameters of a generic cls (internal helper).
 | 
						|
    if not cls.__parameters__:
 | 
						|
        raise TypeError("%s is not a generic class" % repr(cls))
 | 
						|
    alen = len(parameters)
 | 
						|
    elen = len(cls.__parameters__)
 | 
						|
    if alen != elen:
 | 
						|
        raise TypeError("Too %s parameters for %s; actual %s, expected %s" %
 | 
						|
                        ("many" if alen > elen else "few", repr(cls), alen, elen))
 | 
						|
 | 
						|
 | 
						|
_cleanups = []
 | 
						|
 | 
						|
 | 
						|
def _tp_cache(func):
 | 
						|
    """Internal wrapper caching __getitem__ of generic types with a fallback to
 | 
						|
    original function for non-hashable arguments.
 | 
						|
    """
 | 
						|
 | 
						|
    cached = functools.lru_cache()(func)
 | 
						|
    _cleanups.append(cached.cache_clear)
 | 
						|
 | 
						|
    @functools.wraps(func)
 | 
						|
    def inner(*args, **kwds):
 | 
						|
        try:
 | 
						|
            return cached(*args, **kwds)
 | 
						|
        except TypeError:
 | 
						|
            pass  # All real errors (not unhashable args) are raised below.
 | 
						|
        return func(*args, **kwds)
 | 
						|
    return inner
 | 
						|
 | 
						|
 | 
						|
class _Union(_FinalTypingBase, _root=True):
 | 
						|
    """Union type; Union[X, Y] means either X or Y.
 | 
						|
 | 
						|
    To define a union, use e.g. Union[int, str].  Details:
 | 
						|
 | 
						|
    - The arguments must be types and there must be at least one.
 | 
						|
 | 
						|
    - None as an argument is a special case and is replaced by
 | 
						|
      type(None).
 | 
						|
 | 
						|
    - Unions of unions are flattened, e.g.::
 | 
						|
 | 
						|
        Union[Union[int, str], float] == Union[int, str, float]
 | 
						|
 | 
						|
    - Unions of a single argument vanish, e.g.::
 | 
						|
 | 
						|
        Union[int] == int  # The constructor actually returns int
 | 
						|
 | 
						|
    - Redundant arguments are skipped, e.g.::
 | 
						|
 | 
						|
        Union[int, str, int] == Union[int, str]
 | 
						|
 | 
						|
    - When comparing unions, the argument order is ignored, e.g.::
 | 
						|
 | 
						|
        Union[int, str] == Union[str, int]
 | 
						|
 | 
						|
    - When two arguments have a subclass relationship, the least
 | 
						|
      derived argument is kept, e.g.::
 | 
						|
 | 
						|
        class Employee: pass
 | 
						|
        class Manager(Employee): pass
 | 
						|
        Union[int, Employee, Manager] == Union[int, Employee]
 | 
						|
        Union[Manager, int, Employee] == Union[int, Employee]
 | 
						|
        Union[Employee, Manager] == Employee
 | 
						|
 | 
						|
    - Similar for object::
 | 
						|
 | 
						|
        Union[int, object] == object
 | 
						|
 | 
						|
    - You cannot subclass or instantiate a union.
 | 
						|
 | 
						|
    - You can use Optional[X] as a shorthand for Union[X, None].
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ('__parameters__', '__args__', '__origin__', '__tree_hash__')
 | 
						|
 | 
						|
    def __new__(cls, parameters=None, origin=None, *args, _root=False):
 | 
						|
        self = super().__new__(cls, parameters, origin, *args, _root=_root)
 | 
						|
        if origin is None:
 | 
						|
            self.__parameters__ = None
 | 
						|
            self.__args__ = None
 | 
						|
            self.__origin__ = None
 | 
						|
            self.__tree_hash__ = hash(frozenset(('Union',)))
 | 
						|
            return self
 | 
						|
        if not isinstance(parameters, tuple):
 | 
						|
            raise TypeError("Expected parameters=<tuple>")
 | 
						|
        if origin is Union:
 | 
						|
            parameters = _remove_dups_flatten(parameters)
 | 
						|
            # It's not a union if there's only one type left.
 | 
						|
            if len(parameters) == 1:
 | 
						|
                return parameters[0]
 | 
						|
        self.__parameters__ = _type_vars(parameters)
 | 
						|
        self.__args__ = parameters
 | 
						|
        self.__origin__ = origin
 | 
						|
        # Pre-calculate the __hash__ on instantiation.
 | 
						|
        # This improves speed for complex substitutions.
 | 
						|
        subs_tree = self._subs_tree()
 | 
						|
        if isinstance(subs_tree, tuple):
 | 
						|
            self.__tree_hash__ = hash(frozenset(subs_tree))
 | 
						|
        else:
 | 
						|
            self.__tree_hash__ = hash(subs_tree)
 | 
						|
        return self
 | 
						|
 | 
						|
    def _eval_type(self, globalns, localns):
 | 
						|
        if self.__args__ is None:
 | 
						|
            return self
 | 
						|
        ev_args = tuple(_eval_type(t, globalns, localns) for t in self.__args__)
 | 
						|
        ev_origin = _eval_type(self.__origin__, globalns, localns)
 | 
						|
        if ev_args == self.__args__ and ev_origin == self.__origin__:
 | 
						|
            # Everything is already evaluated.
 | 
						|
            return self
 | 
						|
        return self.__class__(ev_args, ev_origin, _root=True)
 | 
						|
 | 
						|
    def _get_type_vars(self, tvars):
 | 
						|
        if self.__origin__ and self.__parameters__:
 | 
						|
            _get_type_vars(self.__parameters__, tvars)
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        if self.__origin__ is None:
 | 
						|
            return super().__repr__()
 | 
						|
        tree = self._subs_tree()
 | 
						|
        if not isinstance(tree, tuple):
 | 
						|
            return repr(tree)
 | 
						|
        return tree[0]._tree_repr(tree)
 | 
						|
 | 
						|
    def _tree_repr(self, tree):
 | 
						|
        arg_list = []
 | 
						|
        for arg in tree[1:]:
 | 
						|
            if not isinstance(arg, tuple):
 | 
						|
                arg_list.append(_type_repr(arg))
 | 
						|
            else:
 | 
						|
                arg_list.append(arg[0]._tree_repr(arg))
 | 
						|
        return super().__repr__() + '[%s]' % ', '.join(arg_list)
 | 
						|
 | 
						|
    @_tp_cache
 | 
						|
    def __getitem__(self, parameters):
 | 
						|
        if parameters == ():
 | 
						|
            raise TypeError("Cannot take a Union of no types.")
 | 
						|
        if not isinstance(parameters, tuple):
 | 
						|
            parameters = (parameters,)
 | 
						|
        if self.__origin__ is None:
 | 
						|
            msg = "Union[arg, ...]: each arg must be a type."
 | 
						|
        else:
 | 
						|
            msg = "Parameters to generic types must be types."
 | 
						|
        parameters = tuple(_type_check(p, msg) for p in parameters)
 | 
						|
        if self is not Union:
 | 
						|
            _check_generic(self, parameters)
 | 
						|
        return self.__class__(parameters, origin=self, _root=True)
 | 
						|
 | 
						|
    def _subs_tree(self, tvars=None, args=None):
 | 
						|
        if self is Union:
 | 
						|
            return Union  # Nothing to substitute
 | 
						|
        tree_args = _subs_tree(self, tvars, args)
 | 
						|
        tree_args = _remove_dups_flatten(tree_args)
 | 
						|
        if len(tree_args) == 1:
 | 
						|
            return tree_args[0]  # Union of a single type is that type
 | 
						|
        return (Union,) + tree_args
 | 
						|
 | 
						|
    def __eq__(self, other):
 | 
						|
        if isinstance(other, _Union):
 | 
						|
            return self.__tree_hash__ == other.__tree_hash__
 | 
						|
        elif self is not Union:
 | 
						|
            return self._subs_tree() == other
 | 
						|
        else:
 | 
						|
            return self is other
 | 
						|
 | 
						|
    def __hash__(self):
 | 
						|
        return self.__tree_hash__
 | 
						|
 | 
						|
    def __instancecheck__(self, obj):
 | 
						|
        raise TypeError("Unions cannot be used with isinstance().")
 | 
						|
 | 
						|
    def __subclasscheck__(self, cls):
 | 
						|
        raise TypeError("Unions cannot be used with issubclass().")
 | 
						|
 | 
						|
 | 
						|
Union = _Union(_root=True)
 | 
						|
 | 
						|
 | 
						|
class _Optional(_FinalTypingBase, _root=True):
 | 
						|
    """Optional type.
 | 
						|
 | 
						|
    Optional[X] is equivalent to Union[X, None].
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    @_tp_cache
 | 
						|
    def __getitem__(self, arg):
 | 
						|
        arg = _type_check(arg, "Optional[t] requires a single type.")
 | 
						|
        return Union[arg, type(None)]
 | 
						|
 | 
						|
 | 
						|
Optional = _Optional(_root=True)
 | 
						|
 | 
						|
 | 
						|
def _next_in_mro(cls):
 | 
						|
    """Helper for Generic.__new__.
 | 
						|
 | 
						|
    Returns the class after the last occurrence of Generic or
 | 
						|
    Generic[...] in cls.__mro__.
 | 
						|
    """
 | 
						|
    next_in_mro = object
 | 
						|
    # Look for the last occurrence of Generic or Generic[...].
 | 
						|
    for i, c in enumerate(cls.__mro__[:-1]):
 | 
						|
        if isinstance(c, GenericMeta) and c._gorg is Generic:
 | 
						|
            next_in_mro = cls.__mro__[i + 1]
 | 
						|
    return next_in_mro
 | 
						|
 | 
						|
 | 
						|
def _make_subclasshook(cls):
 | 
						|
    """Construct a __subclasshook__ callable that incorporates
 | 
						|
    the associated __extra__ class in subclass checks performed
 | 
						|
    against cls.
 | 
						|
    """
 | 
						|
    if isinstance(cls.__extra__, abc.ABCMeta):
 | 
						|
        # The logic mirrors that of ABCMeta.__subclasscheck__.
 | 
						|
        # Registered classes need not be checked here because
 | 
						|
        # cls and its extra share the same _abc_registry.
 | 
						|
        def __extrahook__(subclass):
 | 
						|
            res = cls.__extra__.__subclasshook__(subclass)
 | 
						|
            if res is not NotImplemented:
 | 
						|
                return res
 | 
						|
            if cls.__extra__ in subclass.__mro__:
 | 
						|
                return True
 | 
						|
            for scls in cls.__extra__.__subclasses__():
 | 
						|
                if isinstance(scls, GenericMeta):
 | 
						|
                    continue
 | 
						|
                if issubclass(subclass, scls):
 | 
						|
                    return True
 | 
						|
            return NotImplemented
 | 
						|
    else:
 | 
						|
        # For non-ABC extras we'll just call issubclass().
 | 
						|
        def __extrahook__(subclass):
 | 
						|
            if cls.__extra__ and issubclass(subclass, cls.__extra__):
 | 
						|
                return True
 | 
						|
            return NotImplemented
 | 
						|
    return __extrahook__
 | 
						|
 | 
						|
 | 
						|
def _no_slots_copy(dct):
 | 
						|
    """Internal helper: copy class __dict__ and clean slots class variables.
 | 
						|
    (They will be re-created if necessary by normal class machinery.)
 | 
						|
    """
 | 
						|
    dict_copy = dict(dct)
 | 
						|
    if '__slots__' in dict_copy:
 | 
						|
        for slot in dict_copy['__slots__']:
 | 
						|
            dict_copy.pop(slot, None)
 | 
						|
    return dict_copy
 | 
						|
 | 
						|
 | 
						|
class GenericMeta(TypingMeta, abc.ABCMeta):
 | 
						|
    """Metaclass for generic types.
 | 
						|
 | 
						|
    This is a metaclass for typing.Generic and generic ABCs defined in
 | 
						|
    typing module. User defined subclasses of GenericMeta can override
 | 
						|
    __new__ and invoke super().__new__. Note that GenericMeta.__new__
 | 
						|
    has strict rules on what is allowed in its bases argument:
 | 
						|
    * plain Generic is disallowed in bases;
 | 
						|
    * Generic[...] should appear in bases at most once;
 | 
						|
    * if Generic[...] is present, then it should list all type variables
 | 
						|
      that appear in other bases.
 | 
						|
    In addition, type of all generic bases is erased, e.g., C[int] is
 | 
						|
    stripped to plain C.
 | 
						|
    """
 | 
						|
 | 
						|
    def __new__(cls, name, bases, namespace,
 | 
						|
                tvars=None, args=None, origin=None, extra=None, orig_bases=None):
 | 
						|
        """Create a new generic class. GenericMeta.__new__ accepts
 | 
						|
        keyword arguments that are used for internal bookkeeping, therefore
 | 
						|
        an override should pass unused keyword arguments to super().
 | 
						|
        """
 | 
						|
        if tvars is not None:
 | 
						|
            # Called from __getitem__() below.
 | 
						|
            assert origin is not None
 | 
						|
            assert all(isinstance(t, TypeVar) for t in tvars), tvars
 | 
						|
        else:
 | 
						|
            # Called from class statement.
 | 
						|
            assert tvars is None, tvars
 | 
						|
            assert args is None, args
 | 
						|
            assert origin is None, origin
 | 
						|
 | 
						|
            # Get the full set of tvars from the bases.
 | 
						|
            tvars = _type_vars(bases)
 | 
						|
            # Look for Generic[T1, ..., Tn].
 | 
						|
            # If found, tvars must be a subset of it.
 | 
						|
            # If not found, tvars is it.
 | 
						|
            # Also check for and reject plain Generic,
 | 
						|
            # and reject multiple Generic[...].
 | 
						|
            gvars = None
 | 
						|
            for base in bases:
 | 
						|
                if base is Generic:
 | 
						|
                    raise TypeError("Cannot inherit from plain Generic")
 | 
						|
                if (isinstance(base, GenericMeta) and
 | 
						|
                        base.__origin__ is Generic):
 | 
						|
                    if gvars is not None:
 | 
						|
                        raise TypeError(
 | 
						|
                            "Cannot inherit from Generic[...] multiple types.")
 | 
						|
                    gvars = base.__parameters__
 | 
						|
            if gvars is None:
 | 
						|
                gvars = tvars
 | 
						|
            else:
 | 
						|
                tvarset = set(tvars)
 | 
						|
                gvarset = set(gvars)
 | 
						|
                if not tvarset <= gvarset:
 | 
						|
                    raise TypeError(
 | 
						|
                        "Some type variables (%s) "
 | 
						|
                        "are not listed in Generic[%s]" %
 | 
						|
                        (", ".join(str(t) for t in tvars if t not in gvarset),
 | 
						|
                         ", ".join(str(g) for g in gvars)))
 | 
						|
                tvars = gvars
 | 
						|
 | 
						|
        initial_bases = bases
 | 
						|
        if extra is not None and type(extra) is abc.ABCMeta and extra not in bases:
 | 
						|
            bases = (extra,) + bases
 | 
						|
        bases = tuple(b._gorg if isinstance(b, GenericMeta) else b for b in bases)
 | 
						|
 | 
						|
        # remove bare Generic from bases if there are other generic bases
 | 
						|
        if any(isinstance(b, GenericMeta) and b is not Generic for b in bases):
 | 
						|
            bases = tuple(b for b in bases if b is not Generic)
 | 
						|
        namespace.update({'__origin__': origin, '__extra__': extra,
 | 
						|
                          '_gorg': None if not origin else origin._gorg})
 | 
						|
        self = super().__new__(cls, name, bases, namespace, _root=True)
 | 
						|
        super(GenericMeta, self).__setattr__('_gorg',
 | 
						|
                                             self if not origin else origin._gorg)
 | 
						|
        self.__parameters__ = tvars
 | 
						|
        # Be prepared that GenericMeta will be subclassed by TupleMeta
 | 
						|
        # and CallableMeta, those two allow ..., (), or [] in __args___.
 | 
						|
        self.__args__ = tuple(... if a is _TypingEllipsis else
 | 
						|
                              () if a is _TypingEmpty else
 | 
						|
                              a for a in args) if args else None
 | 
						|
        # Speed hack (https://github.com/python/typing/issues/196).
 | 
						|
        self.__next_in_mro__ = _next_in_mro(self)
 | 
						|
        # Preserve base classes on subclassing (__bases__ are type erased now).
 | 
						|
        if orig_bases is None:
 | 
						|
            self.__orig_bases__ = initial_bases
 | 
						|
 | 
						|
        # This allows unparameterized generic collections to be used
 | 
						|
        # with issubclass() and isinstance() in the same way as their
 | 
						|
        # collections.abc counterparts (e.g., isinstance([], Iterable)).
 | 
						|
        if (
 | 
						|
            '__subclasshook__' not in namespace and extra or
 | 
						|
            # allow overriding
 | 
						|
            getattr(self.__subclasshook__, '__name__', '') == '__extrahook__'
 | 
						|
        ):
 | 
						|
            self.__subclasshook__ = _make_subclasshook(self)
 | 
						|
        if isinstance(extra, abc.ABCMeta):
 | 
						|
            self._abc_registry = extra._abc_registry
 | 
						|
            self._abc_cache = extra._abc_cache
 | 
						|
        elif origin is not None:
 | 
						|
            self._abc_registry = origin._abc_registry
 | 
						|
            self._abc_cache = origin._abc_cache
 | 
						|
 | 
						|
        if origin and hasattr(origin, '__qualname__'):  # Fix for Python 3.2.
 | 
						|
            self.__qualname__ = origin.__qualname__
 | 
						|
        self.__tree_hash__ = (hash(self._subs_tree()) if origin else
 | 
						|
                              super(GenericMeta, self).__hash__())
 | 
						|
        return self
 | 
						|
 | 
						|
    # _abc_negative_cache and _abc_negative_cache_version
 | 
						|
    # realised as descriptors, since GenClass[t1, t2, ...] always
 | 
						|
    # share subclass info with GenClass.
 | 
						|
    # This is an important memory optimization.
 | 
						|
    @property
 | 
						|
    def _abc_negative_cache(self):
 | 
						|
        if isinstance(self.__extra__, abc.ABCMeta):
 | 
						|
            return self.__extra__._abc_negative_cache
 | 
						|
        return self._gorg._abc_generic_negative_cache
 | 
						|
 | 
						|
    @_abc_negative_cache.setter
 | 
						|
    def _abc_negative_cache(self, value):
 | 
						|
        if self.__origin__ is None:
 | 
						|
            if isinstance(self.__extra__, abc.ABCMeta):
 | 
						|
                self.__extra__._abc_negative_cache = value
 | 
						|
            else:
 | 
						|
                self._abc_generic_negative_cache = value
 | 
						|
 | 
						|
    @property
 | 
						|
    def _abc_negative_cache_version(self):
 | 
						|
        if isinstance(self.__extra__, abc.ABCMeta):
 | 
						|
            return self.__extra__._abc_negative_cache_version
 | 
						|
        return self._gorg._abc_generic_negative_cache_version
 | 
						|
 | 
						|
    @_abc_negative_cache_version.setter
 | 
						|
    def _abc_negative_cache_version(self, value):
 | 
						|
        if self.__origin__ is None:
 | 
						|
            if isinstance(self.__extra__, abc.ABCMeta):
 | 
						|
                self.__extra__._abc_negative_cache_version = value
 | 
						|
            else:
 | 
						|
                self._abc_generic_negative_cache_version = value
 | 
						|
 | 
						|
    def _get_type_vars(self, tvars):
 | 
						|
        if self.__origin__ and self.__parameters__:
 | 
						|
            _get_type_vars(self.__parameters__, tvars)
 | 
						|
 | 
						|
    def _eval_type(self, globalns, localns):
 | 
						|
        ev_origin = (self.__origin__._eval_type(globalns, localns)
 | 
						|
                     if self.__origin__ else None)
 | 
						|
        ev_args = tuple(_eval_type(a, globalns, localns) for a
 | 
						|
                        in self.__args__) if self.__args__ else None
 | 
						|
        if ev_origin == self.__origin__ and ev_args == self.__args__:
 | 
						|
            return self
 | 
						|
        return self.__class__(self.__name__,
 | 
						|
                              self.__bases__,
 | 
						|
                              _no_slots_copy(self.__dict__),
 | 
						|
                              tvars=_type_vars(ev_args) if ev_args else None,
 | 
						|
                              args=ev_args,
 | 
						|
                              origin=ev_origin,
 | 
						|
                              extra=self.__extra__,
 | 
						|
                              orig_bases=self.__orig_bases__)
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        if self.__origin__ is None:
 | 
						|
            return super().__repr__()
 | 
						|
        return self._tree_repr(self._subs_tree())
 | 
						|
 | 
						|
    def _tree_repr(self, tree):
 | 
						|
        arg_list = []
 | 
						|
        for arg in tree[1:]:
 | 
						|
            if arg == ():
 | 
						|
                arg_list.append('()')
 | 
						|
            elif not isinstance(arg, tuple):
 | 
						|
                arg_list.append(_type_repr(arg))
 | 
						|
            else:
 | 
						|
                arg_list.append(arg[0]._tree_repr(arg))
 | 
						|
        return super().__repr__() + '[%s]' % ', '.join(arg_list)
 | 
						|
 | 
						|
    def _subs_tree(self, tvars=None, args=None):
 | 
						|
        if self.__origin__ is None:
 | 
						|
            return self
 | 
						|
        tree_args = _subs_tree(self, tvars, args)
 | 
						|
        return (self._gorg,) + tuple(tree_args)
 | 
						|
 | 
						|
    def __eq__(self, other):
 | 
						|
        if not isinstance(other, GenericMeta):
 | 
						|
            return NotImplemented
 | 
						|
        if self.__origin__ is None or other.__origin__ is None:
 | 
						|
            return self is other
 | 
						|
        return self.__tree_hash__ == other.__tree_hash__
 | 
						|
 | 
						|
    def __hash__(self):
 | 
						|
        return self.__tree_hash__
 | 
						|
 | 
						|
    @_tp_cache
 | 
						|
    def __getitem__(self, params):
 | 
						|
        if not isinstance(params, tuple):
 | 
						|
            params = (params,)
 | 
						|
        if not params and self._gorg is not Tuple:
 | 
						|
            raise TypeError(
 | 
						|
                "Parameter list to %s[...] cannot be empty" % _qualname(self))
 | 
						|
        msg = "Parameters to generic types must be types."
 | 
						|
        params = tuple(_type_check(p, msg) for p in params)
 | 
						|
        if self is Generic:
 | 
						|
            # Generic can only be subscripted with unique type variables.
 | 
						|
            if not all(isinstance(p, TypeVar) for p in params):
 | 
						|
                raise TypeError(
 | 
						|
                    "Parameters to Generic[...] must all be type variables")
 | 
						|
            if len(set(params)) != len(params):
 | 
						|
                raise TypeError(
 | 
						|
                    "Parameters to Generic[...] must all be unique")
 | 
						|
            tvars = params
 | 
						|
            args = params
 | 
						|
        elif self in (Tuple, Callable):
 | 
						|
            tvars = _type_vars(params)
 | 
						|
            args = params
 | 
						|
        elif self is _Protocol:
 | 
						|
            # _Protocol is internal, don't check anything.
 | 
						|
            tvars = params
 | 
						|
            args = params
 | 
						|
        elif self.__origin__ in (Generic, _Protocol):
 | 
						|
            # Can't subscript Generic[...] or _Protocol[...].
 | 
						|
            raise TypeError("Cannot subscript already-subscripted %s" %
 | 
						|
                            repr(self))
 | 
						|
        else:
 | 
						|
            # Subscripting a regular Generic subclass.
 | 
						|
            _check_generic(self, params)
 | 
						|
            tvars = _type_vars(params)
 | 
						|
            args = params
 | 
						|
 | 
						|
        prepend = (self,) if self.__origin__ is None else ()
 | 
						|
        return self.__class__(self.__name__,
 | 
						|
                              prepend + self.__bases__,
 | 
						|
                              _no_slots_copy(self.__dict__),
 | 
						|
                              tvars=tvars,
 | 
						|
                              args=args,
 | 
						|
                              origin=self,
 | 
						|
                              extra=self.__extra__,
 | 
						|
                              orig_bases=self.__orig_bases__)
 | 
						|
 | 
						|
    def __subclasscheck__(self, cls):
 | 
						|
        if self.__origin__ is not None:
 | 
						|
            if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools']:
 | 
						|
                raise TypeError("Parameterized generics cannot be used with class "
 | 
						|
                                "or instance checks")
 | 
						|
            return False
 | 
						|
        if self is Generic:
 | 
						|
            raise TypeError("Class %r cannot be used with class "
 | 
						|
                            "or instance checks" % self)
 | 
						|
        return super().__subclasscheck__(cls)
 | 
						|
 | 
						|
    def __instancecheck__(self, instance):
 | 
						|
        # Since we extend ABC.__subclasscheck__ and
 | 
						|
        # ABC.__instancecheck__ inlines the cache checking done by the
 | 
						|
        # latter, we must extend __instancecheck__ too. For simplicity
 | 
						|
        # we just skip the cache check -- instance checks for generic
 | 
						|
        # classes are supposed to be rare anyways.
 | 
						|
        return issubclass(instance.__class__, self)
 | 
						|
 | 
						|
    def __setattr__(self, attr, value):
 | 
						|
        # We consider all the subscripted generics as proxies for original class
 | 
						|
        if (
 | 
						|
            attr.startswith('__') and attr.endswith('__') or
 | 
						|
            attr.startswith('_abc_') or
 | 
						|
            self._gorg is None  # The class is not fully created, see #typing/506
 | 
						|
        ):
 | 
						|
            super(GenericMeta, self).__setattr__(attr, value)
 | 
						|
        else:
 | 
						|
            super(GenericMeta, self._gorg).__setattr__(attr, value)
 | 
						|
 | 
						|
 | 
						|
# Prevent checks for Generic to crash when defining Generic.
 | 
						|
Generic = None
 | 
						|
 | 
						|
 | 
						|
def _generic_new(base_cls, cls, *args, **kwds):
 | 
						|
    # Assure type is erased on instantiation,
 | 
						|
    # but attempt to store it in __orig_class__
 | 
						|
    if cls.__origin__ is None:
 | 
						|
        return base_cls.__new__(cls)
 | 
						|
    else:
 | 
						|
        origin = cls._gorg
 | 
						|
        obj = base_cls.__new__(origin)
 | 
						|
        try:
 | 
						|
            obj.__orig_class__ = cls
 | 
						|
        except AttributeError:
 | 
						|
            pass
 | 
						|
        obj.__init__(*args, **kwds)
 | 
						|
        return obj
 | 
						|
 | 
						|
 | 
						|
class Generic(metaclass=GenericMeta):
 | 
						|
    """Abstract base class for generic types.
 | 
						|
 | 
						|
    A generic type is typically declared by inheriting from
 | 
						|
    this class parameterized with one or more type variables.
 | 
						|
    For example, a generic mapping type might be defined as::
 | 
						|
 | 
						|
      class Mapping(Generic[KT, VT]):
 | 
						|
          def __getitem__(self, key: KT) -> VT:
 | 
						|
              ...
 | 
						|
          # Etc.
 | 
						|
 | 
						|
    This class can then be used as follows::
 | 
						|
 | 
						|
      def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
 | 
						|
          try:
 | 
						|
              return mapping[key]
 | 
						|
          except KeyError:
 | 
						|
              return default
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is Generic:
 | 
						|
            raise TypeError("Type Generic cannot be instantiated; "
 | 
						|
                            "it can be used only as a base class")
 | 
						|
        return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
class _TypingEmpty:
 | 
						|
    """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
 | 
						|
    to allow empty list/tuple in specific places, without allowing them
 | 
						|
    to sneak in where prohibited.
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class _TypingEllipsis:
 | 
						|
    """Internal placeholder for ... (ellipsis)."""
 | 
						|
 | 
						|
 | 
						|
class TupleMeta(GenericMeta):
 | 
						|
    """Metaclass for Tuple (internal)."""
 | 
						|
 | 
						|
    @_tp_cache
 | 
						|
    def __getitem__(self, parameters):
 | 
						|
        if self.__origin__ is not None or self._gorg is not Tuple:
 | 
						|
            # Normal generic rules apply if this is not the first subscription
 | 
						|
            # or a subscription of a subclass.
 | 
						|
            return super().__getitem__(parameters)
 | 
						|
        if parameters == ():
 | 
						|
            return super().__getitem__((_TypingEmpty,))
 | 
						|
        if not isinstance(parameters, tuple):
 | 
						|
            parameters = (parameters,)
 | 
						|
        if len(parameters) == 2 and parameters[1] is ...:
 | 
						|
            msg = "Tuple[t, ...]: t must be a type."
 | 
						|
            p = _type_check(parameters[0], msg)
 | 
						|
            return super().__getitem__((p, _TypingEllipsis))
 | 
						|
        msg = "Tuple[t0, t1, ...]: each t must be a type."
 | 
						|
        parameters = tuple(_type_check(p, msg) for p in parameters)
 | 
						|
        return super().__getitem__(parameters)
 | 
						|
 | 
						|
    def __instancecheck__(self, obj):
 | 
						|
        if self.__args__ is None:
 | 
						|
            return isinstance(obj, tuple)
 | 
						|
        raise TypeError("Parameterized Tuple cannot be used "
 | 
						|
                        "with isinstance().")
 | 
						|
 | 
						|
    def __subclasscheck__(self, cls):
 | 
						|
        if self.__args__ is None:
 | 
						|
            return issubclass(cls, tuple)
 | 
						|
        raise TypeError("Parameterized Tuple cannot be used "
 | 
						|
                        "with issubclass().")
 | 
						|
 | 
						|
 | 
						|
class Tuple(tuple, extra=tuple, metaclass=TupleMeta):
 | 
						|
    """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
 | 
						|
 | 
						|
    Example: Tuple[T1, T2] is a tuple of two elements corresponding
 | 
						|
    to type variables T1 and T2.  Tuple[int, float, str] is a tuple
 | 
						|
    of an int, a float and a string.
 | 
						|
 | 
						|
    To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is Tuple:
 | 
						|
            raise TypeError("Type Tuple cannot be instantiated; "
 | 
						|
                            "use tuple() instead")
 | 
						|
        return _generic_new(tuple, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
class CallableMeta(GenericMeta):
 | 
						|
    """Metaclass for Callable (internal)."""
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        if self.__origin__ is None:
 | 
						|
            return super().__repr__()
 | 
						|
        return self._tree_repr(self._subs_tree())
 | 
						|
 | 
						|
    def _tree_repr(self, tree):
 | 
						|
        if self._gorg is not Callable:
 | 
						|
            return super()._tree_repr(tree)
 | 
						|
        # For actual Callable (not its subclass) we override
 | 
						|
        # super()._tree_repr() for nice formatting.
 | 
						|
        arg_list = []
 | 
						|
        for arg in tree[1:]:
 | 
						|
            if not isinstance(arg, tuple):
 | 
						|
                arg_list.append(_type_repr(arg))
 | 
						|
            else:
 | 
						|
                arg_list.append(arg[0]._tree_repr(arg))
 | 
						|
        if arg_list[0] == '...':
 | 
						|
            return repr(tree[0]) + '[..., %s]' % arg_list[1]
 | 
						|
        return (repr(tree[0]) +
 | 
						|
                '[[%s], %s]' % (', '.join(arg_list[:-1]), arg_list[-1]))
 | 
						|
 | 
						|
    def __getitem__(self, parameters):
 | 
						|
        """A thin wrapper around __getitem_inner__ to provide the latter
 | 
						|
        with hashable arguments to improve speed.
 | 
						|
        """
 | 
						|
 | 
						|
        if self.__origin__ is not None or self._gorg is not Callable:
 | 
						|
            return super().__getitem__(parameters)
 | 
						|
        if not isinstance(parameters, tuple) or len(parameters) != 2:
 | 
						|
            raise TypeError("Callable must be used as "
 | 
						|
                            "Callable[[arg, ...], result].")
 | 
						|
        args, result = parameters
 | 
						|
        if args is Ellipsis:
 | 
						|
            parameters = (Ellipsis, result)
 | 
						|
        else:
 | 
						|
            if not isinstance(args, list):
 | 
						|
                raise TypeError("Callable[args, result]: args must be a list."
 | 
						|
                                " Got %.100r." % (args,))
 | 
						|
            parameters = (tuple(args), result)
 | 
						|
        return self.__getitem_inner__(parameters)
 | 
						|
 | 
						|
    @_tp_cache
 | 
						|
    def __getitem_inner__(self, parameters):
 | 
						|
        args, result = parameters
 | 
						|
        msg = "Callable[args, result]: result must be a type."
 | 
						|
        result = _type_check(result, msg)
 | 
						|
        if args is Ellipsis:
 | 
						|
            return super().__getitem__((_TypingEllipsis, result))
 | 
						|
        msg = "Callable[[arg, ...], result]: each arg must be a type."
 | 
						|
        args = tuple(_type_check(arg, msg) for arg in args)
 | 
						|
        parameters = args + (result,)
 | 
						|
        return super().__getitem__(parameters)
 | 
						|
 | 
						|
 | 
						|
class Callable(extra=collections_abc.Callable, metaclass=CallableMeta):
 | 
						|
    """Callable type; Callable[[int], str] is a function of (int) -> str.
 | 
						|
 | 
						|
    The subscription syntax must always be used with exactly two
 | 
						|
    values: the argument list and the return type.  The argument list
 | 
						|
    must be a list of types or ellipsis; the return type must be a single type.
 | 
						|
 | 
						|
    There is no syntax to indicate optional or keyword arguments,
 | 
						|
    such function types are rarely used as callback types.
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is Callable:
 | 
						|
            raise TypeError("Type Callable cannot be instantiated; "
 | 
						|
                            "use a non-abstract subclass instead")
 | 
						|
        return _generic_new(cls.__next_in_mro__, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
class _ClassVar(_FinalTypingBase, _root=True):
 | 
						|
    """Special type construct to mark class variables.
 | 
						|
 | 
						|
    An annotation wrapped in ClassVar indicates that a given
 | 
						|
    attribute is intended to be used as a class variable and
 | 
						|
    should not be set on instances of that class. Usage::
 | 
						|
 | 
						|
      class Starship:
 | 
						|
          stats: ClassVar[Dict[str, int]] = {} # class variable
 | 
						|
          damage: int = 10                     # instance variable
 | 
						|
 | 
						|
    ClassVar accepts only types and cannot be further subscribed.
 | 
						|
 | 
						|
    Note that ClassVar is not a class itself, and should not
 | 
						|
    be used with isinstance() or issubclass().
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ('__type__',)
 | 
						|
 | 
						|
    def __init__(self, tp=None, **kwds):
 | 
						|
        self.__type__ = tp
 | 
						|
 | 
						|
    def __getitem__(self, item):
 | 
						|
        cls = type(self)
 | 
						|
        if self.__type__ is None:
 | 
						|
            return cls(_type_check(item,
 | 
						|
                       '{} accepts only single type.'.format(cls.__name__[1:])),
 | 
						|
                       _root=True)
 | 
						|
        raise TypeError('{} cannot be further subscripted'
 | 
						|
                        .format(cls.__name__[1:]))
 | 
						|
 | 
						|
    def _eval_type(self, globalns, localns):
 | 
						|
        new_tp = _eval_type(self.__type__, globalns, localns)
 | 
						|
        if new_tp == self.__type__:
 | 
						|
            return self
 | 
						|
        return type(self)(new_tp, _root=True)
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        r = super().__repr__()
 | 
						|
        if self.__type__ is not None:
 | 
						|
            r += '[{}]'.format(_type_repr(self.__type__))
 | 
						|
        return r
 | 
						|
 | 
						|
    def __hash__(self):
 | 
						|
        return hash((type(self).__name__, self.__type__))
 | 
						|
 | 
						|
    def __eq__(self, other):
 | 
						|
        if not isinstance(other, _ClassVar):
 | 
						|
            return NotImplemented
 | 
						|
        if self.__type__ is not None:
 | 
						|
            return self.__type__ == other.__type__
 | 
						|
        return self is other
 | 
						|
 | 
						|
 | 
						|
ClassVar = _ClassVar(_root=True)
 | 
						|
 | 
						|
 | 
						|
def cast(typ, val):
 | 
						|
    """Cast a value to a type.
 | 
						|
 | 
						|
    This returns the value unchanged.  To the type checker this
 | 
						|
    signals that the return value has the designated type, but at
 | 
						|
    runtime we intentionally don't check anything (we want this
 | 
						|
    to be as fast as possible).
 | 
						|
    """
 | 
						|
    return val
 | 
						|
 | 
						|
 | 
						|
def _get_defaults(func):
 | 
						|
    """Internal helper to extract the default arguments, by name."""
 | 
						|
    try:
 | 
						|
        code = func.__code__
 | 
						|
    except AttributeError:
 | 
						|
        # Some built-in functions don't have __code__, __defaults__, etc.
 | 
						|
        return {}
 | 
						|
    pos_count = code.co_argcount
 | 
						|
    arg_names = code.co_varnames
 | 
						|
    arg_names = arg_names[:pos_count]
 | 
						|
    defaults = func.__defaults__ or ()
 | 
						|
    kwdefaults = func.__kwdefaults__
 | 
						|
    res = dict(kwdefaults) if kwdefaults else {}
 | 
						|
    pos_offset = pos_count - len(defaults)
 | 
						|
    for name, value in zip(arg_names[pos_offset:], defaults):
 | 
						|
        assert name not in res
 | 
						|
        res[name] = value
 | 
						|
    return res
 | 
						|
 | 
						|
 | 
						|
_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
 | 
						|
                  types.MethodType, types.ModuleType,
 | 
						|
                  WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
 | 
						|
 | 
						|
 | 
						|
def get_type_hints(obj, globalns=None, localns=None):
 | 
						|
    """Return type hints for an object.
 | 
						|
 | 
						|
    This is often the same as obj.__annotations__, but it handles
 | 
						|
    forward references encoded as string literals, and if necessary
 | 
						|
    adds Optional[t] if a default value equal to None is set.
 | 
						|
 | 
						|
    The argument may be a module, class, method, or function. The annotations
 | 
						|
    are returned as a dictionary. For classes, annotations include also
 | 
						|
    inherited members.
 | 
						|
 | 
						|
    TypeError is raised if the argument is not of a type that can contain
 | 
						|
    annotations, and an empty dictionary is returned if no annotations are
 | 
						|
    present.
 | 
						|
 | 
						|
    BEWARE -- the behavior of globalns and localns is counterintuitive
 | 
						|
    (unless you are familiar with how eval() and exec() work).  The
 | 
						|
    search order is locals first, then globals.
 | 
						|
 | 
						|
    - If no dict arguments are passed, an attempt is made to use the
 | 
						|
      globals from obj (or the respective module's globals for classes),
 | 
						|
      and these are also used as the locals.  If the object does not appear
 | 
						|
      to have globals, an empty dictionary is used.
 | 
						|
 | 
						|
    - If one dict argument is passed, it is used for both globals and
 | 
						|
      locals.
 | 
						|
 | 
						|
    - If two dict arguments are passed, they specify globals and
 | 
						|
      locals, respectively.
 | 
						|
    """
 | 
						|
 | 
						|
    if getattr(obj, '__no_type_check__', None):
 | 
						|
        return {}
 | 
						|
    # Classes require a special treatment.
 | 
						|
    if isinstance(obj, type):
 | 
						|
        hints = {}
 | 
						|
        for base in reversed(obj.__mro__):
 | 
						|
            if globalns is None:
 | 
						|
                base_globals = sys.modules[base.__module__].__dict__
 | 
						|
            else:
 | 
						|
                base_globals = globalns
 | 
						|
            ann = base.__dict__.get('__annotations__', {})
 | 
						|
            for name, value in ann.items():
 | 
						|
                if value is None:
 | 
						|
                    value = type(None)
 | 
						|
                if isinstance(value, str):
 | 
						|
                    value = _ForwardRef(value)
 | 
						|
                value = _eval_type(value, base_globals, localns)
 | 
						|
                hints[name] = value
 | 
						|
        return hints
 | 
						|
 | 
						|
    if globalns is None:
 | 
						|
        if isinstance(obj, types.ModuleType):
 | 
						|
            globalns = obj.__dict__
 | 
						|
        else:
 | 
						|
            globalns = getattr(obj, '__globals__', {})
 | 
						|
        if localns is None:
 | 
						|
            localns = globalns
 | 
						|
    elif localns is None:
 | 
						|
        localns = globalns
 | 
						|
    hints = getattr(obj, '__annotations__', None)
 | 
						|
    if hints is None:
 | 
						|
        # Return empty annotations for something that _could_ have them.
 | 
						|
        if isinstance(obj, _allowed_types):
 | 
						|
            return {}
 | 
						|
        else:
 | 
						|
            raise TypeError('{!r} is not a module, class, method, '
 | 
						|
                            'or function.'.format(obj))
 | 
						|
    defaults = _get_defaults(obj)
 | 
						|
    hints = dict(hints)
 | 
						|
    for name, value in hints.items():
 | 
						|
        if value is None:
 | 
						|
            value = type(None)
 | 
						|
        if isinstance(value, str):
 | 
						|
            value = _ForwardRef(value)
 | 
						|
        value = _eval_type(value, globalns, localns)
 | 
						|
        if name in defaults and defaults[name] is None:
 | 
						|
            value = Optional[value]
 | 
						|
        hints[name] = value
 | 
						|
    return hints
 | 
						|
 | 
						|
 | 
						|
def no_type_check(arg):
 | 
						|
    """Decorator to indicate that annotations are not type hints.
 | 
						|
 | 
						|
    The argument must be a class or function; if it is a class, it
 | 
						|
    applies recursively to all methods and classes defined in that class
 | 
						|
    (but not to methods defined in its superclasses or subclasses).
 | 
						|
 | 
						|
    This mutates the function(s) or class(es) in place.
 | 
						|
    """
 | 
						|
    if isinstance(arg, type):
 | 
						|
        arg_attrs = arg.__dict__.copy()
 | 
						|
        for attr, val in arg.__dict__.items():
 | 
						|
            if val in arg.__bases__ + (arg,):
 | 
						|
                arg_attrs.pop(attr)
 | 
						|
        for obj in arg_attrs.values():
 | 
						|
            if isinstance(obj, types.FunctionType):
 | 
						|
                obj.__no_type_check__ = True
 | 
						|
            if isinstance(obj, type):
 | 
						|
                no_type_check(obj)
 | 
						|
    try:
 | 
						|
        arg.__no_type_check__ = True
 | 
						|
    except TypeError:  # built-in classes
 | 
						|
        pass
 | 
						|
    return arg
 | 
						|
 | 
						|
 | 
						|
def no_type_check_decorator(decorator):
 | 
						|
    """Decorator to give another decorator the @no_type_check effect.
 | 
						|
 | 
						|
    This wraps the decorator with something that wraps the decorated
 | 
						|
    function in @no_type_check.
 | 
						|
    """
 | 
						|
 | 
						|
    @functools.wraps(decorator)
 | 
						|
    def wrapped_decorator(*args, **kwds):
 | 
						|
        func = decorator(*args, **kwds)
 | 
						|
        func = no_type_check(func)
 | 
						|
        return func
 | 
						|
 | 
						|
    return wrapped_decorator
 | 
						|
 | 
						|
 | 
						|
def _overload_dummy(*args, **kwds):
 | 
						|
    """Helper for @overload to raise when called."""
 | 
						|
    raise NotImplementedError(
 | 
						|
        "You should not call an overloaded function. "
 | 
						|
        "A series of @overload-decorated functions "
 | 
						|
        "outside a stub module should always be followed "
 | 
						|
        "by an implementation that is not @overload-ed.")
 | 
						|
 | 
						|
 | 
						|
def overload(func):
 | 
						|
    """Decorator for overloaded functions/methods.
 | 
						|
 | 
						|
    In a stub file, place two or more stub definitions for the same
 | 
						|
    function in a row, each decorated with @overload.  For example:
 | 
						|
 | 
						|
      @overload
 | 
						|
      def utf8(value: None) -> None: ...
 | 
						|
      @overload
 | 
						|
      def utf8(value: bytes) -> bytes: ...
 | 
						|
      @overload
 | 
						|
      def utf8(value: str) -> bytes: ...
 | 
						|
 | 
						|
    In a non-stub file (i.e. a regular .py file), do the same but
 | 
						|
    follow it with an implementation.  The implementation should *not*
 | 
						|
    be decorated with @overload.  For example:
 | 
						|
 | 
						|
      @overload
 | 
						|
      def utf8(value: None) -> None: ...
 | 
						|
      @overload
 | 
						|
      def utf8(value: bytes) -> bytes: ...
 | 
						|
      @overload
 | 
						|
      def utf8(value: str) -> bytes: ...
 | 
						|
      def utf8(value):
 | 
						|
          # implementation goes here
 | 
						|
    """
 | 
						|
    return _overload_dummy
 | 
						|
 | 
						|
 | 
						|
class _ProtocolMeta(GenericMeta):
 | 
						|
    """Internal metaclass for _Protocol.
 | 
						|
 | 
						|
    This exists so _Protocol classes can be generic without deriving
 | 
						|
    from Generic.
 | 
						|
    """
 | 
						|
 | 
						|
    def __instancecheck__(self, obj):
 | 
						|
        if _Protocol not in self.__bases__:
 | 
						|
            return super().__instancecheck__(obj)
 | 
						|
        raise TypeError("Protocols cannot be used with isinstance().")
 | 
						|
 | 
						|
    def __subclasscheck__(self, cls):
 | 
						|
        if not self._is_protocol:
 | 
						|
            # No structural checks since this isn't a protocol.
 | 
						|
            return NotImplemented
 | 
						|
 | 
						|
        if self is _Protocol:
 | 
						|
            # Every class is a subclass of the empty protocol.
 | 
						|
            return True
 | 
						|
 | 
						|
        # Find all attributes defined in the protocol.
 | 
						|
        attrs = self._get_protocol_attrs()
 | 
						|
 | 
						|
        for attr in attrs:
 | 
						|
            if not any(attr in d.__dict__ for d in cls.__mro__):
 | 
						|
                return False
 | 
						|
        return True
 | 
						|
 | 
						|
    def _get_protocol_attrs(self):
 | 
						|
        # Get all Protocol base classes.
 | 
						|
        protocol_bases = []
 | 
						|
        for c in self.__mro__:
 | 
						|
            if getattr(c, '_is_protocol', False) and c.__name__ != '_Protocol':
 | 
						|
                protocol_bases.append(c)
 | 
						|
 | 
						|
        # Get attributes included in protocol.
 | 
						|
        attrs = set()
 | 
						|
        for base in protocol_bases:
 | 
						|
            for attr in base.__dict__.keys():
 | 
						|
                # Include attributes not defined in any non-protocol bases.
 | 
						|
                for c in self.__mro__:
 | 
						|
                    if (c is not base and attr in c.__dict__ and
 | 
						|
                            not getattr(c, '_is_protocol', False)):
 | 
						|
                        break
 | 
						|
                else:
 | 
						|
                    if (not attr.startswith('_abc_') and
 | 
						|
                            attr != '__abstractmethods__' and
 | 
						|
                            attr != '__annotations__' and
 | 
						|
                            attr != '__weakref__' and
 | 
						|
                            attr != '_is_protocol' and
 | 
						|
                            attr != '_gorg' and
 | 
						|
                            attr != '__dict__' and
 | 
						|
                            attr != '__args__' and
 | 
						|
                            attr != '__slots__' and
 | 
						|
                            attr != '_get_protocol_attrs' and
 | 
						|
                            attr != '__next_in_mro__' and
 | 
						|
                            attr != '__parameters__' and
 | 
						|
                            attr != '__origin__' and
 | 
						|
                            attr != '__orig_bases__' and
 | 
						|
                            attr != '__extra__' and
 | 
						|
                            attr != '__tree_hash__' and
 | 
						|
                            attr != '__module__'):
 | 
						|
                        attrs.add(attr)
 | 
						|
 | 
						|
        return attrs
 | 
						|
 | 
						|
 | 
						|
class _Protocol(metaclass=_ProtocolMeta):
 | 
						|
    """Internal base class for protocol classes.
 | 
						|
 | 
						|
    This implements a simple-minded structural issubclass check
 | 
						|
    (similar but more general than the one-offs in collections.abc
 | 
						|
    such as Hashable).
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    _is_protocol = True
 | 
						|
 | 
						|
 | 
						|
# Various ABCs mimicking those in collections.abc.
 | 
						|
# A few are simply re-exported for completeness.
 | 
						|
 | 
						|
Hashable = collections_abc.Hashable  # Not generic.
 | 
						|
 | 
						|
 | 
						|
if hasattr(collections_abc, 'Awaitable'):
 | 
						|
    class Awaitable(Generic[T_co], extra=collections_abc.Awaitable):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
    __all__.append('Awaitable')
 | 
						|
 | 
						|
 | 
						|
if hasattr(collections_abc, 'Coroutine'):
 | 
						|
    class Coroutine(Awaitable[V_co], Generic[T_co, T_contra, V_co],
 | 
						|
                    extra=collections_abc.Coroutine):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
    __all__.append('Coroutine')
 | 
						|
 | 
						|
 | 
						|
if hasattr(collections_abc, 'AsyncIterable'):
 | 
						|
 | 
						|
    class AsyncIterable(Generic[T_co], extra=collections_abc.AsyncIterable):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
    class AsyncIterator(AsyncIterable[T_co],
 | 
						|
                        extra=collections_abc.AsyncIterator):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
    __all__.append('AsyncIterable')
 | 
						|
    __all__.append('AsyncIterator')
 | 
						|
 | 
						|
 | 
						|
class Iterable(Generic[T_co], extra=collections_abc.Iterable):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
class Iterator(Iterable[T_co], extra=collections_abc.Iterator):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
class SupportsInt(_Protocol):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def __int__(self) -> int:
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class SupportsFloat(_Protocol):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def __float__(self) -> float:
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class SupportsComplex(_Protocol):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def __complex__(self) -> complex:
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class SupportsBytes(_Protocol):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def __bytes__(self) -> bytes:
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class SupportsAbs(_Protocol[T_co]):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def __abs__(self) -> T_co:
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class SupportsRound(_Protocol[T_co]):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def __round__(self, ndigits: int = 0) -> T_co:
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
if hasattr(collections_abc, 'Reversible'):
 | 
						|
    class Reversible(Iterable[T_co], extra=collections_abc.Reversible):
 | 
						|
        __slots__ = ()
 | 
						|
else:
 | 
						|
    class Reversible(_Protocol[T_co]):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
        @abstractmethod
 | 
						|
        def __reversed__(self) -> 'Iterator[T_co]':
 | 
						|
            pass
 | 
						|
 | 
						|
 | 
						|
Sized = collections_abc.Sized  # Not generic.
 | 
						|
 | 
						|
 | 
						|
class Container(Generic[T_co], extra=collections_abc.Container):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
if hasattr(collections_abc, 'Collection'):
 | 
						|
    class Collection(Sized, Iterable[T_co], Container[T_co],
 | 
						|
                     extra=collections_abc.Collection):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
    __all__.append('Collection')
 | 
						|
 | 
						|
 | 
						|
# Callable was defined earlier.
 | 
						|
 | 
						|
if hasattr(collections_abc, 'Collection'):
 | 
						|
    class AbstractSet(Collection[T_co],
 | 
						|
                      extra=collections_abc.Set):
 | 
						|
        __slots__ = ()
 | 
						|
else:
 | 
						|
    class AbstractSet(Sized, Iterable[T_co], Container[T_co],
 | 
						|
                      extra=collections_abc.Set):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
class MutableSet(AbstractSet[T], extra=collections_abc.MutableSet):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
# NOTE: It is only covariant in the value type.
 | 
						|
if hasattr(collections_abc, 'Collection'):
 | 
						|
    class Mapping(Collection[KT], Generic[KT, VT_co],
 | 
						|
                  extra=collections_abc.Mapping):
 | 
						|
        __slots__ = ()
 | 
						|
else:
 | 
						|
    class Mapping(Sized, Iterable[KT], Container[KT], Generic[KT, VT_co],
 | 
						|
                  extra=collections_abc.Mapping):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
class MutableMapping(Mapping[KT, VT], extra=collections_abc.MutableMapping):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
if hasattr(collections_abc, 'Reversible'):
 | 
						|
    if hasattr(collections_abc, 'Collection'):
 | 
						|
        class Sequence(Reversible[T_co], Collection[T_co],
 | 
						|
                       extra=collections_abc.Sequence):
 | 
						|
            __slots__ = ()
 | 
						|
    else:
 | 
						|
        class Sequence(Sized, Reversible[T_co], Container[T_co],
 | 
						|
                       extra=collections_abc.Sequence):
 | 
						|
            __slots__ = ()
 | 
						|
else:
 | 
						|
    class Sequence(Sized, Iterable[T_co], Container[T_co],
 | 
						|
                   extra=collections_abc.Sequence):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
class MutableSequence(Sequence[T], extra=collections_abc.MutableSequence):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
class ByteString(Sequence[int], extra=collections_abc.ByteString):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
class List(list, MutableSequence[T], extra=list):
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is List:
 | 
						|
            raise TypeError("Type List cannot be instantiated; "
 | 
						|
                            "use list() instead")
 | 
						|
        return _generic_new(list, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
class Deque(collections.deque, MutableSequence[T], extra=collections.deque):
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is Deque:
 | 
						|
            return collections.deque(*args, **kwds)
 | 
						|
        return _generic_new(collections.deque, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
class Set(set, MutableSet[T], extra=set):
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is Set:
 | 
						|
            raise TypeError("Type Set cannot be instantiated; "
 | 
						|
                            "use set() instead")
 | 
						|
        return _generic_new(set, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
class FrozenSet(frozenset, AbstractSet[T_co], extra=frozenset):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is FrozenSet:
 | 
						|
            raise TypeError("Type FrozenSet cannot be instantiated; "
 | 
						|
                            "use frozenset() instead")
 | 
						|
        return _generic_new(frozenset, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
class MappingView(Sized, Iterable[T_co], extra=collections_abc.MappingView):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
class KeysView(MappingView[KT], AbstractSet[KT],
 | 
						|
               extra=collections_abc.KeysView):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
class ItemsView(MappingView[Tuple[KT, VT_co]],
 | 
						|
                AbstractSet[Tuple[KT, VT_co]],
 | 
						|
                Generic[KT, VT_co],
 | 
						|
                extra=collections_abc.ItemsView):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
class ValuesView(MappingView[VT_co], extra=collections_abc.ValuesView):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
if hasattr(contextlib, 'AbstractContextManager'):
 | 
						|
    class ContextManager(Generic[T_co], extra=contextlib.AbstractContextManager):
 | 
						|
        __slots__ = ()
 | 
						|
else:
 | 
						|
    class ContextManager(Generic[T_co]):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
        def __enter__(self):
 | 
						|
            return self
 | 
						|
 | 
						|
        @abc.abstractmethod
 | 
						|
        def __exit__(self, exc_type, exc_value, traceback):
 | 
						|
            return None
 | 
						|
 | 
						|
        @classmethod
 | 
						|
        def __subclasshook__(cls, C):
 | 
						|
            if cls is ContextManager:
 | 
						|
                # In Python 3.6+, it is possible to set a method to None to
 | 
						|
                # explicitly indicate that the class does not implement an ABC
 | 
						|
                # (https://bugs.python.org/issue25958), but we do not support
 | 
						|
                # that pattern here because this fallback class is only used
 | 
						|
                # in Python 3.5 and earlier.
 | 
						|
                if (any("__enter__" in B.__dict__ for B in C.__mro__) and
 | 
						|
                    any("__exit__" in B.__dict__ for B in C.__mro__)):
 | 
						|
                    return True
 | 
						|
            return NotImplemented
 | 
						|
 | 
						|
 | 
						|
if hasattr(contextlib, 'AbstractAsyncContextManager'):
 | 
						|
    class AsyncContextManager(Generic[T_co],
 | 
						|
                              extra=contextlib.AbstractAsyncContextManager):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
    __all__.append('AsyncContextManager')
 | 
						|
elif sys.version_info[:2] >= (3, 5):
 | 
						|
    exec("""
 | 
						|
class AsyncContextManager(Generic[T_co]):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    async def __aenter__(self):
 | 
						|
        return self
 | 
						|
 | 
						|
    @abc.abstractmethod
 | 
						|
    async def __aexit__(self, exc_type, exc_value, traceback):
 | 
						|
        return None
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def __subclasshook__(cls, C):
 | 
						|
        if cls is AsyncContextManager:
 | 
						|
            if sys.version_info[:2] >= (3, 6):
 | 
						|
                return _collections_abc._check_methods(C, "__aenter__", "__aexit__")
 | 
						|
            if (any("__aenter__" in B.__dict__ for B in C.__mro__) and
 | 
						|
                    any("__aexit__" in B.__dict__ for B in C.__mro__)):
 | 
						|
                return True
 | 
						|
        return NotImplemented
 | 
						|
 | 
						|
__all__.append('AsyncContextManager')
 | 
						|
""")
 | 
						|
 | 
						|
 | 
						|
class Dict(dict, MutableMapping[KT, VT], extra=dict):
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is Dict:
 | 
						|
            raise TypeError("Type Dict cannot be instantiated; "
 | 
						|
                            "use dict() instead")
 | 
						|
        return _generic_new(dict, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
class DefaultDict(collections.defaultdict, MutableMapping[KT, VT],
 | 
						|
                  extra=collections.defaultdict):
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is DefaultDict:
 | 
						|
            return collections.defaultdict(*args, **kwds)
 | 
						|
        return _generic_new(collections.defaultdict, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
class Counter(collections.Counter, Dict[T, int], extra=collections.Counter):
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is Counter:
 | 
						|
            return collections.Counter(*args, **kwds)
 | 
						|
        return _generic_new(collections.Counter, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
if hasattr(collections, 'ChainMap'):
 | 
						|
    # ChainMap only exists in 3.3+
 | 
						|
    __all__.append('ChainMap')
 | 
						|
 | 
						|
    class ChainMap(collections.ChainMap, MutableMapping[KT, VT],
 | 
						|
                   extra=collections.ChainMap):
 | 
						|
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
        def __new__(cls, *args, **kwds):
 | 
						|
            if cls._gorg is ChainMap:
 | 
						|
                return collections.ChainMap(*args, **kwds)
 | 
						|
            return _generic_new(collections.ChainMap, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
# Determine what base class to use for Generator.
 | 
						|
if hasattr(collections_abc, 'Generator'):
 | 
						|
    # Sufficiently recent versions of 3.5 have a Generator ABC.
 | 
						|
    _G_base = collections_abc.Generator
 | 
						|
else:
 | 
						|
    # Fall back on the exact type.
 | 
						|
    _G_base = types.GeneratorType
 | 
						|
 | 
						|
 | 
						|
class Generator(Iterator[T_co], Generic[T_co, T_contra, V_co],
 | 
						|
                extra=_G_base):
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    def __new__(cls, *args, **kwds):
 | 
						|
        if cls._gorg is Generator:
 | 
						|
            raise TypeError("Type Generator cannot be instantiated; "
 | 
						|
                            "create a subclass instead")
 | 
						|
        return _generic_new(_G_base, cls, *args, **kwds)
 | 
						|
 | 
						|
 | 
						|
if hasattr(collections_abc, 'AsyncGenerator'):
 | 
						|
    class AsyncGenerator(AsyncIterator[T_co], Generic[T_co, T_contra],
 | 
						|
                         extra=collections_abc.AsyncGenerator):
 | 
						|
        __slots__ = ()
 | 
						|
 | 
						|
    __all__.append('AsyncGenerator')
 | 
						|
 | 
						|
 | 
						|
# Internal type variable used for Type[].
 | 
						|
CT_co = TypeVar('CT_co', covariant=True, bound=type)
 | 
						|
 | 
						|
 | 
						|
# This is not a real generic class.  Don't use outside annotations.
 | 
						|
class Type(Generic[CT_co], extra=type):
 | 
						|
    """A special construct usable to annotate class objects.
 | 
						|
 | 
						|
    For example, suppose we have the following classes::
 | 
						|
 | 
						|
      class User: ...  # Abstract base for User classes
 | 
						|
      class BasicUser(User): ...
 | 
						|
      class ProUser(User): ...
 | 
						|
      class TeamUser(User): ...
 | 
						|
 | 
						|
    And a function that takes a class argument that's a subclass of
 | 
						|
    User and returns an instance of the corresponding class::
 | 
						|
 | 
						|
      U = TypeVar('U', bound=User)
 | 
						|
      def new_user(user_class: Type[U]) -> U:
 | 
						|
          user = user_class()
 | 
						|
          # (Here we could write the user object to a database)
 | 
						|
          return user
 | 
						|
 | 
						|
      joe = new_user(BasicUser)
 | 
						|
 | 
						|
    At this point the type checker knows that joe has type BasicUser.
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
 | 
						|
def _make_nmtuple(name, types):
 | 
						|
    msg = "NamedTuple('Name', [(f0, t0), (f1, t1), ...]); each t must be a type"
 | 
						|
    types = [(n, _type_check(t, msg)) for n, t in types]
 | 
						|
    nm_tpl = collections.namedtuple(name, [n for n, t in types])
 | 
						|
    # Prior to PEP 526, only _field_types attribute was assigned.
 | 
						|
    # Now, both __annotations__ and _field_types are used to maintain compatibility.
 | 
						|
    nm_tpl.__annotations__ = nm_tpl._field_types = collections.OrderedDict(types)
 | 
						|
    try:
 | 
						|
        nm_tpl.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__')
 | 
						|
    except (AttributeError, ValueError):
 | 
						|
        pass
 | 
						|
    return nm_tpl
 | 
						|
 | 
						|
 | 
						|
_PY36 = sys.version_info[:2] >= (3, 6)
 | 
						|
 | 
						|
# attributes prohibited to set in NamedTuple class syntax
 | 
						|
_prohibited = ('__new__', '__init__', '__slots__', '__getnewargs__',
 | 
						|
               '_fields', '_field_defaults', '_field_types',
 | 
						|
               '_make', '_replace', '_asdict', '_source')
 | 
						|
 | 
						|
_special = ('__module__', '__name__', '__qualname__', '__annotations__')
 | 
						|
 | 
						|
 | 
						|
class NamedTupleMeta(type):
 | 
						|
 | 
						|
    def __new__(cls, typename, bases, ns):
 | 
						|
        if ns.get('_root', False):
 | 
						|
            return super().__new__(cls, typename, bases, ns)
 | 
						|
        if not _PY36:
 | 
						|
            raise TypeError("Class syntax for NamedTuple is only supported"
 | 
						|
                            " in Python 3.6+")
 | 
						|
        types = ns.get('__annotations__', {})
 | 
						|
        nm_tpl = _make_nmtuple(typename, types.items())
 | 
						|
        defaults = []
 | 
						|
        defaults_dict = {}
 | 
						|
        for field_name in types:
 | 
						|
            if field_name in ns:
 | 
						|
                default_value = ns[field_name]
 | 
						|
                defaults.append(default_value)
 | 
						|
                defaults_dict[field_name] = default_value
 | 
						|
            elif defaults:
 | 
						|
                raise TypeError("Non-default namedtuple field {field_name} cannot "
 | 
						|
                                "follow default field(s) {default_names}"
 | 
						|
                                .format(field_name=field_name,
 | 
						|
                                        default_names=', '.join(defaults_dict.keys())))
 | 
						|
        nm_tpl.__new__.__defaults__ = tuple(defaults)
 | 
						|
        nm_tpl._field_defaults = defaults_dict
 | 
						|
        # update from user namespace without overriding special namedtuple attributes
 | 
						|
        for key in ns:
 | 
						|
            if key in _prohibited:
 | 
						|
                raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
 | 
						|
            elif key not in _special and key not in nm_tpl._fields:
 | 
						|
                setattr(nm_tpl, key, ns[key])
 | 
						|
        return nm_tpl
 | 
						|
 | 
						|
 | 
						|
class NamedTuple(metaclass=NamedTupleMeta):
 | 
						|
    """Typed version of namedtuple.
 | 
						|
 | 
						|
    Usage in Python versions >= 3.6::
 | 
						|
 | 
						|
        class Employee(NamedTuple):
 | 
						|
            name: str
 | 
						|
            id: int
 | 
						|
 | 
						|
    This is equivalent to::
 | 
						|
 | 
						|
        Employee = collections.namedtuple('Employee', ['name', 'id'])
 | 
						|
 | 
						|
    The resulting class has extra __annotations__ and _field_types
 | 
						|
    attributes, giving an ordered dict mapping field names to types.
 | 
						|
    __annotations__ should be preferred, while _field_types
 | 
						|
    is kept to maintain pre PEP 526 compatibility. (The field names
 | 
						|
    are in the _fields attribute, which is part of the namedtuple
 | 
						|
    API.) Alternative equivalent keyword syntax is also accepted::
 | 
						|
 | 
						|
        Employee = NamedTuple('Employee', name=str, id=int)
 | 
						|
 | 
						|
    In Python versions <= 3.5 use::
 | 
						|
 | 
						|
        Employee = NamedTuple('Employee', [('name', str), ('id', int)])
 | 
						|
    """
 | 
						|
    _root = True
 | 
						|
 | 
						|
    def __new__(self, typename, fields=None, **kwargs):
 | 
						|
        if kwargs and not _PY36:
 | 
						|
            raise TypeError("Keyword syntax for NamedTuple is only supported"
 | 
						|
                            " in Python 3.6+")
 | 
						|
        if fields is None:
 | 
						|
            fields = kwargs.items()
 | 
						|
        elif kwargs:
 | 
						|
            raise TypeError("Either list of fields or keywords"
 | 
						|
                            " can be provided to NamedTuple, not both")
 | 
						|
        return _make_nmtuple(typename, fields)
 | 
						|
 | 
						|
 | 
						|
def NewType(name, tp):
 | 
						|
    """NewType creates simple unique types with almost zero
 | 
						|
    runtime overhead. NewType(name, tp) is considered a subtype of tp
 | 
						|
    by static type checkers. At runtime, NewType(name, tp) returns
 | 
						|
    a dummy function that simply returns its argument. Usage::
 | 
						|
 | 
						|
        UserId = NewType('UserId', int)
 | 
						|
 | 
						|
        def name_by_id(user_id: UserId) -> str:
 | 
						|
            ...
 | 
						|
 | 
						|
        UserId('user')          # Fails type check
 | 
						|
 | 
						|
        name_by_id(42)          # Fails type check
 | 
						|
        name_by_id(UserId(42))  # OK
 | 
						|
 | 
						|
        num = UserId(5) + 1     # type: int
 | 
						|
    """
 | 
						|
 | 
						|
    def new_type(x):
 | 
						|
        return x
 | 
						|
 | 
						|
    new_type.__name__ = name
 | 
						|
    new_type.__supertype__ = tp
 | 
						|
    return new_type
 | 
						|
 | 
						|
 | 
						|
# Python-version-specific alias (Python 2: unicode; Python 3: str)
 | 
						|
Text = str
 | 
						|
 | 
						|
 | 
						|
# Constant that's True when type checking, but False here.
 | 
						|
TYPE_CHECKING = False
 | 
						|
 | 
						|
 | 
						|
class IO(Generic[AnyStr]):
 | 
						|
    """Generic base class for TextIO and BinaryIO.
 | 
						|
 | 
						|
    This is an abstract, generic version of the return of open().
 | 
						|
 | 
						|
    NOTE: This does not distinguish between the different possible
 | 
						|
    classes (text vs. binary, read vs. write vs. read/write,
 | 
						|
    append-only, unbuffered).  The TextIO and BinaryIO subclasses
 | 
						|
    below capture the distinctions between text vs. binary, which is
 | 
						|
    pervasive in the interface; however we currently do not offer a
 | 
						|
    way to track the other distinctions in the type system.
 | 
						|
    """
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    @abstractproperty
 | 
						|
    def mode(self) -> str:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractproperty
 | 
						|
    def name(self) -> str:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def close(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def closed(self) -> bool:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def fileno(self) -> int:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def flush(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def isatty(self) -> bool:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def read(self, n: int = -1) -> AnyStr:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def readable(self) -> bool:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def readline(self, limit: int = -1) -> AnyStr:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def readlines(self, hint: int = -1) -> List[AnyStr]:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def seek(self, offset: int, whence: int = 0) -> int:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def seekable(self) -> bool:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def tell(self) -> int:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def truncate(self, size: int = None) -> int:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def writable(self) -> bool:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def write(self, s: AnyStr) -> int:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def writelines(self, lines: List[AnyStr]) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def __enter__(self) -> 'IO[AnyStr]':
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def __exit__(self, type, value, traceback) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class BinaryIO(IO[bytes]):
 | 
						|
    """Typed version of the return of open() in binary mode."""
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def write(self, s: Union[bytes, bytearray]) -> int:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def __enter__(self) -> 'BinaryIO':
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class TextIO(IO[str]):
 | 
						|
    """Typed version of the return of open() in text mode."""
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    @abstractproperty
 | 
						|
    def buffer(self) -> BinaryIO:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractproperty
 | 
						|
    def encoding(self) -> str:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractproperty
 | 
						|
    def errors(self) -> Optional[str]:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractproperty
 | 
						|
    def line_buffering(self) -> bool:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractproperty
 | 
						|
    def newlines(self) -> Any:
 | 
						|
        pass
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def __enter__(self) -> 'TextIO':
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
class io:
 | 
						|
    """Wrapper namespace for IO generic classes."""
 | 
						|
 | 
						|
    __all__ = ['IO', 'TextIO', 'BinaryIO']
 | 
						|
    IO = IO
 | 
						|
    TextIO = TextIO
 | 
						|
    BinaryIO = BinaryIO
 | 
						|
 | 
						|
 | 
						|
io.__name__ = __name__ + '.io'
 | 
						|
sys.modules[io.__name__] = io
 | 
						|
 | 
						|
 | 
						|
Pattern = _TypeAlias('Pattern', AnyStr, type(stdlib_re.compile('')),
 | 
						|
                     lambda p: p.pattern)
 | 
						|
Match = _TypeAlias('Match', AnyStr, type(stdlib_re.match('', '')),
 | 
						|
                   lambda m: m.re.pattern)
 | 
						|
 | 
						|
 | 
						|
class re:
 | 
						|
    """Wrapper namespace for re type aliases."""
 | 
						|
 | 
						|
    __all__ = ['Pattern', 'Match']
 | 
						|
    Pattern = Pattern
 | 
						|
    Match = Match
 | 
						|
 | 
						|
 | 
						|
re.__name__ = __name__ + '.re'
 | 
						|
sys.modules[re.__name__] = re
 |