]> granicus.if.org Git - python/commitdiff
Patch #995766: Keyword argument support in cPickle.
authorMartin v. Löwis <martin@v.loewis.de>
Tue, 27 Jul 2004 05:22:33 +0000 (05:22 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Tue, 27 Jul 2004 05:22:33 +0000 (05:22 +0000)
Lib/test/pickletester.py
Misc/NEWS
Modules/cPickle.c

index 6e6d97de5c74ed6cf61ba4fe1d01dd1daa8339b6..85e1dea064f12fa4b8bdeb5406ceaf1428654552 100644 (file)
@@ -916,6 +916,16 @@ class AbstractPickleModuleTests(unittest.TestCase):
         # Of course this needs to be changed when HIGHEST_PROTOCOL changes.
         self.assertEqual(self.module.HIGHEST_PROTOCOL, 2)
 
+    def test_callapi(self):
+        from cStringIO import StringIO
+        f = StringIO()
+        # With and without keyword arguments
+        self.module.dump(123, f, -1)
+        self.module.dump(123, file=f, protocol=-1)
+        self.module.dumps(123, -1)
+        self.module.dumps(123, protocol=-1)
+        self.module.Pickler(f, -1)
+        self.module.Pickler(f, protocol=-1)
 
 class AbstractPersistentPicklerTests(unittest.TestCase):
 
index a7b0f1de9ab981e58695c8e34c187e21e78b95a5..289754dfc340496c6469e43dae5ce2be84a4af54 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -41,6 +41,8 @@ Core and builtins
 Extension modules
 -----------------
 
+- cpickle now supports the same keyword arguments as pickle.
+
 Library
 -------
 
index e5e20cb1099d863673e534d48d0aeaeeb4c387e0..dc987728f78a2f619be6ff44ec5d8b56a9ac5966 100644 (file)
@@ -2850,13 +2850,14 @@ newPicklerobject(PyObject *file, int proto)
 
 
 static PyObject *
-get_Pickler(PyObject *self, PyObject *args)
+get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
 {
+       static char *kwlist[] = {"file", "protocol", NULL};
        PyObject *file = NULL;
        int proto = 0;
 
        /* XXX
-        * The documented signature is Pickler(file, proto=0), but this
+        * The documented signature is Pickler(file, protocol=0), but this
         * accepts Pickler() and Pickler(integer) too.  The meaning then
         * is clear as mud, undocumented, and not supported by pickle.py.
         * I'm told Zope uses this, but I haven't traced into this code
@@ -2865,7 +2866,8 @@ get_Pickler(PyObject *self, PyObject *args)
        if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
                PyErr_Clear();
                proto = 0;
-               if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
+               if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
+                           kwlist, &file, &proto))
                        return NULL;
        }
        return (PyObject *)newPicklerobject(file, proto);
@@ -5377,15 +5379,17 @@ Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
  * Module-level functions.
  */
 
-/* dump(obj, file, proto=0). */
+/* dump(obj, file, protocol=0). */
 static PyObject *
-cpm_dump(PyObject *self, PyObject *args)
+cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
 {
+       static char *kwlist[] = {"obj", "file", "protocol", NULL};
        PyObject *ob, *file, *res = NULL;
        Picklerobject *pickler = 0;
        int proto = 0;
 
-       if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
+       if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
+                  &ob, &file, &proto)))
                goto finally;
 
        if (!( pickler = newPicklerobject(file, proto)))
@@ -5404,15 +5408,17 @@ cpm_dump(PyObject *self, PyObject *args)
 }
 
 
-/* dumps(obj, proto=0). */
+/* dumps(obj, protocol=0). */
 static PyObject *
-cpm_dumps(PyObject *self, PyObject *args)
+cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
 {
+       static char *kwlist[] = {"obj", "protocol", NULL};
        PyObject *ob, *file = 0, *res = NULL;
        Picklerobject *pickler = 0;
        int proto = 0;
 
-       if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
+       if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
+                  &ob, &proto)))
                goto finally;
 
        if (!( file = PycStringIO->NewOutput(128)))
@@ -5513,15 +5519,15 @@ static PyTypeObject Unpicklertype = {
 };
 
 static struct PyMethodDef cPickle_methods[] = {
-  {"dump",         (PyCFunction)cpm_dump,         METH_VARARGS,
-   PyDoc_STR("dump(object, file, proto=0) -- "
+  {"dump",         (PyCFunction)cpm_dump,         METH_VARARGS | METH_KEYWORDS,
+   PyDoc_STR("dump(obj, file, protocol=0) -- "
    "Write an object in pickle format to the given file.\n"
    "\n"
    "See the Pickler docstring for the meaning of optional argument proto.")
   },
 
-  {"dumps",        (PyCFunction)cpm_dumps,        METH_VARARGS,
-   PyDoc_STR("dumps(object, proto=0) -- "
+  {"dumps",        (PyCFunction)cpm_dumps,        METH_VARARGS | METH_KEYWORDS,
+   PyDoc_STR("dumps(obj, protocol=0) -- "
    "Return a string containing an object in pickle format.\n"
    "\n"
    "See the Pickler docstring for the meaning of optional argument proto.")
@@ -5533,8 +5539,8 @@ static struct PyMethodDef cPickle_methods[] = {
   {"loads",        (PyCFunction)cpm_loads,        METH_VARARGS,
    PyDoc_STR("loads(string) -- Load a pickle from the given string")},
 
-  {"Pickler",      (PyCFunction)get_Pickler,      METH_VARARGS,
-   PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
+  {"Pickler",      (PyCFunction)get_Pickler,      METH_VARARGS | METH_KEYWORDS,
+   PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
    "\n"
    "This takes a file-like object for writing a pickle data stream.\n"
    "The optional proto argument tells the pickler to use the given\n"