bpo-38870: Don't omit parenthesis when unparsing a slice in ast.unparse
When unparsing a non-empty tuple, the parentheses can be safely omitted if there aren't any elements that explicitly require them (such as starred expressions).
This commit is contained in:
parent
75b863aa97
commit
c102a14825
12
Lib/ast.py
12
Lib/ast.py
|
@ -1356,10 +1356,20 @@ class _Unparser(NodeVisitor):
|
|||
self.traverse(e)
|
||||
|
||||
def visit_Subscript(self, node):
|
||||
def is_simple_tuple(slice_value):
|
||||
# when unparsing a non-empty tuple, the parantheses can be safely
|
||||
# omitted if there aren't any elements that explicitly requires
|
||||
# parantheses (such as starred expressions).
|
||||
return (
|
||||
isinstance(slice_value, Tuple)
|
||||
and slice_value.elts
|
||||
and not any(isinstance(elt, Starred) for elt in slice_value.elts)
|
||||
)
|
||||
|
||||
self.set_precedence(_Precedence.ATOM, node.value)
|
||||
self.traverse(node.value)
|
||||
with self.delimit("[", "]"):
|
||||
if isinstance(node.slice, Tuple) and node.slice.elts:
|
||||
if is_simple_tuple(node.slice):
|
||||
self.items_view(self.traverse, node.slice.elts)
|
||||
else:
|
||||
self.traverse(node.slice)
|
||||
|
|
|
@ -279,10 +279,13 @@ class UnparseTestCase(ASTTestCase):
|
|||
self.check_ast_roundtrip(r"""{**{'y': 2}, 'x': 1}""")
|
||||
self.check_ast_roundtrip(r"""{**{'y': 2}, **{'x': 1}}""")
|
||||
|
||||
def test_ext_slices(self):
|
||||
def test_slices(self):
|
||||
self.check_ast_roundtrip("a[i]")
|
||||
self.check_ast_roundtrip("a[i,]")
|
||||
self.check_ast_roundtrip("a[i, j]")
|
||||
self.check_ast_roundtrip("a[(*a,)]")
|
||||
self.check_ast_roundtrip("a[(a:=b)]")
|
||||
self.check_ast_roundtrip("a[(a:=b,c)]")
|
||||
self.check_ast_roundtrip("a[()]")
|
||||
self.check_ast_roundtrip("a[i:j]")
|
||||
self.check_ast_roundtrip("a[:j]")
|
||||
|
@ -470,6 +473,11 @@ class CosmeticTestCase(ASTTestCase):
|
|||
for prefix in ("not",):
|
||||
self.check_src_roundtrip(f"{prefix} 1")
|
||||
|
||||
def test_slices(self):
|
||||
self.check_src_roundtrip("a[1]")
|
||||
self.check_src_roundtrip("a[1, 2]")
|
||||
self.check_src_roundtrip("a[(1, *a)]")
|
||||
|
||||
class DirectoryTestCase(ASTTestCase):
|
||||
"""Test roundtrip behaviour on all files in Lib and Lib/test."""
|
||||
|
||||
|
|
Loading…
Reference in New Issue