Skip to content

Commit 493bf1c

Browse files
authored
bpo-38870: Don't start generated output with newlines in ast.unparse (GH-19636)
1 parent 3dd2157 commit 493bf1c

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

Lib/ast.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -669,10 +669,16 @@ def items_view(self, traverser, items):
669669
else:
670670
self.interleave(lambda: self.write(", "), traverser, items)
671671

672+
def maybe_newline(self):
673+
"""Adds a newline if it isn't the start of generated source"""
674+
if self._source:
675+
self.write("\n")
676+
672677
def fill(self, text=""):
673678
"""Indent a piece of text and append it, according to the current
674679
indentation level"""
675-
self.write("\n" + " " * self._indent + text)
680+
self.maybe_newline()
681+
self.write(" " * self._indent + text)
676682

677683
def write(self, text):
678684
"""Append a piece of text"""
@@ -916,7 +922,7 @@ def visit_ExceptHandler(self, node):
916922
self.traverse(node.body)
917923

918924
def visit_ClassDef(self, node):
919-
self.write("\n")
925+
self.maybe_newline()
920926
for deco in node.decorator_list:
921927
self.fill("@")
922928
self.traverse(deco)
@@ -946,7 +952,7 @@ def visit_AsyncFunctionDef(self, node):
946952
self._function_helper(node, "async def")
947953

948954
def _function_helper(self, node, fill_suffix):
949-
self.write("\n")
955+
self.maybe_newline()
950956
for deco in node.decorator_list:
951957
self.fill("@")
952958
self.traverse(deco)
@@ -1043,7 +1049,7 @@ def _fstring_FormattedValue(self, node, write):
10431049
write("{")
10441050
unparser = type(self)()
10451051
unparser.set_precedence(_Precedence.TEST.next(), node.value)
1046-
expr = unparser.visit(node.value).rstrip("\n")
1052+
expr = unparser.visit(node.value)
10471053
if expr.startswith("{"):
10481054
write(" ") # Separate pair of opening brackets as "{ {"
10491055
write(expr)

Lib/test/test_unparse.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,17 @@ def check_ast_roundtrip(self, code1, **kwargs):
128128
def check_invalid(self, node, raises=ValueError):
129129
self.assertRaises(raises, ast.unparse, node)
130130

131-
def get_source(self, code1, code2=None, strip=True):
131+
def get_source(self, code1, code2=None):
132132
code2 = code2 or code1
133133
code1 = ast.unparse(ast.parse(code1))
134-
if strip:
135-
code1 = code1.strip()
136134
return code1, code2
137135

138-
def check_src_roundtrip(self, code1, code2=None, strip=True):
139-
code1, code2 = self.get_source(code1, code2, strip)
136+
def check_src_roundtrip(self, code1, code2=None):
137+
code1, code2 = self.get_source(code1, code2)
140138
self.assertEqual(code2, code1)
141139

142-
def check_src_dont_roundtrip(self, code1, code2=None, strip=True):
143-
code1, code2 = self.get_source(code1, code2, strip)
140+
def check_src_dont_roundtrip(self, code1, code2=None):
141+
code1, code2 = self.get_source(code1, code2)
144142
self.assertNotEqual(code2, code1)
145143

146144
class UnparseTestCase(ASTTestCase):

0 commit comments

Comments
 (0)