diff --git a/cloudpickle/cloudpickle.py b/cloudpickle/cloudpickle.py index 8211ab214..8dd5d816f 100644 --- a/cloudpickle/cloudpickle.py +++ b/cloudpickle/cloudpickle.py @@ -363,7 +363,10 @@ def save_function_tuple(self, func): save(_fill_function) # skeleton function updater write(pickle.MARK) # beginning of tuple that _fill_function expects - self._save_subimports(code, set(f_globals.values()) | set(closure)) + self._save_subimports( + code, + itertools.chain(f_globals.values(), closure), + ) # create a skeleton function object and memoize it save(_make_skel_func) diff --git a/tests/cloudpickle_test.py b/tests/cloudpickle_test.py index 28d1c2e70..43f8679f0 100644 --- a/tests/cloudpickle_test.py +++ b/tests/cloudpickle_test.py @@ -154,6 +154,18 @@ def g(n): g2 = pickle_depickle(f2(2)) self.assertEqual(g2(5), 240) + def test_unhashable_closure(self): + def f(): + s = set((1, 2)) # mutable set is unhashable + + def g(): + return len(s) + + return g + + g = pickle_depickle(f()) + self.assertEqual(g(), 2) + @pytest.mark.skipif(sys.version_info >= (3, 4) and sys.version_info < (3, 4, 3), reason="subprocess has a bug in 3.4.0 to 3.4.2")