https://github.com/python/cpython/commit/5ea1e907d1928c1e08cf4246e8935d62a95ca8a1
commit: 5ea1e907d1928c1e08cf4246e8935d62a95ca8a1
branch: main
author: Langyan <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-06-15T20:55:57+03:00
summary:
gh-151128: Improve SyntaxError message for cross language keywords (GH-151129)
files:
A Misc/NEWS.d/next/Library/2026-06-12-00-17-29.gh-issue-151128.-LYO3a.rst
M Lib/test/test_traceback.py
M Lib/traceback.py
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 2c6324a14a8e2f..e38d0942e463e9 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -1815,6 +1815,18 @@ class TestKeywordTypoSuggestions(unittest.TestCase):
("[x for x\nin range(3)\nof x]", "if"),
("[123 fur x\nin range(3)\nif x]", "for"),
("for x im n:\n pass", "in"),
+ ("mach x:", "match"),
+ ("math x:", "match"),
+ ("match 1:\n cse 1:", "case"),
+ ("typ x = int", "type"),
+ ("typed x = int", "type"),
+ ("lazi import x", "lazy"),
+ ("lezi import x", "lazy"),
+ ("switch x:\n case:", "match"),
+ ("delete x", "del"),
+ ("function f():", "def"),
+ ("func f():", "def"),
+ ("void f():", "def"),
]
def test_keyword_suggestions_from_file(self):
diff --git a/Lib/traceback.py b/Lib/traceback.py
index 614a12f69b32e4..dcdab1f12e9a16 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -1485,11 +1485,22 @@ def _find_keyword_typos(self):
# Limit the number of possible matches to try
max_matches = 3
matches = []
+
+ hint = _get_cross_language_keyword_hint(wrong_name)
+ if hint:
+ matches.append(hint)
if _suggestions is not None:
- suggestion =
_suggestions._generate_suggestions(keyword.kwlist, wrong_name)
+ suggestion = _suggestions._generate_suggestions(keyword.kwlist
+ keyword.softkwlist, wrong_name)
if suggestion:
matches.append(suggestion)
- matches.extend(difflib.get_close_matches(wrong_name,
keyword.kwlist, n=max_matches, cutoff=0.5))
+ matches.extend(
+ difflib.get_close_matches(
+ wrong_name,
+ keyword.kwlist + keyword.softkwlist,
+ n=max_matches,
+ cutoff=0.5
+ )
+ )
matches = matches[:max_matches]
for suggestion in matches:
if not suggestion or suggestion == wrong_name:
@@ -1787,6 +1798,17 @@ def print(self, *, file=None, chain=True, **kwargs):
})
+# Cross-language keyword suggestions.
+_CROSS_LANGUAGE_KEYWORD_HINTS = frozendict({
+ # C/C++ equivalents
+ 'switch': 'match',
+ 'delete': 'del',
+ # function define equivalents
+ 'function': 'def',
+ 'func': 'def',
+ 'void': 'def',
+})
+
def _substitution_cost(ch_a, ch_b):
if ch_a == ch_b:
return 0
@@ -1866,6 +1888,12 @@ def _get_cross_language_hint(obj, wrong_name):
return None
+def _get_cross_language_keyword_hint(wrong_name):
+ """Check if wrong_name is a common keyword from another language
+ """
+ return _CROSS_LANGUAGE_KEYWORD_HINTS.get(wrong_name)
+
+
def _get_safe___dir__(obj):
# Use obj.__dir__() to avoid a TypeError when calling dir(obj).
# See gh-131001 and gh-139933.
diff --git
a/Misc/NEWS.d/next/Library/2026-06-12-00-17-29.gh-issue-151128.-LYO3a.rst
b/Misc/NEWS.d/next/Library/2026-06-12-00-17-29.gh-issue-151128.-LYO3a.rst
new file mode 100644
index 00000000000000..6e760686af2b01
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-06-12-00-17-29.gh-issue-151128.-LYO3a.rst
@@ -0,0 +1,3 @@
+Cross-language keyword suggestions are now shown for :exc:`SyntaxError`
messages.
+For example, ``switch x:`` suggests ``match``, ``delete x`` suggests ``del``,
+``function f():`` suggests ``def``. Contributed by Zang Langyan.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]