diff --git a/Lib/ast.py b/Lib/ast.py index 93ffa1edc84d55..2719f6ff7ac593 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 d04db4d5f46e1a..d33f32e2a7fe93 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 00000000000000..62f1d8998d4e55 --- /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]``).