Skip to content

Commit a7a228d

Browse files
committed
bpo-38870: Simplify tuple like interleaves
1 parent eb4e2ae commit a7a228d

File tree

2 files changed

+34
-37
lines changed

2 files changed

+34
-37
lines changed

Lib/ast.py

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,16 @@ def interleave(self, inter, f, seq):
613613
inter()
614614
f(x)
615615

616+
def items_view(self, traverser, items):
617+
"""Traverse and separate the given *items* with a comma and append it to
618+
the buffer. If *items* is a single item sequence, a trailing comma
619+
will be added."""
620+
if len(items) == 1:
621+
traverser(items[0])
622+
self.write(",")
623+
else:
624+
self.interleave(lambda: self.write(", "), traverser, items)
625+
616626
def fill(self, text=""):
617627
"""Indent a piece of text and append it, according to the current
618628
indentation level"""
@@ -1020,11 +1030,7 @@ def visit_Constant(self, node):
10201030
value = node.value
10211031
if isinstance(value, tuple):
10221032
with self.delimit("(", ")"):
1023-
if len(value) == 1:
1024-
self._write_constant(value[0])
1025-
self.write(",")
1026-
else:
1027-
self.interleave(lambda: self.write(", "), self._write_constant, value)
1033+
self.items_view(self._write_constant, value)
10281034
elif value is ...:
10291035
self.write("...")
10301036
else:
@@ -1116,12 +1122,7 @@ def write_item(item):
11161122

11171123
def visit_Tuple(self, node):
11181124
with self.delimit("(", ")"):
1119-
if len(node.elts) == 1:
1120-
elt = node.elts[0]
1121-
self.traverse(elt)
1122-
self.write(",")
1123-
else:
1124-
self.interleave(lambda: self.write(", "), self.traverse, node.elts)
1125+
self.items_view(self.traverse, node.elts)
11251126

11261127
unop = {"Invert": "~", "Not": "not", "UAdd": "+", "USub": "-"}
11271128
unop_precedence = {
@@ -1264,12 +1265,7 @@ def visit_Subscript(self, node):
12641265
if (isinstance(node.slice, Index)
12651266
and isinstance(node.slice.value, Tuple)
12661267
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)
1268+
self.items_view(self.traverse, node.slice.value.elts)
12731269
else:
12741270
self.traverse(node.slice)
12751271

@@ -1296,12 +1292,7 @@ def visit_Slice(self, node):
12961292
self.traverse(node.step)
12971293

12981294
def visit_ExtSlice(self, node):
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)
1295+
self.items_view(self.traverse, node.dims)
13051296

13061297
def visit_arg(self, node):
13071298
self.write(node.arg)

Lib/test/test_unparse.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,20 @@ def test_dict_unpacking_in_dict(self):
280280
self.check_ast_roundtrip(r"""{**{'y': 2}, 'x': 1}""")
281281
self.check_ast_roundtrip(r"""{**{'y': 2}, **{'x': 1}}""")
282282

283+
def test_ext_slices(self):
284+
self.check_ast_roundtrip("a[i]")
285+
self.check_ast_roundtrip("a[i,]")
286+
self.check_ast_roundtrip("a[i, j]")
287+
self.check_ast_roundtrip("a[()]")
288+
self.check_ast_roundtrip("a[i:j]")
289+
self.check_ast_roundtrip("a[:j]")
290+
self.check_ast_roundtrip("a[i:]")
291+
self.check_ast_roundtrip("a[i:j:k]")
292+
self.check_ast_roundtrip("a[:j:k]")
293+
self.check_ast_roundtrip("a[i::k]")
294+
self.check_ast_roundtrip("a[i:j,]")
295+
self.check_ast_roundtrip("a[i:j, k]")
296+
283297
def test_invalid_raise(self):
284298
self.check_invalid(ast.Raise(exc=None, cause=ast.Name(id="X")))
285299

@@ -310,6 +324,12 @@ def test_docstrings(self):
310324
# check as Module docstrings for easy testing
311325
self.check_ast_roundtrip(f"'{docstring}'")
312326

327+
def test_constant_tuples(self):
328+
self.check_src_roundtrip(ast.Constant(value=(1,), kind=None), "(1,)")
329+
self.check_src_roundtrip(
330+
ast.Constant(value=(1, 2, 3), kind=None), "(1, 2, 3)"
331+
)
332+
313333

314334
class CosmeticTestCase(ASTTestCase):
315335
"""Test if there are cosmetic issues caused by unnecesary additions"""
@@ -344,20 +364,6 @@ def test_simple_expressions_parens(self):
344364
self.check_src_roundtrip("call((yield x))")
345365
self.check_src_roundtrip("return x + (yield x)")
346366

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-
361367
def test_docstrings(self):
362368
docstrings = (
363369
'"""simple doc string"""',

0 commit comments

Comments
 (0)