[issue14336] Difference between pickle implementations for function objects
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
However, the current python implementations do not have any such fallback.
This affects both 2.x and 3.x.
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():
>>> _f = f
>>> del f
>>> copy_reg.pickle(type(_f), lambda obj: (str, ("FALLBACK",)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python27\lib\pickle.py", line 1374, in dumps
File "c:\Python27\lib\pickle.py", line 224, in dump
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)
title: Difference between pickle implementations for function objects
versions: Python 2.7, Python 3.3
Python tracker <report at bugs.python.org>
More information about the Python-bugs-list