[issue8738] cPickle dumps(tuple) != dumps(loads(dumps(tuple)))

Alexander Belopolsky report at bugs.python.org
Thu Jul 15 06:58:59 CEST 2010


Alexander Belopolsky <belopolsky at users.sourceforge.net> added the comment:

There seems to be a bug somewhere in 2.x cPickle.  Here is a somewhat simpler way to demonstrate the bug: the following code

from pickletools import dis
import cPickle
t = 1L, # use long for easy 3.x comparison
s1 = cPickle.dumps(t)
s2 = cPickle.dumps(cPickle.loads(s1))
print(s1 == s2)
dis(s1)
dis(s2)

prints


False
    0: (    MARK
    1: L        LONG       1L
    5: t        TUPLE      (MARK at 0)
    6: p    PUT        1
    9: .    STOP
highest protocol among opcodes = 0
    0: (    MARK
    1: L        LONG       1L
    5: t        TUPLE      (MARK at 0)
    6: .    STOP
highest protocol among opcodes = 0

The difference is probably immaterial because nothing in the pickle uses the tuple again and PUT is redundant, but the difference does not show up when python pickle module is used instead of cPickle and is not present in py3k.

The comparable py3k code:

from pickletools import dis
import pickle
t = 1,
s1 = pickle.dumps(t, 0)
s2 = pickle.dumps(pickle.loads(s1), 0)
print(s1 == s2)
dis(s1)
dis(s2)


produces

True
    0: (    MARK
    1: L        LONG       1
    5: t        TUPLE      (MARK at 0)
    6: p    PUT        0
    9: .    STOP
highest protocol among opcodes = 0
    0: (    MARK
    1: L        LONG       1
    5: t        TUPLE      (MARK at 0)
    6: p    PUT        0
    9: .    STOP
highest protocol among opcodes = 0


Most likely the bug is benign and not worth fixing, but I would like to figure out what's going on and what changed in 3.x.

----------
assignee:  -> belopolsky
nosy: +belopolsky
versions:  -Python 2.6

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue8738>
_______________________________________


More information about the Python-bugs-list mailing list