mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
gh-56166: Deprecate passing confusing positional arguments in re functions (#107778)
Deprecate passing optional arguments maxsplit, count and flags in module-level functions re.split(), re.sub() and re.subn() as positional. They should only be passed by keyword.
This commit is contained in:
parent
fb8fe377c4
commit
882cb79afa
5 changed files with 155 additions and 21 deletions
|
@ -127,8 +127,10 @@ class ReTests(unittest.TestCase):
|
|||
self.assertEqual(re.sub("(?i)b+", "x", "bbbb BBBB"), 'x x')
|
||||
self.assertEqual(re.sub(r'\d+', self.bump_num, '08.2 -2 23x99y'),
|
||||
'9.3 -3 24x100y')
|
||||
self.assertEqual(re.sub(r'\d+', self.bump_num, '08.2 -2 23x99y', 3),
|
||||
'9.3 -3 23x99y')
|
||||
with self.assertWarns(DeprecationWarning) as w:
|
||||
self.assertEqual(re.sub(r'\d+', self.bump_num, '08.2 -2 23x99y', 3),
|
||||
'9.3 -3 23x99y')
|
||||
self.assertEqual(w.filename, __file__)
|
||||
self.assertEqual(re.sub(r'\d+', self.bump_num, '08.2 -2 23x99y', count=3),
|
||||
'9.3 -3 23x99y')
|
||||
|
||||
|
@ -235,9 +237,42 @@ class ReTests(unittest.TestCase):
|
|||
|
||||
def test_qualified_re_sub(self):
|
||||
self.assertEqual(re.sub('a', 'b', 'aaaaa'), 'bbbbb')
|
||||
self.assertEqual(re.sub('a', 'b', 'aaaaa', 1), 'baaaa')
|
||||
with self.assertWarns(DeprecationWarning) as w:
|
||||
self.assertEqual(re.sub('a', 'b', 'aaaaa', 1), 'baaaa')
|
||||
self.assertEqual(w.filename, __file__)
|
||||
self.assertEqual(re.sub('a', 'b', 'aaaaa', count=1), 'baaaa')
|
||||
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"sub\(\) got multiple values for argument 'count'"):
|
||||
re.sub('a', 'b', 'aaaaa', 1, count=1)
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"sub\(\) got multiple values for argument 'flags'"):
|
||||
re.sub('a', 'b', 'aaaaa', 1, 0, flags=0)
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"sub\(\) takes from 3 to 5 positional arguments but 6 "
|
||||
r"were given"):
|
||||
re.sub('a', 'b', 'aaaaa', 1, 0, 0)
|
||||
|
||||
def test_misuse_flags(self):
|
||||
with self.assertWarns(DeprecationWarning) as w:
|
||||
result = re.sub('a', 'b', 'aaaaa', re.I)
|
||||
self.assertEqual(result, re.sub('a', 'b', 'aaaaa', count=int(re.I)))
|
||||
self.assertEqual(str(w.warning),
|
||||
"'count' is passed as positional argument")
|
||||
self.assertEqual(w.filename, __file__)
|
||||
with self.assertWarns(DeprecationWarning) as w:
|
||||
result = re.subn("b*", "x", "xyz", re.I)
|
||||
self.assertEqual(result, re.subn("b*", "x", "xyz", count=int(re.I)))
|
||||
self.assertEqual(str(w.warning),
|
||||
"'count' is passed as positional argument")
|
||||
self.assertEqual(w.filename, __file__)
|
||||
with self.assertWarns(DeprecationWarning) as w:
|
||||
result = re.split(":", ":a:b::c", re.I)
|
||||
self.assertEqual(result, re.split(":", ":a:b::c", maxsplit=int(re.I)))
|
||||
self.assertEqual(str(w.warning),
|
||||
"'maxsplit' is passed as positional argument")
|
||||
self.assertEqual(w.filename, __file__)
|
||||
|
||||
def test_bug_114660(self):
|
||||
self.assertEqual(re.sub(r'(\S)\s+(\S)', r'\1 \2', 'hello there'),
|
||||
'hello there')
|
||||
|
@ -344,9 +379,22 @@ class ReTests(unittest.TestCase):
|
|||
self.assertEqual(re.subn("b+", "x", "bbbb BBBB"), ('x BBBB', 1))
|
||||
self.assertEqual(re.subn("b+", "x", "xyz"), ('xyz', 0))
|
||||
self.assertEqual(re.subn("b*", "x", "xyz"), ('xxxyxzx', 4))
|
||||
self.assertEqual(re.subn("b*", "x", "xyz", 2), ('xxxyz', 2))
|
||||
with self.assertWarns(DeprecationWarning) as w:
|
||||
self.assertEqual(re.subn("b*", "x", "xyz", 2), ('xxxyz', 2))
|
||||
self.assertEqual(w.filename, __file__)
|
||||
self.assertEqual(re.subn("b*", "x", "xyz", count=2), ('xxxyz', 2))
|
||||
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"subn\(\) got multiple values for argument 'count'"):
|
||||
re.subn('a', 'b', 'aaaaa', 1, count=1)
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"subn\(\) got multiple values for argument 'flags'"):
|
||||
re.subn('a', 'b', 'aaaaa', 1, 0, flags=0)
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"subn\(\) takes from 3 to 5 positional arguments but 6 "
|
||||
r"were given"):
|
||||
re.subn('a', 'b', 'aaaaa', 1, 0, 0)
|
||||
|
||||
def test_re_split(self):
|
||||
for string in ":a:b::c", S(":a:b::c"):
|
||||
self.assertTypedEqual(re.split(":", string),
|
||||
|
@ -401,7 +449,9 @@ class ReTests(unittest.TestCase):
|
|||
self.assertTypedEqual(re.split(sep, ':a:b::c'), expected)
|
||||
|
||||
def test_qualified_re_split(self):
|
||||
self.assertEqual(re.split(":", ":a:b::c", 2), ['', 'a', 'b::c'])
|
||||
with self.assertWarns(DeprecationWarning) as w:
|
||||
self.assertEqual(re.split(":", ":a:b::c", 2), ['', 'a', 'b::c'])
|
||||
self.assertEqual(w.filename, __file__)
|
||||
self.assertEqual(re.split(":", ":a:b::c", maxsplit=2), ['', 'a', 'b::c'])
|
||||
self.assertEqual(re.split(':', 'a:b:c:d', maxsplit=2), ['a', 'b', 'c:d'])
|
||||
self.assertEqual(re.split("(:)", ":a:b::c", maxsplit=2),
|
||||
|
@ -411,6 +461,17 @@ class ReTests(unittest.TestCase):
|
|||
self.assertEqual(re.split("(:*)", ":a:b::c", maxsplit=2),
|
||||
['', ':', '', '', 'a:b::c'])
|
||||
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"split\(\) got multiple values for argument 'maxsplit'"):
|
||||
re.split(":", ":a:b::c", 2, maxsplit=2)
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"split\(\) got multiple values for argument 'flags'"):
|
||||
re.split(":", ":a:b::c", 2, 0, flags=0)
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
r"split\(\) takes from 2 to 4 positional arguments but 5 "
|
||||
r"were given"):
|
||||
re.split(":", ":a:b::c", 2, 0, 0)
|
||||
|
||||
def test_re_findall(self):
|
||||
self.assertEqual(re.findall(":+", "abc"), [])
|
||||
for string in "a:b::c:::d", S("a:b::c:::d"):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue