Issue #15767: Revert 3a50025f1900 for ModuleNotFoundError
This commit is contained in:
parent
45091c0a0c
commit
82da8886cc
|
@ -292,13 +292,6 @@ in various ways. There is a separate error indicator for each thread.
|
|||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. c:function:: PyObject* PyErr_SetImportErrorSubclass(PyObject *msg, PyObject *name, PyObject *path)
|
||||
|
||||
Much like :c:func:`PyErr_SetImportError` but this function allows for
|
||||
specifying a subclass of :exc:`ImportError` to raise.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
|
||||
.. c:function:: void PyErr_SyntaxLocationEx(char *filename, int lineno, int col_offset)
|
||||
|
||||
|
|
|
@ -185,8 +185,7 @@ The following exceptions are the exceptions that are usually raised.
|
|||
A subclass of :exc:`ImportError` which is raised by :keyword:`import` when a
|
||||
module could not be located. This includes ``from ... import`` statements as
|
||||
the specific attribute being requested cannot be known a priori to be a module
|
||||
or some other type of object. It is also raised when ``None`` is found in
|
||||
:data:`sys.modules`.
|
||||
or some other type of object.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ use the standard import system.
|
|||
|
||||
When a module is first imported, Python searches for the module and if found,
|
||||
it creates a module object [#fnmo]_, initializing it. If the named module
|
||||
cannot be found, an :exc:`ModuleNotFoundError` is raised. Python implements various
|
||||
cannot be found, an :exc:`ImportError` is raised. Python implements various
|
||||
strategies to search for the named module when the import machinery is
|
||||
invoked. These strategies can be modified and extended by using various hooks
|
||||
described in the sections below.
|
||||
|
@ -168,7 +168,7 @@ arguments to the :keyword:`import` statement, or from the parameters to the
|
|||
This name will be used in various phases of the import search, and it may be
|
||||
the dotted path to a submodule, e.g. ``foo.bar.baz``. In this case, Python
|
||||
first tries to import ``foo``, then ``foo.bar``, and finally ``foo.bar.baz``.
|
||||
If any of the intermediate imports fail, an :exc:`ModuleNotFoundError` is raised.
|
||||
If any of the intermediate imports fail, an :exc:`ImportError` is raised.
|
||||
|
||||
|
||||
The module cache
|
||||
|
@ -187,7 +187,7 @@ object.
|
|||
During import, the module name is looked up in :data:`sys.modules` and if
|
||||
present, the associated value is the module satisfying the import, and the
|
||||
process completes. However, if the value is ``None``, then an
|
||||
:exc:`ModuleNotFoundError` is raised. If the module name is missing, Python will
|
||||
:exc:`ImportError` is raised. If the module name is missing, Python will
|
||||
continue searching for the module.
|
||||
|
||||
:data:`sys.modules` is writable. Deleting a key may not destroy the
|
||||
|
@ -195,7 +195,7 @@ associated module (as other modules may hold references to it),
|
|||
but it will invalidate the cache entry for the named module, causing
|
||||
Python to search anew for the named module upon its next
|
||||
import. The key can also be assigned to ``None``, forcing the next import
|
||||
of the module to result in an :exc:`ModuleNotFoundError`.
|
||||
of the module to result in an :exc:`ImportError`.
|
||||
|
||||
Beware though, as if you keep a reference to the module object,
|
||||
invalidate its cache entry in :data:`sys.modules`, and then re-import the
|
||||
|
@ -284,7 +284,7 @@ handle the named module or not.
|
|||
If the meta path finder knows how to handle the named module, it returns a
|
||||
loader object. If it cannot handle the named module, it returns ``None``. If
|
||||
:data:`sys.meta_path` processing reaches the end of its list without returning
|
||||
a loader, then an :exc:`ModuleNotFoundError` is raised. Any other exceptions raised
|
||||
a loader, then an :exc:`ImportError` is raised. Any other exceptions raised
|
||||
are simply propagated up, aborting the import process.
|
||||
|
||||
The :meth:`find_module()` method of meta path finders is called with two
|
||||
|
@ -647,7 +647,7 @@ import statements within that module.
|
|||
|
||||
To selectively prevent import of some modules from a hook early on the
|
||||
meta path (rather than disabling the standard import system entirely),
|
||||
it is sufficient to raise :exc:`ModuleNotFoundError` directly from
|
||||
it is sufficient to raise :exc:`ImportError` directly from
|
||||
:meth:`find_module` instead of returning ``None``. The latter indicates
|
||||
that the meta path search should continue. while raising an exception
|
||||
terminates it immediately.
|
||||
|
|
|
@ -312,7 +312,8 @@ that may require changes to your code.
|
|||
using ``hasattr(module, '__path__')``.
|
||||
|
||||
* :c:func:`PyErr_SetImportError` now sets :exc:`TypeError` when its **msg**
|
||||
argument is not set. Previously only ``NULL`` was returned.
|
||||
argument is not set. Previously only ``NULL`` was returned with no exception
|
||||
set.
|
||||
|
||||
* :func:`py_compile.compile` now raises :exc:`FileExistsError` if the file path
|
||||
it would write to is a symlink or a non-regular file. This is to act as a
|
||||
|
|
|
@ -268,9 +268,6 @@ PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int);
|
|||
|
||||
PyAPI_FUNC(PyObject *) PyErr_SetExcWithArgsKwargs(PyObject *, PyObject *,
|
||||
PyObject *);
|
||||
|
||||
PyAPI_FUNC(PyObject *) PyErr_SetImportErrorSubclass(PyObject *, PyObject *,
|
||||
PyObject *, PyObject *);
|
||||
PyAPI_FUNC(PyObject *) PyErr_SetImportError(PyObject *, PyObject *,
|
||||
PyObject *);
|
||||
|
||||
|
|
|
@ -1617,7 +1617,7 @@ def _gcd_import(name, package=None, level=0):
|
|||
_imp.release_lock()
|
||||
message = ("import of {} halted; "
|
||||
"None in sys.modules".format(name))
|
||||
raise ModuleNotFoundError(message, name=name)
|
||||
raise ImportError(message, name=name)
|
||||
_lock_unlock_module(name)
|
||||
return module
|
||||
|
||||
|
|
|
@ -539,10 +539,6 @@ Documentation
|
|||
C-API
|
||||
-----
|
||||
|
||||
- Issue #15767: Added PyErr_SetImportErrorSubclass().
|
||||
|
||||
- PyErr_SetImportError() now sets TypeError when its msg argument is set.
|
||||
|
||||
- Issue #9369: The types of `char*` arguments of PyObject_CallFunction() and
|
||||
PyObject_CallMethod() now changed to `const char*`. Based on patches by
|
||||
Jörg Müller and Lars Buitinck.
|
||||
|
|
|
@ -619,25 +619,12 @@ PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
|
|||
#endif /* MS_WINDOWS */
|
||||
|
||||
PyObject *
|
||||
PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
|
||||
PyObject *name, PyObject *path)
|
||||
PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
|
||||
{
|
||||
int issubclass;
|
||||
PyObject *args, *kwargs, *error;
|
||||
|
||||
issubclass = PyObject_IsSubclass(exception, PyExc_ImportError);
|
||||
if (issubclass < 0) {
|
||||
if (msg == NULL)
|
||||
return NULL;
|
||||
}
|
||||
else if (!issubclass) {
|
||||
PyErr_SetString(PyExc_TypeError, "expected a subclass of ImportError");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (msg == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError, "expected a message argument");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
args = PyTuple_New(1);
|
||||
if (args == NULL)
|
||||
|
@ -662,7 +649,7 @@ PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
|
|||
PyDict_SetItemString(kwargs, "name", name);
|
||||
PyDict_SetItemString(kwargs, "path", path);
|
||||
|
||||
error = PyObject_Call(exception, args, kwargs);
|
||||
error = PyObject_Call(PyExc_ImportError, args, kwargs);
|
||||
if (error != NULL) {
|
||||
PyErr_SetObject((PyObject *)Py_TYPE(error), error);
|
||||
Py_DECREF(error);
|
||||
|
@ -674,12 +661,6 @@ PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *
|
||||
PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path)
|
||||
{
|
||||
return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path);
|
||||
}
|
||||
|
||||
void
|
||||
_PyErr_BadInternalCall(const char *filename, int lineno)
|
||||
{
|
||||
|
|
|
@ -1428,8 +1428,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals,
|
|||
PyObject *msg = PyUnicode_FromFormat("import of %R halted; "
|
||||
"None in sys.modules", abs_name);
|
||||
if (msg != NULL) {
|
||||
PyErr_SetImportErrorSubclass(PyExc_ModuleNotFoundError, msg,
|
||||
abs_name, NULL);
|
||||
PyErr_SetImportError(msg, abs_name, NULL);
|
||||
Py_DECREF(msg);
|
||||
}
|
||||
mod = NULL;
|
||||
|
|
1587
Python/importlib.h
1587
Python/importlib.h
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue