diff options
author | Anthony Shaw <anthony.p.shaw@gmail.com> | 2023-09-06 06:01:23 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-05 21:01:23 +0100 |
commit | 2c4c26c4ce4bb94200ff3c9b5a0f4c75eed96f31 (patch) | |
tree | e4a529b5474595651ee8a002952ccb542c533e65 /Lib/ast.py | |
parent | 9bf350b0662fcf1a8b43b9293e6c8ecf3c711561 (diff) | |
download | cpython-2c4c26c4ce4bb94200ff3c9b5a0f4c75eed96f31.tar.gz cpython-2c4c26c4ce4bb94200ff3c9b5a0f4c75eed96f31.zip |
gh-108469: Update ast.unparse for unescaped quote support from PEP701 [3.12] (#108553)
Co-authored-by: sunmy2019 <59365878+sunmy2019@users.noreply.github.com>
Diffstat (limited to 'Lib/ast.py')
-rw-r--r-- | Lib/ast.py | 31 |
1 files changed, 10 insertions, 21 deletions
diff --git a/Lib/ast.py b/Lib/ast.py index 45b95963f81..17ec7ff6f8b 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -1225,17 +1225,7 @@ class _Unparser(NodeVisitor): def visit_JoinedStr(self, node): self.write("f") - if self._avoid_backslashes: - with self.buffered() as buffer: - self._write_fstring_inner(node) - return self._write_str_avoiding_backslashes("".join(buffer)) - - # If we don't need to avoid backslashes globally (i.e., we only need - # to avoid them inside FormattedValues), it's cosmetically preferred - # to use escaped whitespace. That is, it's preferred to use backslashes - # for cases like: f"{x}\n". To accomplish this, we keep track of what - # in our buffer corresponds to FormattedValues and what corresponds to - # Constant parts of the f-string, and allow escapes accordingly. + fstring_parts = [] for value in node.values: with self.buffered() as buffer: @@ -1247,11 +1237,14 @@ class _Unparser(NodeVisitor): new_fstring_parts = [] quote_types = list(_ALL_QUOTES) for value, is_constant in fstring_parts: - value, quote_types = self._str_literal_helper( - value, - quote_types=quote_types, - escape_special_whitespace=is_constant, - ) + if is_constant: + value, quote_types = self._str_literal_helper( + value, + quote_types=quote_types, + escape_special_whitespace=True, + ) + elif "\n" in value: + quote_types = [q for q in quote_types if q in _MULTI_QUOTES] new_fstring_parts.append(value) value = "".join(new_fstring_parts) @@ -1273,16 +1266,12 @@ class _Unparser(NodeVisitor): def visit_FormattedValue(self, node): def unparse_inner(inner): - unparser = type(self)(_avoid_backslashes=True) + unparser = type(self)() unparser.set_precedence(_Precedence.TEST.next(), inner) return unparser.visit(inner) with self.delimit("{", "}"): expr = unparse_inner(node.value) - if "\\" in expr: - raise ValueError( - "Unable to avoid backslash in f-string expression part" - ) if expr.startswith("{"): # Separate pair of opening brackets as "{ {" self.write(" ") |