kopia lustrzana https://github.com/micropython/micropython
py/lexer: Wrap in parenthesis all f-string arguments passed to format.
This is important for literal tuples, e.g. f"{a,b,}, {c}" --> "{}".format((a,b), (c),) which would otherwise result in either a syntax error or the wrong result. Fixes issue #9635. This work was funded through GitHub Sponsors. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>pull/9678/head
rodzic
5c4153ea37
commit
fb8792c095
|
@ -356,6 +356,9 @@ STATIC void parse_string_literal(mp_lexer_t *lex, bool is_raw, bool is_fstring)
|
||||||
vstr_add_byte(&lex->vstr, '{');
|
vstr_add_byte(&lex->vstr, '{');
|
||||||
next_char(lex);
|
next_char(lex);
|
||||||
} else {
|
} else {
|
||||||
|
// wrap each argument in (), e.g.
|
||||||
|
// f"{a,b,}, {c}" --> "{}".format((a,b), (c),)
|
||||||
|
vstr_add_byte(&lex->fstring_args, '(');
|
||||||
// remember the start of this argument (if we need it for f'{a=}').
|
// remember the start of this argument (if we need it for f'{a=}').
|
||||||
size_t i = lex->fstring_args.len;
|
size_t i = lex->fstring_args.len;
|
||||||
// extract characters inside the { until we reach the
|
// extract characters inside the { until we reach the
|
||||||
|
@ -382,7 +385,9 @@ STATIC void parse_string_literal(mp_lexer_t *lex, bool is_raw, bool is_fstring)
|
||||||
// remove the trailing '='
|
// remove the trailing '='
|
||||||
lex->fstring_args.len--;
|
lex->fstring_args.len--;
|
||||||
}
|
}
|
||||||
// comma-separate args
|
// close the paren-wrapped arg to .format().
|
||||||
|
vstr_add_byte(&lex->fstring_args, ')');
|
||||||
|
// comma-separate args to .format().
|
||||||
vstr_add_byte(&lex->fstring_args, ',');
|
vstr_add_byte(&lex->fstring_args, ',');
|
||||||
}
|
}
|
||||||
vstr_add_byte(&lex->vstr, '{');
|
vstr_add_byte(&lex->vstr, '{');
|
||||||
|
|
|
@ -56,3 +56,8 @@ try:
|
||||||
except (ValueError, SyntaxError):
|
except (ValueError, SyntaxError):
|
||||||
# MicroPython incorrectly raises ValueError here.
|
# MicroPython incorrectly raises ValueError here.
|
||||||
print('SyntaxError')
|
print('SyntaxError')
|
||||||
|
|
||||||
|
# Allow literal tuples
|
||||||
|
print(f"a {1,} b")
|
||||||
|
print(f"a {x,y,} b")
|
||||||
|
print(f"a {x,1} b")
|
||||||
|
|
|
@ -21,3 +21,7 @@ print(f"a {x=:08x} b {y} c")
|
||||||
|
|
||||||
print(f'a {f() + g("foo") + h()=} b')
|
print(f'a {f() + g("foo") + h()=} b')
|
||||||
print(f'a {f() + g("foo") + h()=:08x} b')
|
print(f'a {f() + g("foo") + h()=:08x} b')
|
||||||
|
|
||||||
|
print(f"a {1,=} b")
|
||||||
|
print(f"a {x,y,=} b")
|
||||||
|
print(f"a {x,1=} b")
|
||||||
|
|
|
@ -4,3 +4,6 @@ a x=1 b 2 c
|
||||||
a x=00000001 b 2 c
|
a x=00000001 b 2 c
|
||||||
a f() + g("foo") + h()=15 b
|
a f() + g("foo") + h()=15 b
|
||||||
a f() + g("foo") + h()=0000000f b
|
a f() + g("foo") + h()=0000000f b
|
||||||
|
a 1,=(1,) b
|
||||||
|
a x,y,=(1, 2) b
|
||||||
|
a x,1=(1, 1) b
|
||||||
|
|
Ładowanie…
Reference in New Issue