diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2004-07-27 05:22:33 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2004-07-27 05:22:33 (GMT) |
commit | 544f1195b113688008e23d86f8ee5a5a8537645f (patch) | |
tree | c5e30d3e85ae6b106a558774f0de7262fcaf26f9 | |
parent | 7b9190b8fc416f97c17ca6461dd73967813516c7 (diff) | |
download | cpython-544f1195b113688008e23d86f8ee5a5a8537645f.zip cpython-544f1195b113688008e23d86f8ee5a5a8537645f.tar.gz cpython-544f1195b113688008e23d86f8ee5a5a8537645f.tar.bz2 |
Patch #995766: Keyword argument support in cPickle.
-rw-r--r-- | Lib/test/pickletester.py | 10 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/cPickle.c | 36 |
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): @@ -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" |