Skip to content

Commit 2db58f1

Browse files
pierreglaserogrisel
authored andcommitted
FIX pickle getset_descriptor (#290)
1 parent 6ca95a8 commit 2db58f1

File tree

4 files changed

+18
-0
lines changed

4 files changed

+18
-0
lines changed

Diff for: CHANGES.md

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
- Fix a bug affecting bound classmethod saving on Python 2.
55
([issue #288](https://github.com/cloudpipe/cloudpickle/issues/288))
66

7+
- Add support for pickling "getset" descriptors
8+
([issue #290](https://github.com/cloudpipe/cloudpickle/pull/290))
9+
710
1.2.1
811
=====
912

Diff for: cloudpickle/cloudpickle.py

+5
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,11 @@ def save_builtin_function_or_method(self, obj):
848848
method_descriptor = type(str.upper)
849849
dispatch[method_descriptor] = save_builtin_function_or_method
850850

851+
def save_getset_descriptor(self, obj):
852+
return self.save_reduce(getattr, (obj.__objclass__, obj.__name__))
853+
854+
dispatch[types.GetSetDescriptorType] = save_getset_descriptor
855+
851856
def save_global(self, obj, name=None, pack=struct.pack):
852857
"""
853858
Save a "global".

Diff for: cloudpickle/cloudpickle_fast.py

+5
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,10 @@ def _file_reduce(obj):
260260
return _file_reconstructor, (retval,)
261261

262262

263+
def _getset_descriptor_reduce(obj):
264+
return getattr, (obj.__objclass__, obj.__name__)
265+
266+
263267
def _mappingproxy_reduce(obj):
264268
return types.MappingProxyType, (dict(obj),)
265269

@@ -405,6 +409,7 @@ class CloudPickler(Pickler):
405409
dispatch[staticmethod] = _classmethod_reduce
406410
dispatch[types.CellType] = _cell_reduce
407411
dispatch[types.CodeType] = _code_reduce
412+
dispatch[types.GetSetDescriptorType] = _getset_descriptor_reduce
408413
dispatch[types.ModuleType] = _module_reduce
409414
dispatch[types.MethodType] = _method_reduce
410415
dispatch[types.MappingProxyType] = _mappingproxy_reduce

Diff for: tests/cloudpickle_test.py

+5
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,11 @@ def test_logger(self):
984984
# logging.Logger object
985985
self.check_logger('cloudpickle.dummy_test_logger')
986986

987+
def test_getset_descriptor(self):
988+
assert isinstance(float.real, types.GetSetDescriptorType)
989+
depickled_descriptor = pickle_depickle(float.real)
990+
self.assertIs(depickled_descriptor, float.real)
991+
987992
def test_abc(self):
988993

989994
@abc.abstractmethod

0 commit comments

Comments
 (0)