Parenthesized single starred expression (*x) is no longer valid anywhere in Python 3.9+

This commit is contained in:
gousaiyang
2020-12-30 17:14:39 -08:00
parent 79aeb2a801
commit 257ac768fb
2 changed files with 27 additions and 11 deletions

View File

@@ -753,6 +753,16 @@ class _StarExprRule(SyntaxRule):
return False
return False
if self._normalizer.version >= (3, 9):
ancestor = node.parent
else:
ancestor = _skip_parens_bottom_up(node)
# starred expression not in tuple/list/set
if ancestor.type not in (*_STAR_EXPR_PARENTS, 'dictorsetmaker') \
and not (ancestor.type == 'atom' and ancestor.children[0] != '('):
self.add_issue(node, message="can't use starred expression here")
return
if check_delete_starred(node):
if self._normalizer.version >= (3, 9):
self.add_issue(node, message="cannot delete starred")
@@ -764,12 +774,6 @@ class _StarExprRule(SyntaxRule):
# [*[] for a in [1]]
if node.parent.children[1].type in _COMP_FOR_TYPES:
self.add_issue(node, message=self.message_iterable_unpacking)
return
ancestor = _skip_parens_bottom_up(node)
# starred expression not in tuple/list/set
if ancestor.type not in (*_STAR_EXPR_PARENTS, 'dictorsetmaker', 'atom'):
self.add_issue(node, message="can't use starred expression here")
@ErrorFinder.register_rule(types=_STAR_EXPR_PARENTS)
@@ -1107,7 +1111,10 @@ class _CheckAssignmentRule(SyntaxRule):
else:
self.add_issue(node, message="can't use starred expression here")
else:
ancestor = _skip_parens_bottom_up(node)
if self._normalizer.version >= (3, 9):
ancestor = node.parent
else:
ancestor = _skip_parens_bottom_up(node)
if ancestor.type not in _STAR_EXPR_PARENTS and not is_aug_assign \
and not (ancestor.type == 'atom' and ancestor.children[0] == '['):
message = "starred assignment target must be in a list or tuple"

View File

@@ -425,10 +425,6 @@ def test_unparenthesized_genexp(source, no_errors):
('a, *b = 1', True),
('a, *b, c', True),
('a, *b, c = 1', True),
('a, (*b), c', True),
('a, (*b), c = 1', True),
('a, ((*b)), c', True),
('a, ((*b)), c = 1', True),
('a, (*b, c), d', True),
('a, (*b, c), d = 1', True),
('*a.b,', True),
@@ -455,6 +451,19 @@ def test_starred_expr(source, no_errors):
assert bool(_get_error_list(source, version="3")) ^ no_errors
@pytest.mark.parametrize(
'code', [
'a, (*b), c',
'a, (*b), c = 1',
'a, ((*b)), c',
'a, ((*b)), c = 1',
]
)
def test_parenthesized_single_starred_expr(code):
assert not _get_error_list(code, version='3.8')
assert _get_error_list(code, version='3.9')
@pytest.mark.parametrize(
'code', [
'() = ()',