mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
gh-108843: fix ast.unparse for f-string with many quotes (#108981)
This commit is contained in:
parent
4dd47c63a9
commit
23f9f6f464
3 changed files with 35 additions and 1 deletions
21
Lib/ast.py
21
Lib/ast.py
|
@ -1236,17 +1236,36 @@ class _Unparser(NodeVisitor):
|
|||
|
||||
new_fstring_parts = []
|
||||
quote_types = list(_ALL_QUOTES)
|
||||
fallback_to_repr = False
|
||||
for value, is_constant in fstring_parts:
|
||||
if is_constant:
|
||||
value, quote_types = self._str_literal_helper(
|
||||
value, new_quote_types = self._str_literal_helper(
|
||||
value,
|
||||
quote_types=quote_types,
|
||||
escape_special_whitespace=True,
|
||||
)
|
||||
if set(new_quote_types).isdisjoint(quote_types):
|
||||
fallback_to_repr = True
|
||||
break
|
||||
quote_types = new_quote_types
|
||||
elif "\n" in value:
|
||||
quote_types = [q for q in quote_types if q in _MULTI_QUOTES]
|
||||
assert quote_types
|
||||
new_fstring_parts.append(value)
|
||||
|
||||
if fallback_to_repr:
|
||||
# If we weren't able to find a quote type that works for all parts
|
||||
# of the JoinedStr, fallback to using repr and triple single quotes.
|
||||
quote_types = ["'''"]
|
||||
new_fstring_parts.clear()
|
||||
for value, is_constant in fstring_parts:
|
||||
if is_constant:
|
||||
value = repr('"' + value) # force repr to use single quotes
|
||||
expected_prefix = "'\""
|
||||
assert value.startswith(expected_prefix), repr(value)
|
||||
value = value[len(expected_prefix):-1]
|
||||
new_fstring_parts.append(value)
|
||||
|
||||
value = "".join(new_fstring_parts)
|
||||
quote_type = quote_types[0]
|
||||
self.write(f"{quote_type}{value}{quote_type}")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue