mirror of
				https://github.com/python/cpython.git
				synced 2025-10-26 03:04:41 +00:00 
			
		
		
		
	Issue #15767: Add ModuleNotFoundError.
This commit is contained in:
		
							parent
							
								
									86a7668426
								
							
						
					
					
						commit
						c943265ba5
					
				
					 8 changed files with 42 additions and 2 deletions
				
			
		|  | @ -782,6 +782,8 @@ the variables: | ||||||
| +-----------------------------------------+---------------------------------+----------+ | +-----------------------------------------+---------------------------------+----------+ | ||||||
| | :c:data:`PyExc_ImportError`             | :exc:`ImportError`              |          | | | :c:data:`PyExc_ImportError`             | :exc:`ImportError`              |          | | ||||||
| +-----------------------------------------+---------------------------------+----------+ | +-----------------------------------------+---------------------------------+----------+ | ||||||
|  | | :c:data:`PyExc_ModuleNotFoundError`     | :exc:`ModuleNotFoundError`      |          | | ||||||
|  | +-----------------------------------------+---------------------------------+----------+ | ||||||
| | :c:data:`PyExc_IndexError`              | :exc:`IndexError`               |          | | | :c:data:`PyExc_IndexError`              | :exc:`IndexError`               |          | | ||||||
| +-----------------------------------------+---------------------------------+----------+ | +-----------------------------------------+---------------------------------+----------+ | ||||||
| | :c:data:`PyExc_InterruptedError`        | :exc:`InterruptedError`         |          | | | :c:data:`PyExc_InterruptedError`        | :exc:`InterruptedError`         |          | | ||||||
|  |  | ||||||
|  | @ -170,8 +170,9 @@ The following exceptions are the exceptions that are usually raised. | ||||||
| 
 | 
 | ||||||
| .. exception:: ImportError | .. exception:: ImportError | ||||||
| 
 | 
 | ||||||
|    Raised when an :keyword:`import` statement fails to find the module definition |    Raised when the :keyword:`import` statement has troubles trying to | ||||||
|    or when a ``from ... import`` fails to find a name that is to be imported. |    load a module.  Also raised when the "from list" in ``from ... import`` | ||||||
|  |    has a name that cannot be found. | ||||||
| 
 | 
 | ||||||
|    The :attr:`name` and :attr:`path` attributes can be set using keyword-only |    The :attr:`name` and :attr:`path` attributes can be set using keyword-only | ||||||
|    arguments to the constructor. When set they represent the name of the module |    arguments to the constructor. When set they represent the name of the module | ||||||
|  | @ -181,6 +182,14 @@ The following exceptions are the exceptions that are usually raised. | ||||||
|    .. versionchanged:: 3.3 |    .. versionchanged:: 3.3 | ||||||
|       Added the :attr:`name` and :attr:`path` attributes. |       Added the :attr:`name` and :attr:`path` attributes. | ||||||
| 
 | 
 | ||||||
|  | .. exception:: ModuleNotFoundError | ||||||
|  | 
 | ||||||
|  |    A subclass of :exc:`ImportError` which is raised by :keyword:`import` | ||||||
|  |    when a module could not be located.  It is also raised when ``None`` | ||||||
|  |    is found in :data:`sys.modules`. | ||||||
|  | 
 | ||||||
|  |    .. versionadded:: 3.6 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| .. exception:: IndexError | .. exception:: IndexError | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -160,6 +160,7 @@ PyAPI_DATA(PyObject *) PyExc_EOFError; | ||||||
| PyAPI_DATA(PyObject *) PyExc_FloatingPointError; | PyAPI_DATA(PyObject *) PyExc_FloatingPointError; | ||||||
| PyAPI_DATA(PyObject *) PyExc_OSError; | PyAPI_DATA(PyObject *) PyExc_OSError; | ||||||
| PyAPI_DATA(PyObject *) PyExc_ImportError; | PyAPI_DATA(PyObject *) PyExc_ImportError; | ||||||
|  | PyAPI_DATA(PyObject *) PyExc_ModuleNotFoundError; | ||||||
| PyAPI_DATA(PyObject *) PyExc_IndexError; | PyAPI_DATA(PyObject *) PyExc_IndexError; | ||||||
| PyAPI_DATA(PyObject *) PyExc_KeyError; | PyAPI_DATA(PyObject *) PyExc_KeyError; | ||||||
| PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt; | PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt; | ||||||
|  |  | ||||||
|  | @ -242,3 +242,10 @@ | ||||||
| 
 | 
 | ||||||
| for excname in PYTHON3_OSERROR_EXCEPTIONS: | for excname in PYTHON3_OSERROR_EXCEPTIONS: | ||||||
|     REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'OSError') |     REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'OSError') | ||||||
|  | 
 | ||||||
