Skip to content

Commit e577ff4

Browse files
authored
[3.12] gh-129093: Fix f-string debug text sometimes getting cut off when expression contains ! (#129164)
1 parent b849a1b commit e577ff4

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

Lib/test/test_fstring.py

+18
Original file line numberDiff line numberDiff line change
@@ -1875,6 +1875,24 @@ def test_syntax_warning_infinite_recursion_in_file(self):
18751875
self.assertIn(rb"\1", stdout)
18761876
self.assertEqual(len(stderr.strip().splitlines()), 2)
18771877

1878+
def test_gh129093(self):
1879+
self.assertEqual(f'{1==2=}', '1==2=False')
1880+
self.assertEqual(f'{1 == 2=}', '1 == 2=False')
1881+
self.assertEqual(f'{1!=2=}', '1!=2=True')
1882+
self.assertEqual(f'{1 != 2=}', '1 != 2=True')
1883+
1884+
self.assertEqual(f'{(1) != 2=}', '(1) != 2=True')
1885+
self.assertEqual(f'{(1*2) != (3)=}', '(1*2) != (3)=True')
1886+
1887+
self.assertEqual(f'{1 != 2 == 3 != 4=}', '1 != 2 == 3 != 4=False')
1888+
self.assertEqual(f'{1 == 2 != 3 == 4=}', '1 == 2 != 3 == 4=False')
1889+
1890+
self.assertEqual(f'{f'{1==2=}'=}', "f'{1==2=}'='1==2=False'")
1891+
self.assertEqual(f'{f'{1 == 2=}'=}', "f'{1 == 2=}'='1 == 2=False'")
1892+
self.assertEqual(f'{f'{1!=2=}'=}', "f'{1!=2=}'='1!=2=True'")
1893+
self.assertEqual(f'{f'{1 != 2=}'=}', "f'{1 != 2=}'='1 != 2=True'")
1894+
18781895

18791896
if __name__ == "__main__":
1897+
18801898
unittest.main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix f-strings such as ``f'{expr=}'`` sometimes not displaying the full
2+
expression when the expression contains ``!=``.

Parser/tokenizer.c

+1-3
Original file line numberDiff line numberDiff line change
@@ -480,9 +480,7 @@ static int update_fstring_expr(struct tok_state *tok, char cur) {
480480
case '}':
481481
case '!':
482482
case ':':
483-
if (tok_mode->last_expr_end == -1) {
484-
tok_mode->last_expr_end = strlen(tok->start);
485-
}
483+
tok_mode->last_expr_end = strlen(tok->start);
486484
break;
487485
default:
488486
Py_UNREACHABLE();

0 commit comments

Comments
 (0)