-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Fix unpickling/__setstate__ in TransformNode #4070
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
Conversation
@@ -115,7 +115,7 @@ def __getstate__(self): | |||
def __setstate__(self, data_dict): | |||
self.__dict__ = data_dict | |||
# turn the normal dictionary back into a WeakValueDictionary | |||
self._parents = WeakValueDictionary(self._parents) | |||
self._parents = WeakValueDictionary(self.__dict__['_parents']) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you explain why this changes anything?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The weak reference is destroyed during pickling, thus self._parents
does not exist anymore at this point.__getstate__
however saved it in data_dict['_parents']
from which it is now restored.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this is doing what you thing it is. Previously we were restoring the _parents from the stored data dictionary, now this is restoring parents from self, which hasn't yet been initialised. Hence, _parents will simply be empty (https://github.com/joergdietrich/matplotlib/blob/%234068/lib/matplotlib/transforms.py#L97).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this is doing what you thing it is.
Scrap that. I think I'm talking rubbish. (Friday afternoon!)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you've found a bug with the setstate implementation, and I don't think it has previously been tested correctly.
How about simply doing data_dict['_parents']
though. It may be more clear what is going on that way.
Would you also mind adding a test that self._parents
actually is accessible after being restored?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I still don't understand... shouldn't self._parents
be equivalent to
self.__dict__['_parents']
, since the object dictionary would be where one
accesses attributes of the object?
On Fri, Feb 6, 2015 at 11:16 AM, Phil Elson notifications@github.com
wrote:
In lib/matplotlib/transforms.py
#4070 (comment):@@ -115,7 +115,7 @@ def getstate(self):
def setstate(self, data_dict):
self.dict = data_dict
# turn the normal dictionary back into a WeakValueDictionary
self._parents = WeakValueDictionary(self._parents)
self._parents = WeakValueDictionary(self.__dict__['_parents'])
I don't think this is doing what you thing it is.
Scrap that. I think I'm talking rubbish. (Friday afternoon!)
—
Reply to this email directly or view it on GitHub
https://github.com/matplotlib/matplotlib/pull/4070/files#r24250906.
I'm not sure anymore I understand myself what's going on. This PR definitely fixes the exception during unpickling. However, the unpickled figure cannot be
I'll investigate. |
@joergdietrich Any progress on this? |
No, sorry. Unexpectedly got flooded with other things. This PR does not fix the original problem at all. The exception during unpickling in fact does not occur on my devel branch without this PR. I created a bit of a mess with different environments when trying to fix this. This PR should be closed without merging. It will be a few weeks before I can look into #4068. I'd be happy if somebody else wants to take a look at it. |
@joergdietrich No worries. I have great sympathy for both being over-subscribed and python environments fighting back! |
Fix the unpickling error in #4068 and add a test for it.