mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	bpo-29851: Have importlib.reload() raise ImportError if the module's spec is not found (GH-972)
This commit is contained in:
		
							parent
							
								
									3480ef9dd3
								
							
						
					
					
						commit
						94987826e8
					
				
					 5 changed files with 21 additions and 2 deletions
				
			
		|  | @ -203,6 +203,9 @@ Functions | |||
|    classes. | ||||
| 
 | ||||
|    .. versionadded:: 3.4 | ||||
|    .. versionchanged:: 3.7 | ||||
|        :exc:`ModuleNotFoundError` is raised when the module being reloaded lacks | ||||
|        a :class:`ModuleSpec`. | ||||
| 
 | ||||
| 
 | ||||
| :mod:`importlib.abc` -- Abstract base classes related to import | ||||
|  |  | |||
|  | @ -164,6 +164,8 @@ def reload(module): | |||
|             pkgpath = None | ||||
|         target = module | ||||
|         spec = module.__spec__ = _bootstrap._find_spec(name, pkgpath, target) | ||||
|         if spec is None: | ||||
|             raise ModuleNotFoundError(f"spec not found for the module {name!r}", name=name) | ||||
|         _bootstrap._exec(spec, module) | ||||
|         # The module may have replaced itself in sys.modules! | ||||
|         return sys.modules[name] | ||||
|  |  | |||
|  | @ -197,8 +197,6 @@ def find_module(name, path=None): | |||
| 
 | ||||
| class ReloadTests: | ||||
| 
 | ||||
|     """Test module reloading for builtin and extension modules.""" | ||||
| 
 | ||||
|     def test_reload_modules(self): | ||||
|         for mod in ('tokenize', 'time', 'marshal'): | ||||
|             with self.subTest(module=mod): | ||||
|  | @ -361,6 +359,18 @@ def test_reload_submodule(self): | |||
|             reloaded = self.init.reload(ham) | ||||
|             self.assertIs(reloaded, ham) | ||||
| 
 | ||||
|     def test_module_missing_spec(self): | ||||
|         #Test that reload() throws ModuleNotFounderror when reloading | ||||
|         # a module who's missing a spec. (bpo-29851) | ||||
|         name = 'spam' | ||||
|         with test_util.uncache(name): | ||||
|             module = sys.modules[name] = types.ModuleType(name) | ||||
|             # Sanity check by attempting an import. | ||||
|             module = self.init.import_module(name) | ||||
|             self.assertIsNone(module.__spec__) | ||||
|             with self.assertRaises(ModuleNotFoundError): | ||||
|                 self.init.reload(module) | ||||
| 
 | ||||
| 
 | ||||
| (Frozen_ReloadTests, | ||||
|  Source_ReloadTests | ||||
|  |  | |||
|  | @ -774,6 +774,7 @@ Robert Kern | |||
| Jim Kerr | ||||
| Magnus Kessler | ||||
| Lawrence Kesteloot | ||||
| Garvit Khatri | ||||
| Vivek Khera | ||||
| Dhiru Kholia | ||||
| Akshit Khurana | ||||
|  |  | |||
|  | @ -604,6 +604,9 @@ Library | |||
| - bpo-10379: locale.format_string now supports the 'monetary' keyword argument, | ||||
|   and locale.format is deprecated. | ||||
| 
 | ||||
| - bpo-29851: importlib.reload() now raises ModuleNotFoundError if the | ||||
|   module lacks a spec. | ||||
| 
 | ||||
| - Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, | ||||
|   improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, | ||||
|   Manuel Krebber, and Łukasz Langa. | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Garvit Khatri
						Garvit Khatri