summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2022-11-03 16:53:25 (GMT)
committerGitHub <noreply@github.com>2022-11-03 16:53:25 (GMT)
commita60ddd31be7ff96a8189e7483bf1eb2071d2bddf (patch)
tree61eacd702c4ecec19d1b7a4133e2916be9c955e4 /Lib
parent916af11a976ca2faf0a8a77b0aaf71893e549cfe (diff)
downloadcpython-a60ddd31be7ff96a8189e7483bf1eb2071d2bddf.zip
cpython-a60ddd31be7ff96a8189e7483bf1eb2071d2bddf.tar.gz
cpython-a60ddd31be7ff96a8189e7483bf1eb2071d2bddf.tar.bz2
gh-98401: Invalid escape sequences emits SyntaxWarning (#99011)
A backslash-character pair that is not a valid escape sequence now generates a SyntaxWarning, instead of DeprecationWarning. For example, re.compile("\d+\.\d+") now emits a SyntaxWarning ("\d" is an invalid escape sequence), use raw strings for regular expression: re.compile(r"\d+\.\d+"). In a future Python version, SyntaxError will eventually be raised, instead of SyntaxWarning. Octal escapes with value larger than 0o377 (ex: "\477"), deprecated in Python 3.11, now produce a SyntaxWarning, instead of DeprecationWarning. In a future Python version they will be eventually a SyntaxError. codecs.escape_decode() and codecs.unicode_escape_decode() are left unchanged: they still emit DeprecationWarning. * The parser only emits SyntaxWarning for Python 3.12 (feature version), and still emits DeprecationWarning on older Python versions. * Fix SyntaxWarning by using raw strings in Tools/c-analyzer/ and wasm_build.py.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_codeop.py10
-rw-r--r--Lib/test/test_fstring.py2
-rw-r--r--Lib/test/test_string_literals.py24
3 files changed, 18 insertions, 18 deletions
diff --git a/Lib/test/test_codeop.py b/Lib/test/test_codeop.py
index 133096d..d7b51be 100644
--- a/Lib/test/test_codeop.py
+++ b/Lib/test/test_codeop.py
@@ -310,8 +310,8 @@ class CodeopTests(unittest.TestCase):
def test_warning(self):
# Test that the warning is only returned once.
with warnings_helper.check_warnings(
- (".*literal", SyntaxWarning),
- (".*invalid", DeprecationWarning),
+ ('"is" with a literal', SyntaxWarning),
+ ("invalid escape sequence", SyntaxWarning),
) as w:
compile_command(r"'\e' is 0")
self.assertEqual(len(w.warnings), 2)
@@ -321,9 +321,9 @@ class CodeopTests(unittest.TestCase):
warnings.simplefilter('error', SyntaxWarning)
compile_command('1 is 1', symbol='exec')
- # Check DeprecationWarning treated as an SyntaxError
+ # Check SyntaxWarning treated as an SyntaxError
with warnings.catch_warnings(), self.assertRaises(SyntaxError):
- warnings.simplefilter('error', DeprecationWarning)
+ warnings.simplefilter('error', SyntaxWarning)
compile_command(r"'\e'", symbol='exec')
def test_incomplete_warning(self):
@@ -337,7 +337,7 @@ class CodeopTests(unittest.TestCase):
warnings.simplefilter('always')
self.assertInvalid("'\\e' 1")
self.assertEqual(len(w), 1)
- self.assertEqual(w[0].category, DeprecationWarning)
+ self.assertEqual(w[0].category, SyntaxWarning)
self.assertRegex(str(w[0].message), 'invalid escape sequence')
self.assertEqual(w[0].filename, '<input>')
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py
index bf3a5b0..318f38a 100644
--- a/Lib/test/test_fstring.py
+++ b/Lib/test/test_fstring.py
@@ -776,7 +776,7 @@ x = (
self.assertEqual(f'2\x203', '2 3')
self.assertEqual(f'\x203', ' 3')
- with self.assertWarns(DeprecationWarning): # invalid escape sequence
+ with self.assertWarns(SyntaxWarning): # invalid escape sequence
value = eval(r"f'\{6*7}'")
self.assertEqual(value, '\\42')
self.assertEqual(f'\\{6*7}', '\\42')
diff --git a/Lib/test/test_string_literals.py b/Lib/test/test_string_literals.py
index 7247b7e..9b663c0 100644
--- a/Lib/test/test_string_literals.py
+++ b/Lib/test/test_string_literals.py
@@ -109,11 +109,11 @@ class TestLiterals(unittest.TestCase):
for b in range(1, 128):
if b in b"""\n\r"'01234567NU\\abfnrtuvx""":
continue
- with self.assertWarns(DeprecationWarning):
+ with self.assertWarns(SyntaxWarning):
self.assertEqual(eval(r"'\%c'" % b), '\\' + chr(b))
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter('always', category=DeprecationWarning)
+ warnings.simplefilter('always', category=SyntaxWarning)
eval("'''\n\\z'''")
self.assertEqual(len(w), 1)
self.assertEqual(str(w[0].message), r"invalid escape sequence '\z'")
@@ -121,7 +121,7 @@ class TestLiterals(unittest.TestCase):
self.assertEqual(w[0].lineno, 1)
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter('error', category=DeprecationWarning)
+ warnings.simplefilter('error', category=SyntaxWarning)
with self.assertRaises(SyntaxError) as cm:
eval("'''\n\\z'''")
exc = cm.exception
@@ -133,11 +133,11 @@ class TestLiterals(unittest.TestCase):
def test_eval_str_invalid_octal_escape(self):
for i in range(0o400, 0o1000):
- with self.assertWarns(DeprecationWarning):
+ with self.assertWarns(SyntaxWarning):
self.assertEqual(eval(r"'\%o'" % i), chr(i))
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter('always', category=DeprecationWarning)
+ warnings.simplefilter('always', category=SyntaxWarning)
eval("'''\n\\407'''")
self.assertEqual(len(w), 1)
self.assertEqual(str(w[0].message),
@@ -146,7 +146,7 @@ class TestLiterals(unittest.TestCase):
self.assertEqual(w[0].lineno, 1)
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter('error', category=DeprecationWarning)
+ warnings.simplefilter('error', category=SyntaxWarning)
with self.assertRaises(SyntaxError) as cm:
eval("'''\n\\407'''")
exc = cm.exception
@@ -186,11 +186,11 @@ class TestLiterals(unittest.TestCase):
for b in range(1, 128):
if b in b"""\n\r"'01234567\\abfnrtvx""":
continue
- with self.assertWarns(DeprecationWarning):
+ with self.assertWarns(SyntaxWarning):
self.assertEqual(eval(r"b'\%c'" % b), b'\\' + bytes([b]))
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter('always', category=DeprecationWarning)
+ warnings.simplefilter('always', category=SyntaxWarning)
eval("b'''\n\\z'''")
self.assertEqual(len(w), 1)
self.assertEqual(str(w[0].message), r"invalid escape sequence '\z'")
@@ -198,7 +198,7 @@ class TestLiterals(unittest.TestCase):
self.assertEqual(w[0].lineno, 1)
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter('error', category=DeprecationWarning)
+ warnings.simplefilter('error', category=SyntaxWarning)
with self.assertRaises(SyntaxError) as cm:
eval("b'''\n\\z'''")
exc = cm.exception
@@ -209,11 +209,11 @@ class TestLiterals(unittest.TestCase):
def test_eval_bytes_invalid_octal_escape(self):
for i in range(0o400, 0o1000):
- with self.assertWarns(DeprecationWarning):
+ with self.assertWarns(SyntaxWarning):
self.assertEqual(eval(r"b'\%o'" % i), bytes([i & 0o377]))
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter('always', category=DeprecationWarning)
+ warnings.simplefilter('always', category=SyntaxWarning)
eval("b'''\n\\407'''")
self.assertEqual(len(w), 1)
self.assertEqual(str(w[0].message),
@@ -222,7 +222,7 @@ class TestLiterals(unittest.TestCase):
self.assertEqual(w[0].lineno, 1)
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter('error', category=DeprecationWarning)
+ warnings.simplefilter('error', category=SyntaxWarning)
with self.assertRaises(SyntaxError) as cm:
eval("b'''\n\\407'''")
exc = cm.exception