gh-102856: Allow comments inside multi-line f-string expresions (#104006)

This commit is contained in:
Cristián Maureira-Fredes 2023-05-22 12:30:07 +02:00 committed by GitHub
parent 9bc80dac47
commit 0a7796052a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 7 deletions

View File

@ -661,15 +661,50 @@ x = (
self.assertEqual(f'{"#"}', '#')
self.assertEqual(f'{d["#"]}', 'hash')
self.assertAllRaise(SyntaxError, "f-string expression part cannot include '#'",
["f'{1#}'", # error because the expression becomes "(1#)"
"f'{3(#)}'",
self.assertAllRaise(SyntaxError, "'{' was never closed",
["f'{1#}'", # error because everything after '#' is a comment
"f'{#}'",
"f'one: {1#}'",
"f'{1# one} {2 this is a comment still#}'",
])
self.assertAllRaise(SyntaxError, r"f-string: unmatched '\)'",
["f'{)#}'", # When wrapped in parens, this becomes
# '()#)'. Make sure that doesn't compile.
])
self.assertEqual(f'''A complex trick: {
2 # two
}''', 'A complex trick: 2')
self.assertEqual(f'''
{
40 # fourty
+ # plus
2 # two
}''', '\n42')
self.assertEqual(f'''
{
40 # fourty
+ # plus
2 # two
}''', '\n42')
self.assertEqual(f'''
# this is not a comment
{ # the following operation it's
3 # this is a number
* 2}''', '\n# this is not a comment\n6')
self.assertEqual(f'''
{# f'a {comment}'
86 # constant
# nothing more
}''', '\n86')
self.assertAllRaise(SyntaxError, r"f-string: valid expression required before '}'",
["""f'''
{
# only a comment
}'''
""", # this is equivalent to f'{}'
])
def test_many_expressions(self):
# Create a string with many expressions in it. Note that

View File

@ -1818,10 +1818,6 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
/* Skip comment, unless it's a type comment */
if (c == '#') {
if (INSIDE_FSTRING(tok)) {
return MAKE_TOKEN(syntaxerror(tok, "f-string expression part cannot include '#'"));
}
const char* p = NULL;
const char *prefix, *type_start;
int current_starting_col_offset;