[with patch, positive review] Workaround mishandled nested classes in Python and cPickle
|Reported by:||nthiery||Owned by:||nthiery|
|Component:||misc||Keywords:||pickling, nested classes|
|Cc:||sage-combinat, cwitty||Merged in:||sage-4.2.alpha0|
|Authors:||Craig Citro, Nicolas M. Thiéry||Reviewers:||Robert Bradshaw|
|Report Upstream:||Work issues:|
Description (last modified by )
With the python code below::
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!
Change History (11)
Changed 8 years ago by
Changed 7 years ago by
comment:7 Changed 7 years ago by
- Milestone changed from sage-4.1.3 to sage-4.1.2
- Reviewers set to Robert Bradshaw
comment:8 Changed 7 years ago by
- Status changed from needs_review to positive_review
- Summary changed from [with patch, needs review] Workaround mishandled nested classes in Python and cPickle to [with patch, positive review] Workaround mishandled nested classes in Python and cPickle