From a873690d2c027cdd1683a9b8fd013563f9b150c8 Mon Sep 17 00:00:00 2001 From: Eli Bendersky Date: Sat, 5 Jan 2013 06:26:39 -0800 Subject: [PATCH] The get() and iter() are now able to accept keyword arguments. In conformance with the documentation and the Python version. Patch by Franck Michea. --- Lib/test/test_xml_etree.py | 10 ++++++++++ Misc/ACKS | 1 + Modules/_elementtree.c | 21 +++++++++++++-------- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 2bbf513e9f3..89138450e99 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1769,6 +1769,11 @@ class BasicElementTest(unittest.TestCase): self.assertEqual(flag, True) self.assertEqual(wref(), None) + def test_get_keyword_args(self): + e1 = ET.Element('foo' , x=1, y=2, z=3) + self.assertEqual(e1.get('x', default=7), 1) + self.assertEqual(e1.get('w', default=7), 7) + def test_pickle(self): # For now this test only works for the Python version of ET, # so set sys.modules accordingly because pickle uses __import__ @@ -1897,6 +1902,11 @@ class ElementIterTest(unittest.TestCase): self.assertEqual(self._ilist(doc, 'room'), ['room'] * 3) self.assertEqual(self._ilist(doc, 'house'), ['house'] * 2) + # test that iter also accepts 'tag' as a keyword arg + self.assertEqual( + summarize_list(doc.iter(tag='room')), + ['room'] * 3) + # make sure both tag=None and tag='*' return all tags all_tags = ['document', 'house', 'room', 'room', 'shed', 'house', 'room'] diff --git a/Misc/ACKS b/Misc/ACKS index 8dbdc4dc208..714b807e241 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -794,6 +794,7 @@ Piotr Meyer Alexis Métaireau Steven Miale Trent Mick +Franck Michea Tom Middleton Stan Mihai Stefan Mihaila diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 0c8abcf9010..9f302f916b0 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1031,13 +1031,16 @@ element_iterfind(ElementObject *self, PyObject *args, PyObject *kwds) } static PyObject* -element_get(ElementObject* self, PyObject* args) +element_get(ElementObject* self, PyObject* args, PyObject* kwds) { PyObject* value; + static char* kwlist[] = {"key", "default", 0}; PyObject* key; PyObject* default_value = Py_None; - if (!PyArg_ParseTuple(args, "O|O:get", &key, &default_value)) + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:get", kwlist, &key, + &default_value)) return NULL; if (!self->extra || self->extra->attrib == Py_None) @@ -1085,10 +1088,12 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext); static PyObject * -element_iter(ElementObject *self, PyObject *args) +element_iter(ElementObject *self, PyObject *args, PyObject *kwds) { PyObject* tag = Py_None; - if (!PyArg_ParseTuple(args, "|O:iter", &tag)) + static char* kwlist[] = {"tag", 0}; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:iter", kwlist, &tag)) return NULL; return create_elementiter(self, tag, 0); @@ -1555,7 +1560,7 @@ static PyMethodDef element_methods[] = { {"clear", (PyCFunction) element_clearmethod, METH_VARARGS}, - {"get", (PyCFunction) element_get, METH_VARARGS}, + {"get", (PyCFunction) element_get, METH_VARARGS | METH_KEYWORDS}, {"set", (PyCFunction) element_set, METH_VARARGS}, {"find", (PyCFunction) element_find, METH_VARARGS | METH_KEYWORDS}, @@ -1567,11 +1572,11 @@ static PyMethodDef element_methods[] = { {"insert", (PyCFunction) element_insert, METH_VARARGS}, {"remove", (PyCFunction) element_remove, METH_VARARGS}, - {"iter", (PyCFunction) element_iter, METH_VARARGS}, + {"iter", (PyCFunction) element_iter, METH_VARARGS | METH_KEYWORDS}, {"itertext", (PyCFunction) element_itertext, METH_VARARGS}, {"iterfind", (PyCFunction) element_iterfind, METH_VARARGS | METH_KEYWORDS}, - {"getiterator", (PyCFunction) element_iter, METH_VARARGS}, + {"getiterator", (PyCFunction) element_iter, METH_VARARGS | METH_KEYWORDS}, {"getchildren", (PyCFunction) element_getchildren, METH_VARARGS}, {"items", (PyCFunction) element_items, METH_VARARGS}, @@ -3461,7 +3466,7 @@ static PyTypeObject XMLParser_Type = { /* python module interface */ static PyMethodDef _functions[] = { - {"SubElement", (PyCFunction) subelement, METH_VARARGS|METH_KEYWORDS}, + {"SubElement", (PyCFunction) subelement, METH_VARARGS | METH_KEYWORDS}, {NULL, NULL} };