]> granicus.if.org Git - python/commitdiff
Added a HIGHEST_PROTOCOL module attribute to pickle and cPickle.
authorTim Peters <tim.peters@gmail.com>
Thu, 13 Feb 2003 15:44:41 +0000 (15:44 +0000)
committerTim Peters <tim.peters@gmail.com>
Thu, 13 Feb 2003 15:44:41 +0000 (15:44 +0000)
Lib/pickle.py
Lib/test/pickletester.py
Modules/cPickle.c

index 00f5834beaccf4d1d793ceb51bc97bf1bb16e220..74748f8ca97d5cba291bbba0588ed6476c97ac2b 100644 (file)
@@ -47,6 +47,10 @@ compatible_formats = ["1.0",            # Original protocol 0
                       "2.0",            # Protocol 2
                       ]                 # Old format versions we can read
 
+# Keep in synch with cPickle.  This is the highest protocol number we
+# know how to read.
+HIGHEST_PROTOCOL = 2
+
 # Why use struct.pack() for pickling but marshal.loads() for
 # unpickling?  struct.pack() is 40% faster than marshal.dumps(), but
 # marshal.loads() is twice as fast as struct.unpack()!
@@ -200,9 +204,9 @@ class Pickler:
         if protocol is None:
             protocol = 0
         if protocol < 0:
-            protocol = 2
-        elif protocol not in (0, 1, 2):
-            raise ValueError, "pickle protocol must be 0, 1 or 2"
+            protocol = HIGHEST_PROTOCOL
+        elif not 0 <= protocol <= HIGHEST_PROTOCOL:
+            raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL)
         self.write = file.write
         self.memo = {}
         self.proto = int(protocol)
index 734f2a30c0b2ded73b3eb8dc06481b5a8e7320bc..8479d4350c7d18b9eaa7fd77ec90dfbd15d0ca99 100644 (file)
@@ -1,5 +1,6 @@
 import unittest
 import pickle
+import cPickle
 import pickletools
 import copy_reg
 
@@ -7,8 +8,9 @@ from test.test_support import TestFailed, have_unicode, TESTFN
 
 # Tests that try a number of pickle protocols should have a
 #     for proto in protocols:
-# kind of outer loop.  Bump the 3 to 4 if/when protocol 3 is invented.
-protocols = range(3)
+# kind of outer loop.
+assert pickle.HIGHEST_PROTOCOL == cPickle.HIGHEST_PROTOCOL == 2
+protocols = range(pickle.HIGHEST_PROTOCOL + 1)
 
 
 # Return True if opcode code appears in the pickle, else False.
index a9bbd3639cc0ce45e8281e3376cb86262919a6b1..17da7d7917d9d696a6aba9695041105f07b20cec 100644 (file)
@@ -15,7 +15,7 @@ PyDoc_STRVAR(cPickle_module_documentation,
 #define WRITE_BUF_SIZE 256
 
 /* Bump this when new opcodes are added to the pickle protocol. */
-#define CURRENT_PROTOCOL_NUMBER 2
+#define HIGHEST_PROTOCOL 2
 
 /*
  * Pickle opcodes.  These must be kept in synch with pickle.py.  Extensive
@@ -2743,11 +2743,11 @@ newPicklerobject(PyObject *file, int proto)
        Picklerobject *self;
 
        if (proto < 0)
-               proto = CURRENT_PROTOCOL_NUMBER;
-       if (proto > CURRENT_PROTOCOL_NUMBER) {
+               proto = HIGHEST_PROTOCOL;
+       if (proto > HIGHEST_PROTOCOL) {
                PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
                             "the highest available protocol is %d",
-                            proto, CURRENT_PROTOCOL_NUMBER);
+                            proto, HIGHEST_PROTOCOL);
                return NULL;
        }
 
@@ -4308,7 +4308,7 @@ load_proto(Unpicklerobject *self)
         * int when chewing on 1 byte.
         */
        assert(i >= 0);
-       if (i <= CURRENT_PROTOCOL_NUMBER)
+       if (i <= HIGHEST_PROTOCOL)
                return 0;
 
        PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
@@ -5562,6 +5562,10 @@ initcPickle(void)
        }
        Py_DECREF(di);
 
+       i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
+       if (i < 0)
+               return;
+
        /* These are purely informational; no code uses them. */
        /* File format version we write. */
        format_version = PyString_FromString("2.0");