Revision on assignment errors (#97)

* Revision on assignment expression errors

 * added rule for __debug__ (should be a keyword)
 * reviewed error messages
 * added new failing samples

* Adjustment upon Dave's review

 * rewind several changes in assignment errors
 * patched is_definition: command not found for assignment expressions
 * patched Python 2 inconsistent error messages in test_python_errors.py: command not found
This commit is contained in:
Jarry Shaw
2020-01-09 06:07:37 +08:00
committed by Dave Halter
parent 31c059fc30
commit 55531ab65b
4 changed files with 22 additions and 1 deletions

View File

@@ -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"

View File

@@ -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

View File

@@ -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)',
]

View File

@@ -321,4 +321,3 @@ def test_invalid_fstrings(code, message):
def test_trailing_comma(code):
errors = _get_error_list(code)
assert not errors