mirror of https://github.com/python/cpython
gh-102856: Allow comments inside multi-line f-string expresions (#104006)
This commit is contained in:
parent
9bc80dac47
commit
0a7796052a
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue