-
-
Notifications
You must be signed in to change notification settings - Fork 30k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Difference between pickle implementations for function objects #58544
Comments
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. |
I couldn't find the code referenced in the changeset in the new _pickle.c. However I did find the comment that I've pasted below so I believe this issue only applies to 2.7. /* The old cPickle had an optimization that used switch-case statement |
In 3.x the fallback was removed by 6bd1f0a27e8e. If this is 2.7 only issue I prefer to close it as "won't fix". See also bpo-26959. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: