diff options
author | Pablo Galindo Salgado <Pablogsal@gmail.com> | 2023-10-05 14:26:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-05 14:26:44 +0100 |
commit | cc389ef627b2a486ab89d9a11245bef48224efb1 (patch) | |
tree | f6d4d943438d07fc3d37b905a921cd3f3fd2c3d0 /Lib/ast.py | |
parent | af29282fce117cb10f00907fd46d56c2fa6142f5 (diff) | |
download | cpython-cc389ef627b2a486ab89d9a11245bef48224efb1.tar.gz cpython-cc389ef627b2a486ab89d9a11245bef48224efb1.zip |
gh-110259: Fix f-strings with multiline expressions and format specs (#110271)
Signed-off-by: Pablo Galindo <pablogsal@gmail.com>
Diffstat (limited to 'Lib/ast.py')
-rw-r--r-- | Lib/ast.py | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/Lib/ast.py b/Lib/ast.py index 1f54309c845..f7888d18859 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -1270,13 +1270,15 @@ class _Unparser(NodeVisitor): quote_type = quote_types[0] self.write(f"{quote_type}{value}{quote_type}") - def _write_fstring_inner(self, node): + def _write_fstring_inner(self, node, scape_newlines=False): if isinstance(node, JoinedStr): # for both the f-string itself, and format_spec for value in node.values: - self._write_fstring_inner(value) + self._write_fstring_inner(value, scape_newlines=scape_newlines) elif isinstance(node, Constant) and isinstance(node.value, str): value = node.value.replace("{", "{{").replace("}", "}}") + if scape_newlines: + value = value.replace("\n", "\\n") self.write(value) elif isinstance(node, FormattedValue): self.visit_FormattedValue(node) @@ -1299,7 +1301,10 @@ class _Unparser(NodeVisitor): self.write(f"!{chr(node.conversion)}") if node.format_spec: self.write(":") - self._write_fstring_inner(node.format_spec) + self._write_fstring_inner( + node.format_spec, + scape_newlines=True + ) def visit_Name(self, node): self.write(node.id) |