]> granicus.if.org Git - python/commitdiff
Begin the change from 'binary vs. text mode' to 'protocol 0, 1, 2'.
authorGuido van Rossum <guido@python.org>
Mon, 27 Jan 2003 22:47:53 +0000 (22:47 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 27 Jan 2003 22:47:53 +0000 (22:47 +0000)
The protocol now defaults to 1.  Protocol 2 is still unimplemented.

Lib/pickle.py
Lib/pickletools.py

index 79ee8af44561d3993dc84f8617a668bc5cacb7d7..935228373484e81e7da68ca68b9d61e3c8828df2 100644 (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):
index 59e0a1520245c34ab4713ddb4aa2e2c4ad90b246..5c0367be0f4e7945d4bd5365955bb646c9d53641 100644 (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)