Skip to content

Commit d8452cc

Browse files
authored
Enable tracking for dynamically defined TypeVar instances (#353)
* Ensure that dynamic typevars are tracked and reconciled as dynamic classes and enums * Rename _ensure_tracking to _get_or_create_tracker_id
1 parent 3e80b26 commit d8452cc

File tree

3 files changed

+16
-8
lines changed

3 files changed

+16
-8
lines changed

cloudpickle/cloudpickle.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
_extract_code_globals_cache = weakref.WeakKeyDictionary()
9090

9191

92-
def _ensure_tracking(class_def):
92+
def _get_or_create_tracker_id(class_def):
9393
with _DYNAMIC_CLASS_TRACKER_LOCK:
9494
class_tracker_id = _DYNAMIC_CLASS_TRACKER_BY_CLASS.get(class_def)
9595
if class_tracker_id is None:
@@ -544,7 +544,7 @@ def _save_dynamic_enum(self, obj, clsdict):
544544
self.save_reduce(
545545
_make_skeleton_enum,
546546
(obj.__bases__, obj.__name__, obj.__qualname__,
547-
members, obj.__module__, _ensure_tracking(obj), None),
547+
members, obj.__module__, _get_or_create_tracker_id(obj), None),
548548
obj=obj
549549
)
550550

@@ -646,7 +646,7 @@ def save_dynamic_class(self, obj):
646646
tp = type(obj)
647647
self.save_reduce(_make_skeleton_class,
648648
(tp, obj.__name__, _get_bases(obj), type_kwargs,
649-
_ensure_tracking(obj), None),
649+
_get_or_create_tracker_id(obj), None),
650650
obj=obj)
651651

652652
# Now save the rest of obj's __dict__. Any references to obj
@@ -1251,17 +1251,20 @@ def _is_dynamic(module):
12511251
return _find_spec(module.__name__, pkgpath, module) is None
12521252

12531253

1254-
def _make_typevar(name, bound, constraints, covariant, contravariant):
1255-
return typing.TypeVar(
1254+
def _make_typevar(name, bound, constraints, covariant, contravariant,
1255+
class_tracker_id):
1256+
tv = typing.TypeVar(
12561257
name, *constraints, bound=bound,
12571258
covariant=covariant, contravariant=contravariant
12581259
)
1260+
return _lookup_class_or_track(class_tracker_id, tv)
12591261

12601262

12611263
def _decompose_typevar(obj):
12621264
return (
12631265
obj.__name__, obj.__bound__, obj.__constraints__,
12641266
obj.__covariant__, obj.__contravariant__,
1267+
_get_or_create_tracker_id(obj),
12651268
)
12661269

12671270

cloudpickle/cloudpickle_fast.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from .cloudpickle import (
2828
_is_dynamic, _extract_code_globals, _BUILTIN_TYPE_NAMES, DEFAULT_PROTOCOL,
2929
_find_imported_submodules, _get_cell_contents, _is_importable_by_name, _builtin_type,
30-
Enum, _ensure_tracking, _make_skeleton_class, _make_skeleton_enum,
30+
Enum, _get_or_create_tracker_id, _make_skeleton_class, _make_skeleton_enum,
3131
_extract_class_dict, dynamic_subimport, subimport, _typevar_reduce, _get_bases,
3232
)
3333

@@ -77,13 +77,13 @@ def _class_getnewargs(obj):
7777
type_kwargs['__dict__'] = __dict__
7878

7979
return (type(obj), obj.__name__, _get_bases(obj), type_kwargs,
80-
_ensure_tracking(obj), None)
80+
_get_or_create_tracker_id(obj), None)
8181

8282

8383
def _enum_getnewargs(obj):
8484
members = dict((e.name, e.value) for e in obj)
8585
return (obj.__bases__, obj.__name__, obj.__qualname__, members,
86-
obj.__module__, _ensure_tracking(obj), None)
86+
obj.__module__, _get_or_create_tracker_id(obj), None)
8787

8888

8989
# COLLECTION OF OBJECTS RECONSTRUCTORS

tests/cloudpickle_test.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2122,6 +2122,11 @@ def test_pickle_dynamic_typevar(self):
21222122
for attr in attr_list:
21232123
assert getattr(T, attr) == getattr(depickled_T, attr)
21242124

2125+
def test_pickle_dynamic_typevar_tracking(self):
2126+
T = typing.TypeVar("T")
2127+
T2 = subprocess_pickle_echo(T, protocol=self.protocol)
2128+
assert T is T2
2129+
21252130
def test_pickle_dynamic_typevar_memoization(self):
21262131
T = typing.TypeVar('T')
21272132
depickled_T1, depickled_T2 = pickle_depickle((T, T),

0 commit comments

Comments
 (0)