Skip to content

Commit ba23a20

Browse files
author
Joe Jevnik
committed
support unhashable closure values
1 parent da4dd39 commit ba23a20

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

cloudpickle/cloudpickle.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,10 @@ def save_function_tuple(self, func):
363363
save(_fill_function) # skeleton function updater
364364
write(pickle.MARK) # beginning of tuple that _fill_function expects
365365

366-
self._save_subimports(code, set(f_globals.values()) | set(closure))
366+
self._save_subimports(
367+
code,
368+
itertools.chain(f_globals.values(), closure),
369+
)
367370

368371
# create a skeleton function object and memoize it
369372
save(_make_skel_func)

tests/cloudpickle_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,18 @@ def g(n):
154154
g2 = pickle_depickle(f2(2))
155155
self.assertEqual(g2(5), 240)
156156

157+
def test_unhashable_closure(self):
158+
def f():
159+
s = set((1, 2)) # mutable set is unhashable
160+
161+
def g():
162+
return len(s)
163+
164+
return g
165+
166+
g = pickle_depickle(f())
167+
self.assertEqual(g(), 2)
168+
157169
@pytest.mark.skipif(sys.version_info >= (3, 4)
158170
and sys.version_info < (3, 4, 3),
159171
reason="subprocess has a bug in 3.4.0 to 3.4.2")

0 commit comments

Comments
 (0)