From 2ff1a5517b92a6c8da8dade97ae30b3fa8cec4df Mon Sep 17 00:00:00 2001 From: Pierre Glaser Date: Wed, 12 Jun 2019 17:44:35 +0200 Subject: [PATCH 1/3] FIX bound classmethod saving --- cloudpickle/cloudpickle.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 From e2be38d64176d8413505265d5627825c592ca331 Mon Sep 17 00:00:00 2001 From: Pierre Glaser Date: Wed, 12 Jun 2019 17:45:06 +0200 Subject: [PATCH 2/3] TST test bound classmethod saving --- tests/cloudpickle_test.py | 9 +++++++++ 1 file changed, 9 insertions(+) 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') From 779a45eb8322628da4326f827aeb306c0ca5f6bb Mon Sep 17 00:00:00 2001 From: Pierre Glaser Date: Wed, 12 Jun 2019 17:48:17 +0200 Subject: [PATCH 3/3] MNT version, changelog --- CHANGES.md | 5 +++++ cloudpickle/__init__.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) 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'