|  | PYTHON3_IMPORTERROR_EXCEPTIONS = ( | ||||||
|  |     'ModuleNotFoundError', | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | for excname in PYTHON3_IMPORTERROR_EXCEPTIONS: | ||||||
|  |     REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'ImportError') | ||||||
|  |  | ||||||
|  | @ -14,6 +14,7 @@ BaseException | ||||||
|       +-- BufferError |       +-- BufferError | ||||||
|       +-- EOFError |       +-- EOFError | ||||||
|       +-- ImportError |       +-- ImportError | ||||||
|  |            +-- ModuleNotFoundError | ||||||
|       +-- LookupError |       +-- LookupError | ||||||
|       |    +-- IndexError |       |    +-- IndexError | ||||||
|       |    +-- KeyError |       |    +-- KeyError | ||||||
|  |  | ||||||
|  | @ -335,6 +335,9 @@ def test_name_mapping(self): | ||||||
|                 if (module2, name2) == ('exceptions', 'OSError'): |                 if (module2, name2) == ('exceptions', 'OSError'): | ||||||
|                     attr = getattribute(module3, name3) |                     attr = getattribute(module3, name3) | ||||||
|                     self.assertTrue(issubclass(attr, OSError)) |                     self.assertTrue(issubclass(attr, OSError)) | ||||||
|  |                 elif (module2, name2) == ('exceptions', 'ImportError'): | ||||||
|  |                     attr = getattribute(module3, name3) | ||||||
|  |                     self.assertTrue(issubclass(attr, ImportError)) | ||||||
|                 else: |                 else: | ||||||
|                     module, name = mapping(module2, name2) |                     module, name = mapping(module2, name2) | ||||||
|                     if module3[:1] != '_': |                     if module3[:1] != '_': | ||||||
|  | @ -401,6 +404,11 @@ def test_exceptions(self): | ||||||
|                 if exc is not OSError and issubclass(exc, OSError): |                 if exc is not OSError and issubclass(exc, OSError): | ||||||
|                     self.assertEqual(reverse_mapping('builtins', name), |                     self.assertEqual(reverse_mapping('builtins', name), | ||||||
|                                      ('exceptions', 'OSError')) |                                      ('exceptions', 'OSError')) | ||||||
|  |                 elif exc is not ImportError and issubclass(exc, ImportError): | ||||||
|  |                     self.assertEqual(reverse_mapping('builtins', name), | ||||||
|  |                                      ('exceptions', 'ImportError')) | ||||||
|  |                     self.assertEqual(mapping('exceptions', name), | ||||||
|  |                                      ('exceptions', name)) | ||||||
|                 else: |                 else: | ||||||
|                     self.assertEqual(reverse_mapping('builtins', name), |                     self.assertEqual(reverse_mapping('builtins', name), | ||||||
|                                      ('exceptions', name)) |                                      ('exceptions', name)) | ||||||
|  |  | ||||||
|  | @ -8043,6 +8043,9 @@ Core and Builtins | ||||||
| - Issue #18137: Detect integer overflow on precision in float.__format__() | - Issue #18137: Detect integer overflow on precision in float.__format__() | ||||||
|   and complex.__format__(). |   and complex.__format__(). | ||||||
| 
 | 
 | ||||||
|  | - Issue #15767: Introduce ModuleNotFoundError which is raised when a module | ||||||
|  |   could not be found. | ||||||
|  | 
 | ||||||
| - Issue #18183: Fix various unicode operations on strings with large unicode | - Issue #18183: Fix various unicode operations on strings with large unicode | ||||||
|   codepoints. |   codepoints. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -705,6 +705,13 @@ ComplexExtendsException(PyExc_Exception, ImportError, | ||||||
|                         "Import can't find module, or can't find name in " |                         "Import can't find module, or can't find name in " | ||||||
|                         "module."); |                         "module."); | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  *    ModuleNotFoundError extends ImportError | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError, | ||||||
|  |                          "Module not found."); | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  *    OSError extends Exception |  *    OSError extends Exception | ||||||
|  */ |  */ | ||||||
|  | @ -2469,6 +2476,7 @@ _PyExc_Init(PyObject *bltinmod) | ||||||
|     PRE_INIT(SystemExit) |     PRE_INIT(SystemExit) | ||||||
|     PRE_INIT(KeyboardInterrupt) |     PRE_INIT(KeyboardInterrupt) | ||||||
|     PRE_INIT(ImportError) |     PRE_INIT(ImportError) | ||||||
|  |     PRE_INIT(ModuleNotFoundError) | ||||||
|     PRE_INIT(OSError) |     PRE_INIT(OSError) | ||||||
|     PRE_INIT(EOFError) |     PRE_INIT(EOFError) | ||||||
|     PRE_INIT(RuntimeError) |     PRE_INIT(RuntimeError) | ||||||
|  | @ -2541,6 +2549,7 @@ _PyExc_Init(PyObject *bltinmod) | ||||||
|     POST_INIT(SystemExit) |     POST_INIT(SystemExit) | ||||||
|     POST_INIT(KeyboardInterrupt) |     POST_INIT(KeyboardInterrupt) | ||||||
|     POST_INIT(ImportError) |     POST_INIT(ImportError) | ||||||
|  |     POST_INIT(ModuleNotFoundError) | ||||||
|     POST_INIT(OSError) |     POST_INIT(OSError) | ||||||
|     INIT_ALIAS(EnvironmentError, OSError) |     INIT_ALIAS(EnvironmentError, OSError) | ||||||
|     INIT_ALIAS(IOError, OSError) |     INIT_ALIAS(IOError, OSError) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Eric Snow
						Eric Snow