Commit 544f1195 authored by Martin v. Löwis's avatar Martin v. Löwis

Patch #995766: Keyword argument support in cPickle.

parent 7b9190b8
...@@ -916,6 +916,16 @@ class AbstractPickleModuleTests(unittest.TestCase): ...@@ -916,6 +916,16 @@ class AbstractPickleModuleTests(unittest.TestCase):
# Of course this needs to be changed when HIGHEST_PROTOCOL changes. # Of course this needs to be changed when HIGHEST_PROTOCOL changes.
self.assertEqual(self.module.HIGHEST_PROTOCOL, 2) 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): class AbstractPersistentPicklerTests(unittest.TestCase):
......
...@@ -41,6 +41,8 @@ Core and builtins ...@@ -41,6 +41,8 @@ Core and builtins
Extension modules Extension modules
----------------- -----------------
- cpickle now supports the same keyword arguments as pickle.
Library Library
------- -------
......
...@@ -2850,13 +2850,14 @@ newPicklerobject(PyObject *file, int proto) ...@@ -2850,13 +2850,14 @@ newPicklerobject(PyObject *file, int proto)
static PyObject * 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; PyObject *file = NULL;
int proto = 0; int proto = 0;
/* XXX /* 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 * accepts Pickler() and Pickler(integer) too. The meaning then
* is clear as mud, undocumented, and not supported by pickle.py. * 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 * I'm told Zope uses this, but I haven't traced into this code
...@@ -2865,7 +2866,8 @@ get_Pickler(PyObject *self, PyObject *args) ...@@ -2865,7 +2866,8 @@ get_Pickler(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) { if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
PyErr_Clear(); PyErr_Clear();
proto = 0; 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 NULL;
} }
return (PyObject *)newPicklerobject(file, proto); return (PyObject *)newPicklerobject(file, proto);
...@@ -5377,15 +5379,17 @@ Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value) ...@@ -5377,15 +5379,17 @@ Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
* Module-level functions. * Module-level functions.
*/ */
/* dump(obj, file, proto=0). */ /* dump(obj, file, protocol=0). */
static PyObject * 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; PyObject *ob, *file, *res = NULL;
Picklerobject *pickler = 0; Picklerobject *pickler = 0;
int proto = 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; goto finally;
if (!( pickler = newPicklerobject(file, proto))) if (!( pickler = newPicklerobject(file, proto)))
...@@ -5404,15 +5408,17 @@ cpm_dump(PyObject *self, PyObject *args) ...@@ -5404,15 +5408,17 @@ cpm_dump(PyObject *self, PyObject *args)
} }
/* dumps(obj, proto=0). */ /* dumps(obj, protocol=0). */
static PyObject * 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; PyObject *ob, *file = 0, *res = NULL;
Picklerobject *pickler = 0; Picklerobject *pickler = 0;
int proto = 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; goto finally;
if (!( file = PycStringIO->NewOutput(128))) if (!( file = PycStringIO->NewOutput(128)))
...@@ -5513,15 +5519,15 @@ static PyTypeObject Unpicklertype = { ...@@ -5513,15 +5519,15 @@ static PyTypeObject Unpicklertype = {
}; };
static struct PyMethodDef cPickle_methods[] = { static struct PyMethodDef cPickle_methods[] = {
{"dump", (PyCFunction)cpm_dump, METH_VARARGS, {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
PyDoc_STR("dump(object, file, proto=0) -- " PyDoc_STR("dump(obj, file, protocol=0) -- "
"Write an object in pickle format to the given file.\n" "Write an object in pickle format to the given file.\n"
"\n" "\n"
"See the Pickler docstring for the meaning of optional argument proto.") "See the Pickler docstring for the meaning of optional argument proto.")
}, },
{"dumps", (PyCFunction)cpm_dumps, METH_VARARGS, {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
PyDoc_STR("dumps(object, proto=0) -- " PyDoc_STR("dumps(obj, protocol=0) -- "
"Return a string containing an object in pickle format.\n" "Return a string containing an object in pickle format.\n"
"\n" "\n"
"See the Pickler docstring for the meaning of optional argument proto.") "See the Pickler docstring for the meaning of optional argument proto.")
...@@ -5533,8 +5539,8 @@ static struct PyMethodDef cPickle_methods[] = { ...@@ -5533,8 +5539,8 @@ static struct PyMethodDef cPickle_methods[] = {
{"loads", (PyCFunction)cpm_loads, METH_VARARGS, {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
PyDoc_STR("loads(string) -- Load a pickle from the given string")}, PyDoc_STR("loads(string) -- Load a pickle from the given string")},
{"Pickler", (PyCFunction)get_Pickler, METH_VARARGS, {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n" PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
"\n" "\n"
"This takes a file-like object for writing a pickle data stream.\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" "The optional proto argument tells the pickler to use the given\n"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment