From 7b3c975aafc40f09bfd0c39e42153c3a0d086fba Mon Sep 17 00:00:00 2001 From: Sean Reifschneider Date: Mon, 12 Mar 2012 18:22:38 -0600 Subject: [PATCH] closes #14259 re.finditer() now takes keyword arguments: pos, endpos. Contrary to the documentation, finditer() did not take pos and endpos keyword arguments. --- Lib/test/test_re.py | 20 ++++++++++++++++++++ Misc/NEWS | 3 +++ Modules/_sre.c | 16 +++++++++------- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 425c0eb1673..74a7b71f10e 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -652,6 +652,26 @@ class ReTests(unittest.TestCase): self.assertEqual([item.group(0) for item in iter], [":", "::", ":::"]) + pat = re.compile(r":+") + iter = pat.finditer("a:b::c:::d", 1, 10) + self.assertEqual([item.group(0) for item in iter], + [":", "::", ":::"]) + + pat = re.compile(r":+") + iter = pat.finditer("a:b::c:::d", pos=1, endpos=10) + self.assertEqual([item.group(0) for item in iter], + [":", "::", ":::"]) + + pat = re.compile(r":+") + iter = pat.finditer("a:b::c:::d", endpos=10, pos=1) + self.assertEqual([item.group(0) for item in iter], + [":", "::", ":::"]) + + pat = re.compile(r":+") + iter = pat.finditer("a:b::c:::d", pos=3, endpos=8) + self.assertEqual([item.group(0) for item in iter], + ["::", "::"]) + def test_bug_926075(self): self.assertTrue(re.compile('bug_926075') is not re.compile(b'bug_926075')) diff --git a/Misc/NEWS b/Misc/NEWS index 3fe824ffe56..7bbe890863c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -56,6 +56,9 @@ Extension Modules - Issue #14212: The re module didn't retain a reference to buffers it was scanning, resulting in segfaults. +- Issue #14259: The finditer() method of re objects did not take any + keyword arguments, contrary to the documentation. + What's New in Python 3.3.0 Alpha 1? =================================== diff --git a/Modules/_sre.c b/Modules/_sre.c index 92544808d39..cb1f791242b 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1596,7 +1596,7 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern) /* see sre.h for object declarations */ static PyObject*pattern_new_match(PatternObject*, SRE_STATE*, int); -static PyObject*pattern_scanner(PatternObject*, PyObject*); +static PyObject*pattern_scanner(PatternObject*, PyObject*, PyObject* kw); static int sre_literal_template(int charsize, char* ptr, Py_ssize_t len) @@ -2132,13 +2132,13 @@ error: #if PY_VERSION_HEX >= 0x02020000 static PyObject* -pattern_finditer(PatternObject* pattern, PyObject* args) +pattern_finditer(PatternObject* pattern, PyObject* args, PyObject* kw) { PyObject* scanner; PyObject* search; PyObject* iterator; - scanner = pattern_scanner(pattern, args); + scanner = pattern_scanner(pattern, args, kw); if (!scanner) return NULL; @@ -2576,10 +2576,10 @@ static PyMethodDef pattern_methods[] = { {"findall", (PyCFunction) pattern_findall, METH_VARARGS|METH_KEYWORDS, pattern_findall_doc}, #if PY_VERSION_HEX >= 0x02020000 - {"finditer", (PyCFunction) pattern_finditer, METH_VARARGS, + {"finditer", (PyCFunction) pattern_finditer, METH_VARARGS|METH_KEYWORDS, pattern_finditer_doc}, #endif - {"scanner", (PyCFunction) pattern_scanner, METH_VARARGS}, + {"scanner", (PyCFunction) pattern_scanner, METH_VARARGS|METH_KEYWORDS}, {"__copy__", (PyCFunction) pattern_copy, METH_NOARGS}, {"__deepcopy__", (PyCFunction) pattern_deepcopy, METH_O}, {NULL, NULL} @@ -3822,7 +3822,7 @@ static PyTypeObject Scanner_Type = { }; static PyObject* -pattern_scanner(PatternObject* pattern, PyObject* args) +pattern_scanner(PatternObject* pattern, PyObject* args, PyObject* kw) { /* create search state object */ @@ -3831,7 +3831,9 @@ pattern_scanner(PatternObject* pattern, PyObject* args) PyObject* string; Py_ssize_t start = 0; Py_ssize_t end = PY_SSIZE_T_MAX; - if (!PyArg_ParseTuple(args, "O|nn:scanner", &string, &start, &end)) + static char* kwlist[] = { "source", "pos", "endpos", NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:scanner", kwlist, + &string, &start, &end)) return NULL; /* create scanner object */