PEP 498 says: (https://www.python.org/dev/peps/pep-0498/#escape-sequences) Scanning an f-string for expressions happens after escape sequences are decoded. Because hex(ord('{')) == 0x7b , the f-string f'\u007b4*10}' is decoded to f'{4*10}' , which evaluates as the integer 40: >>> f'\u007b4*10}' '40' However, in python3.6.0b3, the '{' from '\u007b4' does not start an expression, making the remaining '}' invalid: >>> f'\u007b4*10}' File "", line 1 SyntaxError: f-string: single '}' is not allowed There's even a test case for it: (Lib/test/test_fstring.py:383) def test_no_escapes_for_braces(self): # \x7b is '{'. Make sure it doesn't start an expression. self.assertEqual(f'\x7b2}}', '{2}') self.assertEqual(f'\x7b2', '{2') self.assertEqual(f'\u007b2', '{2') self.assertEqual(f'\N{LEFT CURLY BRACKET}2\N{RIGHT CURLY BRACKET}', '{2}')
The reason that those test_no_escapes_for_braces assertions pass is because they're only dealing with opening curly braces and in an f-string, they're treated as literal opening braces. In the example you've given, the error occurs when the f-string handler encounters the closing curly brace without an opening one. It's the same as if you had written: >>> f'{{4*10}' SyntaxError: f-string: single '}' is not allowed I will add a test to capture this specific case (backslash-escaped unicode opening bracken).
New changeset 1d8b8a67b657 by Jason R. Coombs in branch '3.6': Additionally show that a backslash-escaped opening brace is treated as a literal and thus triggers the single closing brace error, clarifying #28590. https://hg.python.org/cpython/rev/1d8b8a67b657