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>
This commit is contained in:
Jim Mussared
2022-10-19 11:30:28 +11:00
committed by Damien George
parent 5c4153ea37
commit fb8792c095
4 changed files with 18 additions and 1 deletions

View File

@@ -56,3 +56,8 @@ try:
except (ValueError, SyntaxError):
# MicroPython incorrectly raises ValueError here.
print('SyntaxError')
# Allow literal tuples
print(f"a {1,} b")
print(f"a {x,y,} b")
print(f"a {x,1} b")

View File

@@ -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()=:08x} b')
print(f"a {1,=} b")
print(f"a {x,y,=} b")
print(f"a {x,1=} b")

View File

@@ -4,3 +4,6 @@ a x=1 b 2 c
a x=00000001 b 2 c
a f() + g("foo") + h()=15 b
a f() + g("foo") + h()=0000000f b
a 1,=(1,) b
a x,y,=(1, 2) b
a x,1=(1, 1) b