summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBatuhan Taskaya <isidentical@gmail.com>2021-05-15 12:55:53 (GMT)
committerGitHub <noreply@github.com>2021-05-15 12:55:53 (GMT)
commite4e931a67e49cf3c61263dc94fb0806c34f972cd (patch)
tree0ee2654289c0e1607123e8b17f52f857581c1352
parent4aa63d65a9971d14f1a2131b989dca0dab514a9d (diff)
downloadcpython-e4e931a67e49cf3c61263dc94fb0806c34f972cd.zip
cpython-e4e931a67e49cf3c61263dc94fb0806c34f972cd.tar.gz
cpython-e4e931a67e49cf3c61263dc94fb0806c34f972cd.tar.bz2
bpo-44081: improve ast.unparse() for lambdas with no parameters (GH-26000)
-rw-r--r--Lib/ast.py13
-rw-r--r--Lib/test/test_unparse.py11
-rw-r--r--Misc/NEWS.d/next/Library/2021-05-09-03-26-31.bpo-44081.A-Mrto.rst2
3 files changed, 21 insertions, 5 deletions
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.