diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2021-04-14 14:10:33 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-14 14:10:33 (GMT) |
commit | 5bf8bf2267cd109970b2d946d43b2e9f71379ba2 (patch) | |
tree | a29b493cace0ba9cf1d5af516750ff9348ce6c49 /Python/ceval.c | |
parent | c4073a24f95b54705416138dc1f20141ad76dd37 (diff) | |
download | cpython-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.c | 14 |
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 |