mirror of
https://github.com/python/cpython.git
synced 2026-05-06 12:49:07 -04:00
bpo-38530: Offer suggestions on AttributeError (#16856)
When printing AttributeError, PyErr_Display will offer suggestions of similar attribute names in the object that the exception was raised from: >>> collections.namedtoplo Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
This commit is contained in:
+11
-1
@@ -15,7 +15,7 @@
|
||||
#include "pycore_interp.h" // PyInterpreterState.importlib
|
||||
#include "pycore_object.h" // _PyDebug_PrintTotalRefs()
|
||||
#include "pycore_parser.h" // _PyParser_ASTFromString()
|
||||
#include "pycore_pyerrors.h" // _PyErr_Fetch
|
||||
#include "pycore_pyerrors.h" // _PyErr_Fetch, _Py_Offer_Suggestions
|
||||
#include "pycore_pylifecycle.h" // _Py_UnhandledKeyboardInterrupt
|
||||
#include "pycore_pystate.h" // _PyInterpreterState_GET()
|
||||
#include "pycore_sysmodule.h" // _PySys_Audit()
|
||||
@@ -953,6 +953,16 @@ print_exception(PyObject *f, PyObject *value)
|
||||
if (err < 0) {
|
||||
PyErr_Clear();
|
||||
}
|
||||
PyObject* suggestions = _Py_Offer_Suggestions(value);
|
||||
if (suggestions) {
|
||||
// Add a trailer ". Did you mean: (...)?"
|
||||
err = PyFile_WriteString(". Did you mean: ", f);
|
||||
if (err == 0) {
|
||||
err = PyFile_WriteObject(suggestions, f, Py_PRINT_RAW);
|
||||
err += PyFile_WriteString("?", f);
|
||||
}
|
||||
Py_DECREF(suggestions);
|
||||
}
|
||||
err += PyFile_WriteString("\n", f);
|
||||
Py_XDECREF(tb);
|
||||
Py_DECREF(value);
|
||||
|
||||
Reference in New Issue
Block a user