[issue14336] Difference between pickle implementations for function objects
sbt
report at bugs.python.org
Fri Mar 16 20:03:39 CET 2012
New submission from sbt <shibturn at gmail.com>:
When pickling a function object, if it cannot be saved as a global the C implementation falls back to using copyreg/__reduce__/__reduce_ex__.
The comment for the changeset which added this fallback claims that it is for compatibility with the Python implementation. See
http://hg.python.org/cpython/rev/c6753db9c6af
However, the current python implementations do not have any such fallback.
This affects both 2.x and 3.x.
For example
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle, cPickle, copy_reg
>>> def f():
... pass
...
>>> _f = f
>>> del f
>>> copy_reg.pickle(type(_f), lambda obj: (str, ("FALLBACK",)))
>>> cPickle.dumps(_f)
"c__builtin__\nstr\np1\n(S'FALLBACK'\np2\ntp3\nRp4\n."
>>> pickle.dumps(_f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python27\lib\pickle.py", line 1374, in dumps
Pickler(file, protocol).dump(obj)
File "c:\Python27\lib\pickle.py", line 224, in dump
self.save(obj)
File "c:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "c:\Python27\lib\pickle.py", line 748, in save_global
(obj, module, name))
pickle.PicklingError: Can't pickle <function f at 0x0299A470>: it's not found as __main__.f
I don't know what should be done. I would be tempted to always fall back to copyreg/__reduce__/__reduce_ex__ when save_global fails (not just for function objects) but that might make error messages less helpful.
----------
components: Library (Lib)
messages: 156069
nosy: sbt
priority: normal
severity: normal
status: open
title: Difference between pickle implementations for function objects
type: behavior
versions: Python 2.7, Python 3.3
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue14336>
_______________________________________
More information about the Python-bugs-list
mailing list