Patch #995766: Keyword argument support in cPickle.

This commit is contained in:
Martin v. Löwis 2004-07-27 05:22:33 +00:00
parent 7b9190b8fc
commit 544f1195b1
3 changed files with 33 additions and 15 deletions

View 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):

View File

@ -41,6 +41,8 @@ Core and builtins
Extension modules
-----------------
- cpickle now supports the same keyword arguments as pickle.
Library
-------

View 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"