Begin the change from 'binary vs. text mode' to 'protocol 0, 1, 2'.

The protocol now defaults to 1.  Protocol 2 is still unimplemented.
This commit is contained in:
Guido van Rossum 2003-01-27 22:47:53 +00:00
parent 99d4abf8a2
commit f29d3d6011
2 changed files with 29 additions and 16 deletions

View file

@ -36,8 +36,14 @@
__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
"Unpickler", "dump", "dumps", "load", "loads"]
format_version = "1.3" # File format version we write
compatible_formats = ["1.0", "1.1", "1.2"] # Old format versions we can read
# These are purely informational; no code usues these
format_version = "2.0" # File format version we write
compatible_formats = ["1.0", # Original protocol 0
"1.1", # Protocol 0 with class supprt added
"1.2", # Original protocol 1
"1.3", # Protocol 1 with BINFLOAT added
"2.0", # Protocol 2
] # Old format versions we can read
mdumps = marshal.dumps
mloads = marshal.loads
@ -151,12 +157,18 @@ def __init__(self, value):
class Pickler:
def __init__(self, file, bin = 0):
def __init__(self, file, proto=1):
"""This takes a file-like object for writing a pickle data stream.
The optional bin parameter if true, tells the pickler to use the more
efficient binary pickle format, otherwise the ASCII format is used
(this is the default).
The optional proto argument tells the pickler to use the given
protocol; supported protocols are 0, 1, 2. The default
protocol is 1 (in previous Python versions the default was 0).
Protocol 1 is more efficient than protocol 0; protocol 2 is
more efficient than protocol 1. Protocol 2 is not the default
because it is not supported by older Python versions.
XXX Protocol 2 is not yet implemented.
The file parameter must have a write() method that accepts a single
string argument. It can thus be an open file object, a StringIO
@ -165,7 +177,8 @@ def __init__(self, file, bin = 0):
"""
self.write = file.write
self.memo = {}
self.bin = bin
self.proto = proto
self.bin = proto >= 1
def clear_memo(self):
"""Clears the pickler's "memo".
@ -1070,12 +1083,12 @@ class _EmptyClass:
except ImportError:
from StringIO import StringIO
def dump(object, file, bin = 0):
Pickler(file, bin).dump(object)
def dump(object, file, proto=1):
Pickler(file, proto).dump(object)
def dumps(object, bin = 0):
def dumps(object, proto=1):
file = StringIO()
Pickler(file, bin).dump(object)
Pickler(file, proto).dump(object)
return file.getvalue()
def load(file):

View file

@ -1902,7 +1902,7 @@ def dis(pickle, out=None, indentlevel=4):
_dis_test = """
>>> import pickle
>>> x = [1, 2, (3, 4), {'abc': u"def"}]
>>> pik = pickle.dumps(x)
>>> pik = pickle.dumps(x, 0)
>>> dis(pik)
0: ( MARK
1: l LIST (MARK at 0)
@ -1955,13 +1955,13 @@ def dis(pickle, out=None, indentlevel=4):
Exercise the INST/OBJ/BUILD family.
>>> import random
>>> dis(pickle.dumps(random.random))
>>> dis(pickle.dumps(random.random, 0))
0: c GLOBAL 'random random'
15: p PUT 0
18: . STOP
>>> x = [pickle.PicklingError()] * 2
>>> dis(pickle.dumps(x))
>>> dis(pickle.dumps(x, 0))
0: ( MARK
1: l LIST (MARK at 0)
2: p PUT 0
@ -2016,7 +2016,7 @@ def dis(pickle, out=None, indentlevel=4):
True
>>> T[0][0] is T
True
>>> dis(pickle.dumps(L))
>>> dis(pickle.dumps(L, 0))
0: ( MARK
1: l LIST (MARK at 0)
2: p PUT 0
@ -2043,7 +2043,7 @@ def dis(pickle, out=None, indentlevel=4):
POP_MARK gets rid of the MARK. Doing a better job on the protocol 0
pickle would require the disassembler to emulate the stack.
>>> dis(pickle.dumps(T))
>>> dis(pickle.dumps(T, 0))
0: ( MARK
1: ( MARK
2: l LIST (MARK at 1)