[3.12] gh-105938: Emit a SyntaxWarning for escaped braces in an f-string (GH-105939) (#105941)

(cherry picked from commit 6586cee27f)

Co-authored-by: Lysandros Nikolaou <lisandrosnik@gmail.com>
This commit is contained in:
Miss Islington (bot) 2023-06-20 06:09:48 -07:00 committed by GitHub
parent cc18a8b78a
commit fea0d2fbaa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 6 deletions

View file

@ -13,6 +13,7 @@ import re
import types
import decimal
import unittest
import warnings
from test import support
from test.support.os_helper import temp_cwd
from test.support.script_helper import assert_python_failure, assert_python_ok
@ -904,7 +905,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')
with self.assertWarns(SyntaxWarning): # invalid escape sequence
@ -1037,7 +1038,7 @@ x = (
]
for case, expected_result in deprecated_cases:
with self.subTest(case=case, expected_result=expected_result):
with self.assertWarns(DeprecationWarning):
with self.assertWarns(SyntaxWarning):
result = eval(case)
self.assertEqual(result, expected_result)
self.assertEqual(fr'\{{\}}', '\\{\\}')
@ -1046,6 +1047,12 @@ x = (
self.assertEqual(fr'\}}{1+1}', '\\}2')
self.assertEqual(fr'{1+1}\}}', '2\\}')
def test_fstring_backslash_before_double_bracket_warns_once(self):
with warnings.catch_warnings(record=True) as w:
eval(r"f'\{{'")
self.assertEqual(len(w), 1)
self.assertEqual(w[0].category, SyntaxWarning)
def test_fstring_backslash_prefix_raw(self):
self.assertEqual(f'\\', '\\')
self.assertEqual(f'\\\\', '\\\\')