diff --git a/parso/python/errors.py b/parso/python/errors.py index db3a30f..5df4750 100644 --- a/parso/python/errors.py +++ b/parso/python/errors.py @@ -820,7 +820,10 @@ class _ArglistRule(SyntaxRule): if first.type == 'name': if first.value in arg_set: # f(x=1, x=2) - self.add_issue(first, message="keyword argument repeated") + message = "keyword argument repeated" + if self._normalizer.version >= (3, 9): + message += ": {}".format(first.value) + self.add_issue(first, message=message) else: arg_set.add(first.value) else: diff --git a/test/test_python_errors.py b/test/test_python_errors.py index 75ebb88..7131b1b 100644 --- a/test/test_python_errors.py +++ b/test/test_python_errors.py @@ -362,6 +362,16 @@ def test_continue_in_finally(): ] ) def test_forbidden_name(template, target): - assert _get_error_list(template.format(target=target), version="3")[0].message + assert _get_error_list(template.format(target=target), version="3") +def test_repeated_kwarg(): + # python 3.9+ shows which argument is repeated + assert ( + _get_error_list("f(q=1, q=2)", version="3.8")[0].message + == "SyntaxError: keyword argument repeated" + ) + assert ( + _get_error_list("f(q=1, q=2)", version="3.9")[0].message + == "SyntaxError: keyword argument repeated: q" + )