aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/ast.py
diff options
context:
space:
mode:
authorPablo Galindo Salgado <Pablogsal@gmail.com>2023-10-05 14:26:44 +0100
committerGitHub <noreply@github.com>2023-10-05 14:26:44 +0100
commitcc389ef627b2a486ab89d9a11245bef48224efb1 (patch)
treef6d4d943438d07fc3d37b905a921cd3f3fd2c3d0 /Lib/ast.py
parentaf29282fce117cb10f00907fd46d56c2fa6142f5 (diff)
downloadcpython-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.py11
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)