diff --git a/parso/python/errors.py b/parso/python/errors.py index a3d77a2..fb84242 100644 --- a/parso/python/errors.py +++ b/parso/python/errors.py @@ -914,6 +914,14 @@ class _CheckAssignmentRule(SyntaxRule): if second.type == 'yield_expr': error = 'yield expression' elif second.type == 'testlist_comp': + # ([a, b] := [1, 2]) + # ((a, b) := [1, 2]) + if is_namedexpr: + if first == '(': + error = 'tuple' + elif first == '[': + error = 'list' + # This is not a comprehension, they were handled # further above. for child in second.children[::2]: @@ -963,6 +971,8 @@ class _CheckAssignmentRule(SyntaxRule): if error is not None: if is_namedexpr: + # c.f. CPython bpo-39176, should be changed in next release + # message = 'cannot use assignment expressions with %s' % error message = 'cannot use named assignment with %s' % error else: cannot = "can't" if self._normalizer.version < (3, 8) else "cannot" diff --git a/parso/python/tree.py b/parso/python/tree.py index 74ff15a..441d507 100644 --- a/parso/python/tree.py +++ b/parso/python/tree.py @@ -233,6 +233,8 @@ class Name(_LeafWithoutNewlines): while node is not None: if node.type == 'suite': return None + if node.type == 'namedexpr_test': + return node.children[0] if node.type in _GET_DEFINITION_TYPES: if self in node.get_defined_names(include_setitem): return node diff --git a/test/failing_examples.py b/test/failing_examples.py index 3347cf5..60cc8d6 100644 --- a/test/failing_examples.py +++ b/test/failing_examples.py @@ -347,4 +347,14 @@ if sys.version_info[:2] >= (3, 8): # Not in that issue '(await a := x)', '((await a) := x)', + # new discoveries + '((a, b) := (1, 2))', + '([a, b] := [1, 2])', + '({a, b} := {1, 2})', + '({a: b} := {1: 2})', + '(a + b := 1)', + '(True := 1)', + '(False := 1)', + '(None := 1)', + '(__debug__ := 1)', ] diff --git a/test/test_python_errors.py b/test/test_python_errors.py index 10ecc7f..31b4c2e 100644 --- a/test/test_python_errors.py +++ b/test/test_python_errors.py @@ -321,4 +321,3 @@ def test_invalid_fstrings(code, message): def test_trailing_comma(code): errors = _get_error_list(code) assert not errors -