diff --git a/CHANGES.md b/CHANGES.md index 73d756ddf..199326091 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,8 @@ +1.2.2 +===== + +- Fix a bug affecting bound classmethod saving on Python 2. + ([issue #288](https://github.com/cloudpipe/cloudpickle/issues/288)) 1.2.1 ===== diff --git a/cloudpickle/__init__.py b/cloudpickle/__init__.py index 9a19537b9..c06bc55dc 100644 --- a/cloudpickle/__init__.py +++ b/cloudpickle/__init__.py @@ -8,4 +8,4 @@ if sys.version_info[:2] >= (3, 8): from cloudpickle.cloudpickle_fast import CloudPickler, dumps, dump -__version__ = '1.3.0.dev0' +__version__ = '1.2.2.dev0' diff --git a/cloudpickle/cloudpickle.py b/cloudpickle/cloudpickle.py index 30b6effeb..ad0f5bb58 100644 --- a/cloudpickle/cloudpickle.py +++ b/cloudpickle/cloudpickle.py @@ -882,8 +882,9 @@ def save_instancemethod(self, obj): if PY3: # pragma: no branch self.save_reduce(types.MethodType, (obj.__func__, obj.__self__), obj=obj) else: - self.save_reduce(types.MethodType, (obj.__func__, obj.__self__, obj.__self__.__class__), - obj=obj) + self.save_reduce( + types.MethodType, + (obj.__func__, obj.__self__, type(obj.__self__)), obj=obj) dispatch[types.MethodType] = save_instancemethod diff --git a/tests/cloudpickle_test.py b/tests/cloudpickle_test.py index 4e30b26ed..75287f6e6 100644 --- a/tests/cloudpickle_test.py +++ b/tests/cloudpickle_test.py @@ -431,6 +431,15 @@ def test_cm(cls): self.assertEqual(A.test_sm(), "sm") self.assertEqual(A.test_cm(), "cm") + def test_bound_classmethod(self): + class A: + @classmethod + def test_cm(cls): + return "cm" + + A.test_cm = pickle_depickle(A.test_cm, protocol=self.protocol) + self.assertEqual(A.test_cm(), "cm") + def test_method_descriptors(self): f = pickle_depickle(str.upper) self.assertEqual(f('abc'), 'ABC')