]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-105687: Remove deprecated objects from `re` module (#105688)
authorNikita Sobolev <mail@sobolevn.me>
Wed, 14 Jun 2023 10:26:20 +0000 (13:26 +0300)
committerGitHub <noreply@github.com>
Wed, 14 Jun 2023 10:26:20 +0000 (12:26 +0200)
Doc/whatsnew/3.13.rst
Lib/re/__init__.py
Lib/re/_compiler.py
Lib/re/_constants.py
Lib/re/_parser.py
Lib/test/test_re.py
Misc/NEWS.d/next/Library/2023-06-12-15-17-34.gh-issue-105687.ZUonKm.rst [new file with mode: 0644]
Modules/_sre/sre.c
Modules/_sre/sre_constants.h

index 97bc1587d5052af8470e9a274ececd3477d71876..78d2a7b6b294d4fc9d4b5b61f5dce87f9ecdec8a 100644 (file)
@@ -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
 ======================
index 4515650a721ac65e17187883c366d3a63468cfa7..d6fccd5bc97cc0450f890bcb384dcf286b827eca 100644 (file)
@@ -130,7 +130,7 @@ import _sre
 # 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
index d8e0d2fdefdccad7150fe369a673733a60754ca1..d0a4c55caf6e41ce83d6124cbb5bedff723bb915 100644 (file)
@@ -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)
index d8718d36075aac60e82491ff669ac5065da49c93..d8e483ac4f23b4b1883c5833342c54b268aa43a0 100644 (file)
@@ -13,7 +13,7 @@
 
 # update when constants are added or removed
 
-MAGIC = 20221023
+MAGIC = 20230612
 
 from _sre import MAXREPEAT, MAXGROUPS
 
@@ -204,7 +204,6 @@ CH_UNICODE = {
 }
 
 # 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
index 5709acb6267238ef0d9332bfef9dfab50bf69ffa..6c8a4eccc0e0bb207149db3c6f579f6a298d22f5 100644 (file)
@@ -61,12 +61,11 @@ FLAGS = {
     "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
index d1575dc2c347856ca5f0fea288d6d6351209d14e..e4d14356402db78d523a9e1d989a34c1a5d9626c 100644 (file)
@@ -2398,30 +2398,6 @@ class ReTests(unittest.TestCase):
         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 @@ class PatternReprTests(unittest.TestCase):
                          "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 (file)
index 0000000..7966d3a
--- /dev/null
@@ -0,0 +1,2 @@
+Remove deprecated ``re.template``, ``re.T``, ``re.TEMPLATE``,
+``sre_constans.SRE_FLAG_TEMPLATE``.
index e89e4c77971494b619ac6d7bdc3bc4b4967df4c0..328e4be2fb5e43ad2f267b600dc9e4f3a6eb762e 100644 (file)
@@ -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},
index b5692292f65280fd24d013ec5c5049a2667352a5..bd611b336145092bc2b07263a429f626abb43fef 100644 (file)
@@ -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