diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index c57488e44aecc6..1fedf3ace967ee 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1954,6 +1954,36 @@ def test_non_str_argument(self): exc = ImportError(arg) self.assertEqual(str(arg), str(exc)) + def test_repr(self): + exc = ImportError() + self.assertEqual(repr(exc), "ImportError()") + + exc = ImportError('test') + self.assertEqual(repr(exc), "ImportError('test')") + + exc = ImportError('test', 'case') + self.assertEqual(repr(exc), "ImportError('test', 'case')") + + exc = ImportError(name='somemodule') + self.assertEqual(repr(exc), "ImportError(name='somemodule')") + + exc = ImportError('test', name='somemodule') + self.assertEqual(repr(exc), "ImportError('test', name='somemodule')") + + exc = ImportError(path='somepath') + self.assertEqual(repr(exc), "ImportError(path='somepath')") + + exc = ImportError('test', path='somepath') + self.assertEqual(repr(exc), "ImportError('test', path='somepath')") + + exc = ImportError(name='somename', path='somepath') + self.assertEqual(repr(exc), + "ImportError(name='somename', path='somepath')") + + exc = ImportError('test', name='somename', path='somepath') + self.assertEqual(repr(exc), + "ImportError('test', name='somename', path='somepath')") + def test_copy_pickle(self): for kwargs in (dict(), dict(name='somename'), diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-02-13-21-26-54.gh-issue-74185.Sk3O7m.rst b/Misc/NEWS.d/next/Core and Builtins/2023-02-13-21-26-54.gh-issue-74185.Sk3O7m.rst new file mode 100644 index 00000000000000..3a992bfe6b8413 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-02-13-21-26-54.gh-issue-74185.Sk3O7m.rst @@ -0,0 +1,2 @@ +:meth:`repr` of :class:`ImportError` now contains attributes name and path. +Patch by Serhiy Storchaka. diff --git a/Objects/exceptions.c b/Objects/exceptions.c index a685ed803cd02d..fb61dd2ad2f6df 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -1592,6 +1592,30 @@ ImportError_str(PyImportErrorObject *self) } } +static PyObject * +ImportError_repr(PyImportErrorObject *self) +{ + int hasargs = PyTuple_GET_SIZE(((PyBaseExceptionObject *)self)->args) != 0; + PyObject *r = BaseException_repr((PyBaseExceptionObject *)self); + if (r && (self->name || self->path)) { + /* remove ')' */ + Py_SETREF(r, PyUnicode_Substring(r, 0, PyUnicode_GET_LENGTH(r) - 1)); + if (r && self->name) { + Py_SETREF(r, PyUnicode_FromFormat("%U%sname=%R", + r, hasargs ? ", " : "", self->name)); + hasargs = 1; + } + if (r && self->path) { + Py_SETREF(r, PyUnicode_FromFormat("%U%spath=%R", + r, hasargs ? ", " : "", self->path)); + } + if (r) { + Py_SETREF(r, PyUnicode_FromFormat("%U)", r)); + } + } + return r; +} + static PyObject * ImportError_getstate(PyImportErrorObject *self) { @@ -1657,12 +1681,23 @@ static PyMethodDef ImportError_methods[] = { {NULL} }; -ComplexExtendsException(PyExc_Exception, ImportError, - ImportError, 0 /* new */, - ImportError_methods, ImportError_members, - 0 /* getset */, ImportError_str, - "Import can't find module, or can't find name in " - "module."); +static PyTypeObject _PyExc_ImportError = { + PyVarObject_HEAD_INIT(NULL, 0) + "ImportError", + sizeof(PyImportErrorObject), 0, + (destructor)ImportError_dealloc, 0, 0, 0, 0, + (reprfunc)ImportError_repr, 0, 0, 0, 0, 0, + (reprfunc)ImportError_str, 0, 0, 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + PyDoc_STR("Import can't find module, or can't find name in " + "module."), + (traverseproc)ImportError_traverse, + (inquiry)ImportError_clear, 0, 0, 0, 0, ImportError_methods, + ImportError_members, 0, &_PyExc_Exception, + 0, 0, 0, offsetof(PyImportErrorObject, dict), + (initproc)ImportError_init, +}; +PyObject *PyExc_ImportError = (PyObject *)&_PyExc_ImportError; /* * ModuleNotFoundError extends ImportError pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy