(original) (raw)

changeset: 95252:4d5826fa77a1 user: Serhiy Storchaka storchaka@gmail.com date: Mon Mar 30 01:01:48 2015 +0300 files: Lib/csv.py Lib/sre_parse.py Lib/test/test_re.py Misc/NEWS Modules/_sre.c description: Issue #14260: The groupindex attribute of regular expression pattern object now is non-modifiable mapping. diff -r 09f22b5d6cea -r 4d5826fa77a1 Lib/csv.py --- a/Lib/csv.py Sun Mar 29 17:09:21 2015 -0400 +++ b/Lib/csv.py Mon Mar 30 01:01:48 2015 +0300 @@ -231,20 +231,21 @@ quotes = {} delims = {} spaces = 0 + groupindex = regexp.groupindex for m in matches: - n = regexp.groupindex['quote'] - 1 + n = groupindex['quote'] - 1 key = m[n] if key: quotes[key] = quotes.get(key, 0) + 1 try: - n = regexp.groupindex['delim'] - 1 + n = groupindex['delim'] - 1 key = m[n] except KeyError: continue if key and (delimiters is None or key in delimiters): delims[key] = delims.get(key, 0) + 1 try: - n = regexp.groupindex['space'] - 1 + n = groupindex['space'] - 1 except KeyError: continue if m[n]: diff -r 09f22b5d6cea -r 4d5826fa77a1 Lib/sre_parse.py --- a/Lib/sre_parse.py Sun Mar 29 17:09:21 2015 -0400 +++ b/Lib/sre_parse.py Mon Mar 30 01:01:48 2015 +0300 @@ -855,6 +855,7 @@ del literal[:] groups.append((len(literals), index)) literals.append(None) + groupindex = pattern.groupindex while True: this = sget() if this is None: @@ -869,7 +870,7 @@ name = s.getuntil(">") if name.isidentifier(): try: - index = pattern.groupindex[name] + index = groupindex[name] except KeyError: raise IndexError("unknown group name %r" % name) else: diff -r 09f22b5d6cea -r 4d5826fa77a1 Lib/test/test_re.py --- a/Lib/test/test_re.py Sun Mar 29 17:09:21 2015 -0400 +++ b/Lib/test/test_re.py Mon Mar 30 01:01:48 2015 +0300 @@ -577,6 +577,14 @@ self.assertEqual(re.match("(a)", "a").regs, ((0, 1), (0, 1))) self.assertTrue(re.match("(a)", "a").re) + # Issue 14260. groupindex should be non-modifiable mapping. + p = re.compile(r'(?i)(?Pa)(?Pb)') + self.assertEqual(sorted(p.groupindex), ['first', 'other']) + self.assertEqual(p.groupindex['other'], 2) + with self.assertRaises(TypeError): + p.groupindex['other'] = 0 + self.assertEqual(p.groupindex['other'], 2) + def test_special_escapes(self): self.assertEqual(re.search(r"\b(b.)\b", "abcd abc bcd bx").group(1), "bx") diff -r 09f22b5d6cea -r 4d5826fa77a1 Misc/NEWS --- a/Misc/NEWS Sun Mar 29 17:09:21 2015 -0400 +++ b/Misc/NEWS Mon Mar 30 01:01:48 2015 +0300 @@ -30,6 +30,9 @@ Library ------- +- Issue #14260: The groupindex attribute of regular expression pattern object + now is non-modifiable mapping. + - Issue #23792: Ignore KeyboardInterrupt when the pydoc pager is active. This mimics the behavior of the standard unix pagers, and prevents pipepager from shutting down while the pager itself is still running. diff -r 09f22b5d6cea -r 4d5826fa77a1 Modules/_sre.c --- a/Modules/_sre.c Sun Mar 29 17:09:21 2015 -0400 +++ b/Modules/_sre.c Mon Mar 30 01:01:48 2015 +0300 @@ -1384,12 +1384,24 @@ {NULL, NULL} }; +/* PatternObject's 'groupindex' method. */ +static PyObject * +pattern_groupindex(PatternObject *self) +{ + return PyDictProxy_New(self->groupindex); +} + +static PyGetSetDef pattern_getset[] = { + {"groupindex", (getter)pattern_groupindex, (setter)NULL, + "A dictionary mapping group names to group numbers."}, + {NULL} /* Sentinel */ +}; + #define PAT_OFF(x) offsetof(PatternObject, x) static PyMemberDef pattern_members[] = { {"pattern", T_OBJECT, PAT_OFF(pattern), READONLY}, {"flags", T_INT, PAT_OFF(flags), READONLY}, {"groups", T_PYSSIZET, PAT_OFF(groups), READONLY}, - {"groupindex", T_OBJECT, PAT_OFF(groupindex), READONLY}, {NULL} /* Sentinel */ }; @@ -1422,6 +1434,7 @@ 0, /* tp_iternext */ pattern_methods, /* tp_methods */ pattern_members, /* tp_members */ + pattern_getset, /* tp_getset */ }; static int _validate(PatternObject *self); /* Forward *//storchaka@gmail.com