-
-
Notifications
You must be signed in to change notification settings - Fork 556
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
Workaround mishandled nested classes in Python and cPickle #5986
Comments
This comment has been minimized.
This comment has been minimized.
comment:2
Attachment: cPickle-5986-nested-classes-submitted.patch.gz |
This comment has been minimized.
This comment has been minimized.
comment:4
This workaround it a bit to hackish for my taste, but it's been implemented and tested. Followup at #6121. |
comment:6
Replying to @jasongrout:
Not before Robert or someone else writes a proof of concept patch upon the category code proving that #6121 is a usable replacement for this one to get pickling to work for parents and categories. |
Author: Nicolas M. Thiéry |
Attachment: trac_5986-use-nested_class_metaclass.patch.gz Apply only this one |
Changed author from Nicolas M. Thiéry to Craig Citro, Nicolas M. Thiéry |
Reviewer: Robert Bradshaw |
comment:8
Much less intrusive--too bad we didn't pursue this just a bit more back in June. |
Merged: sage-4.2.alpha0 |
With the python code below::
class A:
class B:
pass
Python 2.6 erroneously set the B.name to "B" instead of "A.B".
Furthermore, upon pickling (here in save_global)
and unpickling (in load_global) a class
with name "A.B" in a module mod, the standard
cPickle module searches for "A.B" in mod.dict
instead of looking up "A" and then "B" in the result.
This patch works around this by a patch to cPickle.c (in fact a copy of it in the Sage source tree; see #5985) which fixes the name for B to its appropriate value A.B, and inserts 'A.B' = A.B in
mod.dict (hacky, but seems to work) the first time A.B is pickled,
and fixes load_global to implement a proper lookup upon unpickling.
It also ensures that sage/interfaces/sage0.py uses loads/dumps from
sage_object rather than calling directly cPickle.loads/dumps
(+1 by cwitty on this change)
Python source experts are more than welcome to rework/rewrite this patch!
Depends on #5483 and #5985
CC: @sagetrac-sage-combinat @sagetrac-cwitty
Component: misc
Keywords: nested classes
Author: Craig Citro, Nicolas M. Thiéry
Reviewer: Robert Bradshaw
Merged: sage-4.2.alpha0
Issue created by migration from https://trac.sagemath.org/ticket/5986
The text was updated successfully, but these errors were encountered: