Fix string normalization sometimes producing invalid fstrings (#327)

This commit is contained in:
Zsolt Dollenstein 2018-06-09 21:30:49 +02:00 committed by Łukasz Langa
parent aad62d3de8
commit 5d0a469e8e
3 changed files with 28 additions and 1 deletions

View File

@ -807,6 +807,11 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md).
## Change Log
### 18.6b3
* fixed improper formatting of f-strings with quotes inside interpolated
expressions (#322)
### 18.6b2
* added `--config` (#65)

View File

@ -2549,6 +2549,12 @@ def normalize_string_quotes(leaf: Leaf) -> None:
leaf.value = f"{prefix}{orig_quote}{body}{orig_quote}"
new_body = sub_twice(escaped_orig_quote, rf"\1\2{orig_quote}", new_body)
new_body = sub_twice(unescaped_new_quote, rf"\1\\{new_quote}", new_body)
if "f" in prefix.casefold():
matches = re.findall(r"[^{]\{(.*?)\}[^}]", new_body)
for m in matches:
if "\\" in str(m):
# Do not introduce backslashes in interpolated expressions
return
if new_quote == '"""' and new_body[-1:] == '"':
# edge case:
new_body = new_body[:-1] + '\\"'

View File

@ -1,5 +1,21 @@
f"f-string without formatted values is just a string"
f"{{NOT a formatted value}}"
f"{{NOT 'a' \"formatted\" \"value\"}}"
f"some f-string with {a} {few():.2f} {formatted.values!r}"
f"{f'{nested} inner'} outer"
f'some f-string with {a} {few(""):.2f} {formatted.values!r}'
f"{f'''{'nested'} inner'''} outer"
f"\"{f'{nested} inner'}\" outer"
f"space between opening braces: { {a for a in (1, 2, 3)}}"
f'Hello \'{tricky + "example"}\''
# output
f"f-string without formatted values is just a string"
f"{{NOT a formatted value}}"
f'{{NOT \'a\' "formatted" "value"}}'
f"some f-string with {a} {few():.2f} {formatted.values!r}"
f'some f-string with {a} {few(""):.2f} {formatted.values!r}'
f"{f'''{'nested'} inner'''} outer"
f"\"{f'{nested} inner'}\" outer"
f"space between opening braces: { {a for a in (1, 2, 3)}}"
f'Hello \'{tricky + "example"}\''