summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2004-07-27 05:22:33 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2004-07-27 05:22:33 (GMT)
commit544f1195b113688008e23d86f8ee5a5a8537645f (patch)
treec5e30d3e85ae6b106a558774f0de7262fcaf26f9
parent7b9190b8fc416f97c17ca6461dd73967813516c7 (diff)
downloadcpython-544f1195b113688008e23d86f8ee5a5a8537645f.zip
cpython-544f1195b113688008e23d86f8ee5a5a8537645f.tar.gz
cpython-544f1195b113688008e23d86f8ee5a5a8537645f.tar.bz2
Patch #995766: Keyword argument support in cPickle.
-rw-r--r--Lib/test/pickletester.py10
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/cPickle.c36
3 files changed, 33 insertions, 15 deletions
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 6e6d97d..85e1dea 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -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):
diff --git a/Misc/NEWS b/Misc/NEWS
index a7b0f1d..289754d 100644
--- 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
-------
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index e5e20cb..dc98772 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -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"