[Python-checkins] bpo-39889: Fix ast.unparse() for subscript. (GH-18824)

Serhiy Storchaka webhook-mailer at python.org
Sat Mar 7 10:25:39 EST 2020


https://github.com/python/cpython/commit/c4928fc1a853f3f84e2b4ec1253d0349137745e5
commit: c4928fc1a853f3f84e2b4ec1253d0349137745e5
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020-03-07T17:25:32+02:00
summary:

bpo-39889: Fix ast.unparse() for subscript. (GH-18824)

files:
A Misc/NEWS.d/next/Library/2020-03-07-16-44-51.bpo-39889.3RYqeX.rst
M Lib/ast.py
M Lib/test/test_unparse.py

diff --git a/Lib/ast.py b/Lib/ast.py
index 93ffa1edc84d5..2719f6ff7ac59 100644
--- a/Lib/ast.py
+++ b/Lib/ast.py
@@ -1261,7 +1261,17 @@ def visit_Subscript(self, node):
         self.set_precedence(_Precedence.ATOM, node.value)
         self.traverse(node.value)
         with self.delimit("[", "]"):
-            self.traverse(node.slice)
+            if (isinstance(node.slice, Index)
+                    and isinstance(node.slice.value, Tuple)
+                    and node.slice.value.elts):
+                if len(node.slice.value.elts) == 1:
+                    elt = node.slice.value.elts[0]
+                    self.traverse(elt)
+                    self.write(",")
+                else:
+                    self.interleave(lambda: self.write(", "), self.traverse, node.slice.value.elts)
+            else:
+                self.traverse(node.slice)
 
     def visit_Starred(self, node):
         self.write("*")
@@ -1286,7 +1296,12 @@ def visit_Slice(self, node):
             self.traverse(node.step)
 
     def visit_ExtSlice(self, node):
-        self.interleave(lambda: self.write(", "), self.traverse, node.dims)
+        if len(node.dims) == 1:
+            elt = node.dims[0]
+            self.traverse(elt)
+            self.write(",")
+        else:
+            self.interleave(lambda: self.write(", "), self.traverse, node.dims)
 
     def visit_arg(self, node):
         self.write(node.arg)
diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py
index d04db4d5f46e1..d33f32e2a7fe9 100644
--- a/Lib/test/test_unparse.py
+++ b/Lib/test/test_unparse.py
@@ -344,6 +344,20 @@ def test_simple_expressions_parens(self):
         self.check_src_roundtrip("call((yield x))")
         self.check_src_roundtrip("return x + (yield x)")
 
+    def test_subscript(self):
+        self.check_src_roundtrip("a[i]")
+        self.check_src_roundtrip("a[i,]")
+        self.check_src_roundtrip("a[i, j]")
+        self.check_src_roundtrip("a[()]")
+        self.check_src_roundtrip("a[i:j]")
+        self.check_src_roundtrip("a[:j]")
+        self.check_src_roundtrip("a[i:]")
+        self.check_src_roundtrip("a[i:j:k]")
+        self.check_src_roundtrip("a[:j:k]")
+        self.check_src_roundtrip("a[i::k]")
+        self.check_src_roundtrip("a[i:j,]")
+        self.check_src_roundtrip("a[i:j, k]")
+
     def test_docstrings(self):
         docstrings = (
             '"""simple doc string"""',
diff --git a/Misc/NEWS.d/next/Library/2020-03-07-16-44-51.bpo-39889.3RYqeX.rst b/Misc/NEWS.d/next/Library/2020-03-07-16-44-51.bpo-39889.3RYqeX.rst
new file mode 100644
index 0000000000000..62f1d8998d4e5
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-03-07-16-44-51.bpo-39889.3RYqeX.rst
@@ -0,0 +1,3 @@
+Fixed :func:`ast.unparse` for extended slices containing a single element
+(e.g. ``a[i:j,]``). Remove redundant tuples when index with a tuple (e.g.
+``a[i, j]``).



More information about the Python-checkins mailing list