Skip to content

Commit c4928fc

Browse files
bpo-39889: Fix ast.unparse() for subscript. (GH-18824)
1 parent 31350f9 commit c4928fc

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

Lib/ast.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,7 +1261,17 @@ def visit_Subscript(self, node):
12611261
self.set_precedence(_Precedence.ATOM, node.value)
12621262
self.traverse(node.value)
12631263
with self.delimit("[", "]"):
1264-
self.traverse(node.slice)
1264+
if (isinstance(node.slice, Index)
1265+
and isinstance(node.slice.value, Tuple)
1266+
and node.slice.value.elts):
1267+
if len(node.slice.value.elts) == 1:
1268+
elt = node.slice.value.elts[0]
1269+
self.traverse(elt)
1270+
self.write(",")
1271+
else:
1272+
self.interleave(lambda: self.write(", "), self.traverse, node.slice.value.elts)
1273+
else:
1274+
self.traverse(node.slice)
12651275

12661276
def visit_Starred(self, node):
12671277
self.write("*")
@@ -1286,7 +1296,12 @@ def visit_Slice(self, node):
12861296
self.traverse(node.step)
12871297

12881298
def visit_ExtSlice(self, node):
1289-
self.interleave(lambda: self.write(", "), self.traverse, node.dims)
1299+
if len(node.dims) == 1:
1300+
elt = node.dims[0]
1301+
self.traverse(elt)
1302+
self.write(",")
1303+
else:
1304+
self.interleave(lambda: self.write(", "), self.traverse, node.dims)
12901305

12911306
def visit_arg(self, node):
12921307
self.write(node.arg)

Lib/test/test_unparse.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,20 @@ def test_simple_expressions_parens(self):
344344
self.check_src_roundtrip("call((yield x))")
345345
self.check_src_roundtrip("return x + (yield x)")
346346

347+
def test_subscript(self):
348+
self.check_src_roundtrip("a[i]")
349+
self.check_src_roundtrip("a[i,]")
350+
self.check_src_roundtrip("a[i, j]")
351+
self.check_src_roundtrip("a[()]")
352+
self.check_src_roundtrip("a[i:j]")
353+
self.check_src_roundtrip("a[:j]")
354+
self.check_src_roundtrip("a[i:]")
355+
self.check_src_roundtrip("a[i:j:k]")
356+
self.check_src_roundtrip("a[:j:k]")
357+
self.check_src_roundtrip("a[i::k]")
358+
self.check_src_roundtrip("a[i:j,]")
359+
self.check_src_roundtrip("a[i:j, k]")
360+
347361
def test_docstrings(self):
348362
docstrings = (
349363
'"""simple doc string"""',
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fixed :func:`ast.unparse` for extended slices containing a single element
2+
(e.g. ``a[i:j,]``). Remove redundant tuples when index with a tuple (e.g.
3+
``a[i, j]``).

0 commit comments

Comments
 (0)