From e4e931a67e49cf3c61263dc94fb0806c34f972cd Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Sat, 15 May 2021 15:55:53 +0300 Subject: bpo-44081: improve ast.unparse() for lambdas with no parameters (GH-26000) --- Lib/ast.py | 13 ++++++++----- Lib/test/test_unparse.py | 11 +++++++++++ .../next/Library/2021-05-09-03-26-31.bpo-44081.A-Mrto.rst | 2 ++ 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-05-09-03-26-31.bpo-44081.A-Mrto.rst diff --git a/Lib/ast.py b/Lib/ast.py index 18163d6..0aef172 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 534431b..4d3340e 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 0000000..e4a09e3 --- /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. -- cgit v0.12