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 @@ import re
__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 @@ _quotes = ["'", '"']
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 @@ class Pickler:
"""
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 @@ try:
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 @@ Try again with a "binary" pickle.
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 @@ True
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 @@ doesn't trigger this glitch, because the disassembler realizes that
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)