[Python-checkins] bpo-33652: Improve pickle support in the typing module. (GH-7123)
Ivan Levkivskyi
webhook-mailer at python.org
Sat May 26 14:19:29 EDT 2018
https://github.com/python/cpython/commit/09f3221fbbf72692308149054e4f7668b08b22eb
commit: 09f3221fbbf72692308149054e4f7668b08b22eb
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: Ivan Levkivskyi <levkivskyi at gmail.com>
date: 2018-05-26T11:19:26-07:00
summary:
bpo-33652: Improve pickle support in the typing module. (GH-7123)
Pickles of type variables and subscripted generics are now future-proof
and compatible with older Python versions.
files:
A Misc/NEWS.d/next/Library/2018-05-26-10-13-59.bpo-33652.humFJ1.rst
M Lib/typing.py
diff --git a/Lib/typing.py b/Lib/typing.py
index 18b04cf4dbe2..e9265afce491 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -24,6 +24,7 @@
import collections.abc
import contextlib
import functools
+import operator
import re as stdlib_re # Avoid confusion with the re we export.
import sys
import types
@@ -486,10 +487,6 @@ def __repr__(self):
return f'ForwardRef({self.__forward_arg__!r})'
-def _find_name(mod, name):
- return getattr(sys.modules[mod], name)
-
-
class TypeVar(_Final, _Immutable, _root=True):
"""Type variable.
@@ -535,7 +532,7 @@ def longest(x: A, y: A) -> A:
"""
__slots__ = ('__name__', '__bound__', '__constraints__',
- '__covariant__', '__contravariant__', '_def_mod')
+ '__covariant__', '__contravariant__')
def __init__(self, name, *constraints, bound=None,
covariant=False, contravariant=False):
@@ -554,7 +551,9 @@ def __init__(self, name, *constraints, bound=None,
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_mod = sys._getframe(1).f_globals['__name__'] # for pickling
+ if def_mod != 'typing':
+ self.__module__ = def_mod
def __getstate__(self):
return {'name': self.__name__,
@@ -580,7 +579,7 @@ def __repr__(self):
return prefix + self.__name__
def __reduce__(self):
- return (_find_name, (self._def_mod, self.__name__))
+ return self.__name__
# Special typing constructs Union, Optional, Generic, Callable and Tuple
@@ -741,7 +740,19 @@ def __subclasscheck__(self, cls):
def __reduce__(self):
if self._special:
return self._name
- return super().__reduce__()
+
+ if self._name:
+ origin = globals()[self._name]
+ else:
+ origin = self.__origin__
+ if (origin is Callable and
+ not (len(self.__args__) == 2 and self.__args__[0] is Ellipsis)):
+ args = list(self.__args__[:-1]), self.__args__[-1]
+ else:
+ args = tuple(self.__args__)
+ if len(args) == 1 and not isinstance(args[0], tuple):
+ args, = args
+ return operator.getitem, (origin, args)
class _VariadicGenericAlias(_GenericAlias, _root=True):
diff --git a/Misc/NEWS.d/next/Library/2018-05-26-10-13-59.bpo-33652.humFJ1.rst b/Misc/NEWS.d/next/Library/2018-05-26-10-13-59.bpo-33652.humFJ1.rst
new file mode 100644
index 000000000000..f5499f1b53ce
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-05-26-10-13-59.bpo-33652.humFJ1.rst
@@ -0,0 +1,2 @@
+Pickles of type variables and subscripted generics are now future-proof and
+compatible with older Python versions.
More information about the Python-checkins
mailing list