homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author gpk
Recipients gpk
Date 2008年03月15日.18:58:32
SpamBayes Score 0.08659757
Marked as misclassified No
Message-id <1205607515.59.0.862171292483.issue2294@psf.upfronthosting.co.za>
In-reply-to
Content
If we have a hierarchy of classes, and we use
__getstate__/__setstate__, the wrong class'
__setstate__ gets called.
Possibly, this is a documentation problem, but here goes:
Take two classes, A and B, where B is the child of A.
Construct a B. Pickle it. Unpickle it, and you find
that the __setstate__ function for A is called with the result
produced by B.__getstate__().
This is wrong.
An example follows:
import pickle as P
class A(object):
 def __init__(self, a):
 print 'A.__init__'
 self.a = a
 def __getstate__(self):
 print 'A.__getstate'
 return self.a
 def __setstate__(self, upstate):
 print 'A.__setstate', upstate
 self.a = upstate
class B(A):
 def __init__(self, a, b):
 print 'B.__init__'
 A.__init__(self, a)
 self.b = b
 def __getstate__(self):
 print 'B.__getstate'
 return (A.__getstate__(self), self.b)
 def __setstate(self, upstate):
 # This never gets called!
 print 'B.__setstate', upstate
 A.__setstate__(self, upstate[0])
 self.b = upstate[1]
 def __repr__(self):
 return '<B a=%d b=%d>' % (self.a, self.b)
q = B(1,2)
print '---'
r = P.loads(P.dumps(q, 0))
print 'q=', q
print 'r=', r
Now, run it:
$ python foo.py
B.__init__
A.__init__
---
B.__getstate
A.__getstate
A.__setstate (1, 2)
q= <B a=1 b=2, h=46912504218064>
r= Traceback (most recent call last):
 File "foo.py", line 44, in <module>
 print 'r=', r
 File "foo.py", line 37, in __repr__
 return '<B a=%d b=%d>' % (self.a, self.b)
AttributeError: 'B' object has no attribute 'b'
$
Note that this problem doesn't get noticed in the
common case where you simply pass __dict__ around
from __getstate__ to __setstate__. However, it
exists in many other use cases.
History
Date User Action Args
2008年03月15日 18:58:36gpksetspambayes_score: 0.0865976 -> 0.08659757
recipients: + gpk
2008年03月15日 18:58:35gpksetspambayes_score: 0.0865976 -> 0.0865976
messageid: <1205607515.59.0.862171292483.issue2294@psf.upfronthosting.co.za>
2008年03月15日 18:58:33gpklinkissue2294 messages
2008年03月15日 18:58:32gpkcreate

AltStyle によって変換されたページ (->オリジナル) /