diff --git a/parso/python/normalizer.py b/parso/python/normalizer.py index 02d1f8d..60715a6 100644 --- a/parso/python/normalizer.py +++ b/parso/python/normalizer.py @@ -356,14 +356,20 @@ class ErrorFinder(Normalizer): arg_set = set() kw_only = False kw_unpacking_only = False + is_old_starred = False # In python 3 this would be a bit easier (stars are part of # argument), but we have to understand both. for argument in node.children: if argument == ',': continue + if argument in ('*', '**'): - # Python 2 has the order engraved in the grammar file. - # No need to do anything here. + # Python < 3.5 has the order engraved in the grammar + # file. No need to do anything here. + is_old_starred = True + continue + if is_old_starred: + is_old_starred = False continue if argument.type == 'argument': diff --git a/test/test_python_errors.py b/test/test_python_errors.py index 236f06f..80efffd 100644 --- a/test/test_python_errors.py +++ b/test/test_python_errors.py @@ -292,6 +292,10 @@ def _get_actual_exception(code): # Python 2.6 has a bit different error messages here, so skip it. if sys.version_info[:2] == (2, 6) and wanted == 'SyntaxError: unexpected EOF while parsing': wanted = 'SyntaxError: invalid syntax' + + if wanted == 'SyntaxError: non-keyword arg after keyword arg': + # The python 3.5+ way, a bit nicer. + wanted = 'SyntaxError: positional argument follows keyword argument' return wanted, line_nr