[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


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)
>>> 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
  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>

More information about the Python-bugs-list mailing list