Olivier Grisel <olivier.gri...@ensta.org> added the comment:

Adding such a hook would make it possible to reimplement 
cloudpickle.CloudPickler by deriving from the fast _pickle.Pickler class 
(instead of the slow pickle._Pickler as done currently). This would mean 
rewriting most of the CloudPickler method to only rely on a save_reduce-style 
design instead of directly calling pickle._Pickler.write and 
pickle._Pickler.save. This is tedious but doable.

There is however a blocker with the current way closures are set: when we 
pickle a dynamically defined function (e.g. lambda, nested function or function 
in __main__), we currently use a direct call to memoize 
(https://github.com/cloudpipe/cloudpickle/blob/v0.7.0/cloudpickle/cloudpickle.py#L594)
 so as to be able to refer to the function itself in its own closure without 
causing an infinite loop in CloudPickler.dump. This also makes possible to 
pickle mutually recursive functions.

The easiest way to avoid having to call memoize explicitly would be to be able 
to pass the full __closure__ attribute in the state dict of the reduce call. 
Indeed the save_reduce function calls memoize automatically after saving the 
reconstructor and its args but prior to saving the state:

https://github.com/python/cpython/blob/v3.7.2/Modules/_pickle.c#L3903-L3931

It would therefore be possible to pass a (state, slotstate) tuple with the 
closure in slotstate that so it could be reconstructed at unpickling time with 
a setattr:

https://github.com/python/cpython/blob/v3.7.2/Modules/_pickle.c#L6258-L6272

However, it is currently not possible to setattr __closure__ at the moment. We 
can only set individual closure cell contents (which is not compatible with the 
setattr state trick described above).

To summarize, we need to implement the setter function for the __closure__ 
attribute of functions and methods to make it natural to reimplement the 
CloudPickler by inheriting from _pickle.Pickler using the hook described in 
this issue.

----------
nosy: +Olivier.Grisel

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue35900>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to