summaryrefslogtreecommitdiffstats
path: root/Lib/re/__init__.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-08-16 20:35:35 (GMT)
committerGitHub <noreply@github.com>2023-08-16 20:35:35 (GMT)
commit882cb79afa2cb11b180ef699fd5cf038e72f6c85 (patch)
tree5ceb212dacf1ba5529aabb9ad5ac2791e8446db2 /Lib/re/__init__.py
parentfb8fe377c4ddaea24ea6aa0a8f5d036986373d39 (diff)
downloadcpython-882cb79afa2cb11b180ef699fd5cf038e72f6c85.zip
cpython-882cb79afa2cb11b180ef699fd5cf038e72f6c85.tar.gz
cpython-882cb79afa2cb11b180ef699fd5cf038e72f6c85.tar.bz2
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.
Diffstat (limited to 'Lib/re/__init__.py')
-rw-r--r--Lib/re/__init__.py67
1 files changed, 64 insertions, 3 deletions
diff --git a/Lib/re/__init__.py b/Lib/re/__init__.py
index d6fccd5..428d1b0 100644
--- a/Lib/re/__init__.py
+++ b/Lib/re/__init__.py
@@ -175,16 +175,39 @@ def search(pattern, string, flags=0):
a Match object, or None if no match was found."""
return _compile(pattern, flags).search(string)
-def sub(pattern, repl, string, count=0, flags=0):
+class _ZeroSentinel(int):
+ pass
+_zero_sentinel = _ZeroSentinel()
+
+def sub(pattern, repl, string, *args, count=_zero_sentinel, flags=_zero_sentinel):
"""Return the string obtained by replacing the leftmost
non-overlapping occurrences of the pattern in string by the
replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is
a callable, it's passed the Match object and must return
a replacement string to be used."""
+ if args:
+ if count is not _zero_sentinel:
+ raise TypeError("sub() got multiple values for argument 'count'")
+ count, *args = args
+ if args:
+ if flags is not _zero_sentinel:
+ raise TypeError("sub() got multiple values for argument 'flags'")
+ flags, *args = args
+ if args:
+ raise TypeError("sub() takes from 3 to 5 positional arguments "
+ "but %d were given" % (5 + len(args)))
+
+ import warnings
+ warnings.warn(
+ "'count' is passed as positional argument",
+ DeprecationWarning, stacklevel=2
+ )
+
return _compile(pattern, flags).sub(repl, string, count)
+sub.__text_signature__ = '(pattern, repl, string, count=0, flags=0)'
-def subn(pattern, repl, string, count=0, flags=0):
+def subn(pattern, repl, string, *args, count=_zero_sentinel, flags=_zero_sentinel):
"""Return a 2-tuple containing (new_string, number).
new_string is the string obtained by replacing the leftmost
non-overlapping occurrences of the pattern in the source
@@ -193,9 +216,28 @@ def subn(pattern, repl, string, count=0, flags=0):
callable; if a string, backslash escapes in it are processed.
If it is a callable, it's passed the Match object and must
return a replacement string to be used."""
+ if args:
+ if count is not _zero_sentinel:
+ raise TypeError("subn() got multiple values for argument 'count'")
+ count, *args = args
+ if args:
+ if flags is not _zero_sentinel:
+ raise TypeError("subn() got multiple values for argument 'flags'")
+ flags, *args = args
+ if args:
+ raise TypeError("subn() takes from 3 to 5 positional arguments "
+ "but %d were given" % (5 + len(args)))
+
+ import warnings
+ warnings.warn(
+ "'count' is passed as positional argument",
+ DeprecationWarning, stacklevel=2
+ )
+
return _compile(pattern, flags).subn(repl, string, count)
+subn.__text_signature__ = '(pattern, repl, string, count=0, flags=0)'
-def split(pattern, string, maxsplit=0, flags=0):
+def split(pattern, string, *args, maxsplit=_zero_sentinel, flags=_zero_sentinel):
"""Split the source string by the occurrences of the pattern,
returning a list containing the resulting substrings. If
capturing parentheses are used in pattern, then the text of all
@@ -203,7 +245,26 @@ def split(pattern, string, maxsplit=0, flags=0):
list. If maxsplit is nonzero, at most maxsplit splits occur,
and the remainder of the string is returned as the final element
of the list."""
+ if args:
+ if maxsplit is not _zero_sentinel:
+ raise TypeError("split() got multiple values for argument 'maxsplit'")
+ maxsplit, *args = args
+ if args:
+ if flags is not _zero_sentinel:
+ raise TypeError("split() got multiple values for argument 'flags'")
+ flags, *args = args
+ if args:
+ raise TypeError("split() takes from 2 to 4 positional arguments "
+ "but %d were given" % (4 + len(args)))
+
+ import warnings
+ warnings.warn(
+ "'maxsplit' is passed as positional argument",
+ DeprecationWarning, stacklevel=2
+ )
+
return _compile(pattern, flags).split(string, maxsplit)
+split.__text_signature__ = '(pattern, string, maxsplit=0, flags=0)'
def findall(pattern, string, flags=0):
"""Return a list of all non-overlapping matches in the string.