diff options
Diffstat (limited to 'Lib/typing.py')
-rw-r--r-- | Lib/typing.py | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/Lib/typing.py b/Lib/typing.py index 56126cf..510574c 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -285,8 +285,17 @@ class _Final: if '_root' not in kwds: raise TypeError("Cannot subclass special typing classes") +class _Immutable: + """Mixin to indicate that object should not be copied.""" -class _SpecialForm(_Final, _root=True): + def __copy__(self): + return self + + def __deepcopy__(self, memo): + return self + + +class _SpecialForm(_Final, _Immutable, _root=True): """Internal indicator of special typing constructs. See _doc instance attribute for specific docs. """ @@ -328,8 +337,8 @@ class _SpecialForm(_Final, _root=True): def __repr__(self): return 'typing.' + self._name - def __copy__(self): - return self # Special forms are immutable. + def __reduce__(self): + return self._name def __call__(self, *args, **kwds): raise TypeError(f"Cannot instantiate {self!r}") @@ -496,7 +505,11 @@ class ForwardRef(_Final, _root=True): return f'ForwardRef({self.__forward_arg__!r})' -class TypeVar(_Final, _root=True): +def _find_name(mod, name): + return getattr(sys.modules[mod], name) + + +class TypeVar(_Final, _Immutable, _root=True): """Type variable. Usage:: @@ -536,10 +549,12 @@ class TypeVar(_Final, _root=True): T.__covariant__ == False T.__contravariant__ = False A.__constraints__ == (str, bytes) + + Note that only type variables defined in global scope can be pickled. """ __slots__ = ('__name__', '__bound__', '__constraints__', - '__covariant__', '__contravariant__') + '__covariant__', '__contravariant__', '_def_mod') def __init__(self, name, *constraints, bound=None, covariant=False, contravariant=False): @@ -558,6 +573,7 @@ class TypeVar(_Final, _root=True): self.__bound__ = _type_check(bound, "Bound must be a type.") else: self.__bound__ = None + self._def_mod = sys._getframe(1).f_globals['__name__'] # for pickling def __getstate__(self): return {'name': self.__name__, @@ -582,6 +598,9 @@ class TypeVar(_Final, _root=True): prefix = '~' return prefix + self.__name__ + def __reduce__(self): + return (_find_name, (self._def_mod, self.__name__)) + # Special typing constructs Union, Optional, Generic, Callable and Tuple # use three special attributes for internal bookkeeping of generic types: @@ -724,6 +743,11 @@ class _GenericAlias(_Final, _root=True): raise TypeError("Subscripted generics cannot be used with" " class and instance checks") + def __reduce__(self): + if self._special: + return self._name + return super().__reduce__() + class _VariadicGenericAlias(_GenericAlias, _root=True): """Same as _GenericAlias above but for variadic aliases. Currently, |