mirror of
https://github.com/python/cpython.git
synced 2024-11-23 18:04:37 +08:00
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:
parent
99d4abf8a2
commit
f29d3d6011
@ -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):
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user