mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	Issue #15767: Revert 3a50025f1900 for ModuleNotFoundError
This commit is contained in:
		
							parent
							
								
									45091c0a0c
								
							
						
					
					
						commit
						82da8886cc
					
				
					 10 changed files with 807 additions and 842 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Brett Cannon
						Brett Cannon