Skip to content

Commit

Permalink
gh-102856: Allow comments inside multi-line f-string expresions (#104006
Browse files Browse the repository at this point in the history
)
  • Loading branch information
cmaureir authored May 22, 2023
1 parent 9bc80da commit 0a77960
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 7 deletions.
41 changes: 38 additions & 3 deletions Lib/test/test_fstring.py
Original file line number Diff line number Diff line change
Expand Up @@ -661,15 +661,50 @@ def test_comments(self):
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
Expand Down
4 changes: 0 additions & 4 deletions Parser/tokenizer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 0a77960

Please sign in to comment.