Comprehensions are not valid as class params, fixes #122

This commit is contained in:
Dave Halter
2020-07-24 00:30:15 +02:00
parent d8a70abf19
commit c53321a440
2 changed files with 11 additions and 1 deletions

View File

@@ -209,6 +209,11 @@ def _get_for_stmt_definition_exprs(for_stmt):
exprlist = for_stmt.children[1] exprlist = for_stmt.children[1]
return list(_iter_definition_exprs_from_lists(exprlist)) return list(_iter_definition_exprs_from_lists(exprlist))
def _is_argument_comprehension(argument):
return argument.children[1].type in _COMP_FOR_TYPES
def _any_fstring_error(version, node): def _any_fstring_error(version, node):
if version < (3, 9) or node is None: if version < (3, 9) or node is None:
return False return False
@@ -862,6 +867,9 @@ class _ArgumentRule(SyntaxRule):
message = 'expression cannot contain assignment, perhaps you meant "=="?' message = 'expression cannot contain assignment, perhaps you meant "=="?'
self.add_issue(first, message=message) self.add_issue(first, message=message)
if _is_argument_comprehension(node) and node.parent.type == 'classdef':
self.add_issue(node, message='invalid syntax')
@ErrorFinder.register_rule(type='nonlocal_stmt') @ErrorFinder.register_rule(type='nonlocal_stmt')
class _NonlocalModuleLevelRule(SyntaxRule): class _NonlocalModuleLevelRule(SyntaxRule):
@@ -902,9 +910,10 @@ class _ArglistRule(SyntaxRule):
if argument.type == 'argument': if argument.type == 'argument':
first = argument.children[0] first = argument.children[0]
if argument.children[1].type in _COMP_FOR_TYPES and len(node.children) >= 2: if _is_argument_comprehension(argument) and len(node.children) >= 2:
# a(a, b for b in c) # a(a, b for b in c)
return True return True
if first in ('*', '**'): if first in ('*', '**'):
if first == '*': if first == '*':
if kw_unpacking_only: if kw_unpacking_only:

View File

@@ -76,6 +76,7 @@ FAILING_EXAMPLES = [
'(yield) += 1', '(yield) += 1',
'(yield from x) += 1', '(yield from x) += 1',
'(x if x else y) += 1', '(x if x else y) += 1',
'class X(base for base in bases): pass',
'a() += 1', 'a() += 1',
'a + b += 1', 'a + b += 1',
'+a += 1', '+a += 1',