[Python-checkins] gh-105687: Remove deprecated objects from `re` module (#105688)
vstinner
webhook-mailer at python.org
Wed Jun 14 06:26:45 EDT 2023
https://github.com/python/cpython/commit/67f69dba0a2adc68c631bad5d970bdd22fc05d91
commit: 67f69dba0a2adc68c631bad5d970bdd22fc05d91
branch: main
author: Nikita Sobolev <mail at sobolevn.me>
committer: vstinner <vstinner at python.org>
date: 2023-06-14T12:26:20+02:00
summary:
gh-105687: Remove deprecated objects from `re` module (#105688)
files:
A Misc/NEWS.d/next/Library/2023-06-12-15-17-34.gh-issue-105687.ZUonKm.rst
M Doc/whatsnew/3.13.rst
M Lib/re/__init__.py
M Lib/re/_compiler.py
M Lib/re/_constants.py
M Lib/re/_parser.py
M Lib/test/test_re.py
M Modules/_sre/sre.c
M Modules/_sre/sre_constants.h
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index 97bc1587d5052..78d2a7b6b294d 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -340,6 +340,10 @@ Removed
attribute instead.
(Contributed by Nikita Sobolev in :gh:`105546`.)
+* Remove undocumented, never working, and deprecated ``re.template`` function
+ and ``re.TEMPLATE`` flag (and ``re.T`` alias).
+ (Contributed by Serhiy Storchaka and Nikita Sobolev in :gh:`105687`.)
+
Porting to Python 3.13
======================
diff --git a/Lib/re/__init__.py b/Lib/re/__init__.py
index 4515650a721ac..d6fccd5bc97cc 100644
--- a/Lib/re/__init__.py
+++ b/Lib/re/__init__.py
@@ -130,7 +130,7 @@
# public symbols
__all__ = [
"match", "fullmatch", "search", "sub", "subn", "split",
- "findall", "finditer", "compile", "purge", "template", "escape",
+ "findall", "finditer", "compile", "purge", "escape",
"error", "Pattern", "Match", "A", "I", "L", "M", "S", "X", "U",
"ASCII", "IGNORECASE", "LOCALE", "MULTILINE", "DOTALL", "VERBOSE",
"UNICODE", "NOFLAG", "RegexFlag",
@@ -150,7 +150,6 @@ class RegexFlag:
DOTALL = S = _compiler.SRE_FLAG_DOTALL # make dot match newline
VERBOSE = X = _compiler.SRE_FLAG_VERBOSE # ignore whitespace and comments
# sre extensions (experimental, don't rely on these)
- TEMPLATE = T = _compiler.SRE_FLAG_TEMPLATE # unknown purpose, deprecated
DEBUG = _compiler.SRE_FLAG_DEBUG # dump pattern after compilation
__str__ = object.__str__
_numeric_repr_ = hex
@@ -233,17 +232,6 @@ def purge():
_cache2.clear()
_compile_template.cache_clear()
-def template(pattern, flags=0):
- "Compile a template pattern, returning a Pattern object, deprecated"
- import warnings
- warnings.warn("The re.template() function is deprecated "
- "as it is an undocumented function "
- "without an obvious purpose. "
- "Use re.compile() instead.",
- DeprecationWarning)
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning) # warn just once
- return _compile(pattern, flags|T)
# SPECIAL_CHARS
# closing ')', '}' and ']'
@@ -297,13 +285,6 @@ def _compile(pattern, flags):
return pattern
if not _compiler.isstring(pattern):
raise TypeError("first argument must be string or compiled pattern")
- if flags & T:
- import warnings
- warnings.warn("The re.TEMPLATE/re.T flag is deprecated "
- "as it is an undocumented flag "
- "without an obvious purpose. "
- "Don't use it.",
- DeprecationWarning)
p = _compiler.compile(pattern, flags)
if flags & DEBUG:
return p
diff --git a/Lib/re/_compiler.py b/Lib/re/_compiler.py
index d8e0d2fdefdcc..d0a4c55caf6e4 100644
--- a/Lib/re/_compiler.py
+++ b/Lib/re/_compiler.py
@@ -101,8 +101,6 @@ def _compile(code, pattern, flags):
else:
emit(ANY)
elif op in REPEATING_CODES:
- if flags & SRE_FLAG_TEMPLATE:
- raise error("internal: unsupported template operator %r" % (op,))
if _simple(av[2]):
emit(REPEATING_CODES[op][2])
skip = _len(code); emit(0)
diff --git a/Lib/re/_constants.py b/Lib/re/_constants.py
index d8718d36075aa..d8e483ac4f23b 100644
--- a/Lib/re/_constants.py
+++ b/Lib/re/_constants.py
@@ -13,7 +13,7 @@
# update when constants are added or removed
-MAGIC = 20221023
+MAGIC = 20230612
from _sre import MAXREPEAT, MAXGROUPS
@@ -204,7 +204,6 @@ def _makecodes(*names):
}
# flags
-SRE_FLAG_TEMPLATE = 1 # template mode (unknown purpose, deprecated)
SRE_FLAG_IGNORECASE = 2 # case insensitive
SRE_FLAG_LOCALE = 4 # honour system locale
SRE_FLAG_MULTILINE = 8 # treat target as multiline string
diff --git a/Lib/re/_parser.py b/Lib/re/_parser.py
index 5709acb626723..6c8a4eccc0e0b 100644
--- a/Lib/re/_parser.py
+++ b/Lib/re/_parser.py
@@ -61,12 +61,11 @@
"x": SRE_FLAG_VERBOSE,
# extensions
"a": SRE_FLAG_ASCII,
- "t": SRE_FLAG_TEMPLATE,
"u": SRE_FLAG_UNICODE,
}
TYPE_FLAGS = SRE_FLAG_ASCII | SRE_FLAG_LOCALE | SRE_FLAG_UNICODE
-GLOBAL_FLAGS = SRE_FLAG_DEBUG | SRE_FLAG_TEMPLATE
+GLOBAL_FLAGS = SRE_FLAG_DEBUG
class State:
# keeps track of state for parsing
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index d1575dc2c3478..e4d14356402db 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -2398,30 +2398,6 @@ def test_bug_gh91616(self):
self.assertTrue(re.fullmatch(r'(?s:(?>.*?\.).*)\Z', "a.txt")) # reproducer
self.assertTrue(re.fullmatch(r'(?s:(?=(?P<g0>.*?\.))(?P=g0).*)\Z', "a.txt"))
- def test_template_function_and_flag_is_deprecated(self):
- with self.assertWarns(DeprecationWarning) as cm:
- template_re1 = re.template(r'a')
- self.assertIn('re.template()', str(cm.warning))
- self.assertIn('is deprecated', str(cm.warning))
- self.assertIn('function', str(cm.warning))
- self.assertNotIn('flag', str(cm.warning))
-
- with self.assertWarns(DeprecationWarning) as cm:
- # we deliberately use more flags here to test that that still
- # triggers the warning
- # if paranoid, we could test multiple different combinations,
- # but it's probably not worth it
- template_re2 = re.compile(r'a', flags=re.TEMPLATE|re.UNICODE)
- self.assertIn('re.TEMPLATE', str(cm.warning))
- self.assertIn('is deprecated', str(cm.warning))
- self.assertIn('flag', str(cm.warning))
- self.assertNotIn('function', str(cm.warning))
-
- # while deprecated, is should still function
- self.assertEqual(template_re1, template_re2)
- self.assertTrue(template_re1.match('ahoy'))
- self.assertFalse(template_re1.match('nope'))
-
@unittest.skipIf(multiprocessing is None, 'test requires multiprocessing')
def test_regression_gh94675(self):
pattern = re.compile(r'(?<=[({}])(((//[^\n]*)?[\n])([\000-\040])*)*'
@@ -2615,11 +2591,11 @@ def test_flags_repr(self):
"re.IGNORECASE|re.DOTALL|re.VERBOSE|0x100000")
self.assertEqual(
repr(~re.I),
- "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DOTALL|re.VERBOSE|re.TEMPLATE|re.DEBUG")
+ "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DOTALL|re.VERBOSE|re.DEBUG|0x1")
self.assertEqual(repr(~(re.I|re.S|re.X)),
- "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.TEMPLATE|re.DEBUG")
+ "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DEBUG|0x1")
self.assertEqual(repr(~(re.I|re.S|re.X|(1<<20))),
- "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.TEMPLATE|re.DEBUG|0xffe00")
+ "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DEBUG|0xffe01")
class ImplementationTest(unittest.TestCase):
diff --git a/Misc/NEWS.d/next/Library/2023-06-12-15-17-34.gh-issue-105687.ZUonKm.rst b/Misc/NEWS.d/next/Library/2023-06-12-15-17-34.gh-issue-105687.ZUonKm.rst
new file mode 100644
index 0000000000000..7966d3a566414
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-06-12-15-17-34.gh-issue-105687.ZUonKm.rst
@@ -0,0 +1,2 @@
+Remove deprecated ``re.template``, ``re.T``, ``re.TEMPLATE``,
+``sre_constans.SRE_FLAG_TEMPLATE``.
diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c
index e89e4c7797149..328e4be2fb5e4 100644
--- a/Modules/_sre/sre.c
+++ b/Modules/_sre/sre.c
@@ -1335,7 +1335,6 @@ pattern_repr(PatternObject *obj)
const char *name;
int value;
} flag_names[] = {
- {"re.TEMPLATE", SRE_FLAG_TEMPLATE},
{"re.IGNORECASE", SRE_FLAG_IGNORECASE},
{"re.LOCALE", SRE_FLAG_LOCALE},
{"re.MULTILINE", SRE_FLAG_MULTILINE},
diff --git a/Modules/_sre/sre_constants.h b/Modules/_sre/sre_constants.h
index b5692292f6528..bd611b3361450 100644
--- a/Modules/_sre/sre_constants.h
+++ b/Modules/_sre/sre_constants.h
@@ -11,7 +11,7 @@
* See the sre.c file for information on usage and redistribution.
*/
-#define SRE_MAGIC 20221023
+#define SRE_MAGIC 20230612
#define SRE_OP_FAILURE 0
#define SRE_OP_SUCCESS 1
#define SRE_OP_ANY 2
@@ -85,7 +85,6 @@
#define SRE_CATEGORY_UNI_NOT_WORD 15
#define SRE_CATEGORY_UNI_LINEBREAK 16
#define SRE_CATEGORY_UNI_NOT_LINEBREAK 17
-#define SRE_FLAG_TEMPLATE 1
#define SRE_FLAG_IGNORECASE 2
#define SRE_FLAG_LOCALE 4
#define SRE_FLAG_MULTILINE 8
More information about the Python-checkins
mailing list