From f2a8fe8d362f193607107766e72a8f4277df0760 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 22 Apr 2025 16:35:27 +0100 Subject: [PATCH] gh-132449: Improve the algorithm to detect typos in keywords --- Lib/test/test_syntax.py | 6 ++++++ Lib/traceback.py | 10 +++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index f3abb11952dbe0..8cae62459bb675 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -1838,6 +1838,12 @@ Traceback (most recent call last): SyntaxError: invalid syntax. Did you mean 'for'? + +>>> for x im n: +... pass +Traceback (most recent call last): +SyntaxError: invalid syntax. Did you mean 'in'? + >>> f(a=23, a=234) Traceback (most recent call last): ... diff --git a/Lib/traceback.py b/Lib/traceback.py index 5bff101a72ca47..4b3d2b636fc6b5 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -1339,10 +1339,14 @@ def _find_keyword_typos(self): if tokens_left_to_process < 0: break # Limit the number of possible matches to try - matches = difflib.get_close_matches(wrong_name, keyword.kwlist, n=3) - if not matches and _suggestions is not None: + max_matches = 3 + matches = [] + if _suggestions is not None: suggestion = _suggestions._generate_suggestions(keyword.kwlist, wrong_name) - matches = [suggestion] if suggestion is not None else matches + if suggestion: + matches.append(suggestion) + matches.extend(difflib.get_close_matches(wrong_name, keyword.kwlist, n=max_matches, cutoff=0.5)) + matches = matches[:max_matches] for suggestion in matches: if not suggestion or suggestion == wrong_name: continue