diff --git a/Lib/ast.py b/Lib/ast.py index 18163d6b7bd..0aef172516b 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -716,9 +716,9 @@ class _Unparser(NodeVisitor): self.maybe_newline() self.write(" " * self._indent + text) - def write(self, text): - """Append a piece of text""" - self._source.append(text) + def write(self, *text): + """Add new source parts""" + self._source.extend(text) @contextmanager def buffered(self, buffer = None): @@ -1566,8 +1566,11 @@ class _Unparser(NodeVisitor): def visit_Lambda(self, node): with self.require_parens(_Precedence.TEST, node): - self.write("lambda ") - self.traverse(node.args) + self.write("lambda") + with self.buffered() as buffer: + self.traverse(node.args) + if buffer: + self.write(" ", *buffer) self.write(": ") self.set_precedence(_Precedence.TEST, node.body) self.traverse(node.body) diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 534431bc969..4d3340e26ff 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -531,6 +531,17 @@ class CosmeticTestCase(ASTTestCase): self.check_src_roundtrip("a[1, 2]") self.check_src_roundtrip("a[(1, *a)]") + def test_lambda_parameters(self): + self.check_src_roundtrip("lambda: something") + self.check_src_roundtrip("four = lambda: 2 + 2") + self.check_src_roundtrip("lambda x: x * 2") + self.check_src_roundtrip("square = lambda n: n ** 2") + self.check_src_roundtrip("lambda x, y: x + y") + self.check_src_roundtrip("add = lambda x, y: x + y") + self.check_src_roundtrip("lambda x, y, /, z, q, *, u: None") + self.check_src_roundtrip("lambda x, *y, **z: None") + + class DirectoryTestCase(ASTTestCase): """Test roundtrip behaviour on all files in Lib and Lib/test.""" diff --git a/Misc/NEWS.d/next/Library/2021-05-09-03-26-31.bpo-44081.A-Mrto.rst b/Misc/NEWS.d/next/Library/2021-05-09-03-26-31.bpo-44081.A-Mrto.rst new file mode 100644 index 00000000000..e4a09e366bd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-05-09-03-26-31.bpo-44081.A-Mrto.rst @@ -0,0 +1,2 @@ +:func:`ast.unparse` now doesn't use redundant spaces to separate ``lambda`` +and the ``:`` if there are no parameters.