summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2021-04-14 14:10:33 (GMT)
committerGitHub <noreply@github.com>2021-04-14 14:10:33 (GMT)
commit5bf8bf2267cd109970b2d946d43b2e9f71379ba2 (patch)
treea29b493cace0ba9cf1d5af516750ff9348ce6c49 /Python/ceval.c
parentc4073a24f95b54705416138dc1f20141ad76dd37 (diff)
downloadcpython-5bf8bf2267cd109970b2d946d43b2e9f71379ba2.zip
cpython-5bf8bf2267cd109970b2d946d43b2e9f71379ba2.tar.gz
cpython-5bf8bf2267cd109970b2d946d43b2e9f71379ba2.tar.bz2
bpo-38530: Offer suggestions on NameError (GH-25397)
When printing NameError raised by the interpreter, PyErr_Display will offer suggestions of simmilar variable names in the function that the exception was raised from: >>> schwarzschild_black_hole = None >>> schwarschild_black_hole Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 53b596b..326930b 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -6319,6 +6319,20 @@ format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
return;
_PyErr_Format(tstate, exc, format_str, obj_str);
+
+ if (exc == PyExc_NameError) {
+ // Include the name in the NameError exceptions to offer suggestions later.
+ _Py_IDENTIFIER(name);
+ PyObject *type, *value, *traceback;
+ PyErr_Fetch(&type, &value, &traceback);
+ PyErr_NormalizeException(&type, &value, &traceback);
+ if (PyErr_GivenExceptionMatches(value, PyExc_NameError)) {
+ // We do not care if this fails because we are going to restore the
+ // NameError anyway.
+ (void)_PyObject_SetAttrId(value, &PyId_name, obj);
+ }
+ PyErr_Restore(type, value, traceback);
+ }
}
static void