mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
conform the the InspectLoader ABC. Perk of this is that runpy/-m can now work with namespace packages.
This commit is contained in:
		
							parent
							
								
									645ab68f25
								
							
						
					
					
						commit
						13d8ff9c5b
					
				
					 5 changed files with 1156 additions and 1079 deletions
				
			
		|  | @ -1238,12 +1238,25 @@ def __init__(self, name, path, path_finder): | |||
|     def module_repr(cls, module): | ||||
|         return "<module '{}' (namespace)>".format(module.__name__) | ||||
| 
 | ||||
|     def is_package(self, fullname): | ||||
|         return True | ||||
| 
 | ||||
|     def get_source(self, fullname): | ||||
|         return '' | ||||
| 
 | ||||
|     def get_code(self, fullname): | ||||
|         return compile('', '<string>', 'exec', dont_inherit=True) | ||||
| 
 | ||||
|     def init_module_attrs(self, module): | ||||
|         module.__loader__ = self | ||||
|         module.__package__ = module.__name__ | ||||
| 
 | ||||
|     def load_module(self, fullname): | ||||
|         """Load a namespace module.""" | ||||
|         _verbose_message('namespace module loaded with path {!r}', self._path) | ||||
|         with module_to_load(fullname) as module: | ||||
|             self.init_module_attrs(module) | ||||
|             module.__path__ = self._path | ||||
|             module.__package__ = fullname | ||||
|             return module | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -188,7 +188,7 @@ def init_module_attrs(self, module): | |||
|     load_module = _bootstrap._LoaderBasics.load_module | ||||
| 
 | ||||
| _register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter, | ||||
|             machinery.ExtensionFileLoader) | ||||
|             machinery.ExtensionFileLoader, _bootstrap.NamespaceLoader) | ||||
| 
 | ||||
| 
 | ||||
| class ExecutionLoader(InspectLoader): | ||||
|  |  | |||
|  | @ -1,7 +1,11 @@ | |||
| import sys | ||||
| import contextlib | ||||
| import unittest | ||||
| from importlib._bootstrap import NamespaceLoader | ||||
| import importlib.abc | ||||
| import importlib.machinery | ||||
| import os | ||||
| import sys | ||||
| import types | ||||
| import unittest | ||||
| 
 | ||||
| from test.test_importlib import util | ||||
| from test.support import run_unittest | ||||
|  | @ -286,9 +290,24 @@ def test_module_before_namespace_package(self): | |||
|         self.assertEqual(a_test.attr, 'in module') | ||||
| 
 | ||||
| 
 | ||||
| def test_main(): | ||||
|     run_unittest(*NamespacePackageTest.__subclasses__()) | ||||
| class ABCTests(unittest.TestCase): | ||||
| 
 | ||||
|     def setUp(self): | ||||
|         self.loader = NamespaceLoader('foo', ['pkg'], | ||||
|                                       importlib.machinery.PathFinder) | ||||
| 
 | ||||
|     def test_is_package(self): | ||||
|         self.assertTrue(self.loader.is_package('foo')) | ||||
| 
 | ||||
|     def test_get_code(self): | ||||
|         self.assertTrue(isinstance(self.loader.get_code('foo'), types.CodeType)) | ||||
| 
 | ||||
|     def test_get_source(self): | ||||
|         self.assertEqual(self.loader.get_source('foo'), '') | ||||
| 
 | ||||
|     def test_abc_isinstance(self): | ||||
|         self.assertTrue(isinstance(self.loader, importlib.abc.InspectLoader)) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     test_main() | ||||
|     unittest.main() | ||||
|  |  | |||
|  | @ -123,6 +123,10 @@ Core and Builtins | |||
| Library | ||||
| ------- | ||||
| 
 | ||||
| - Issue #18058, 18057: Make the namespace package loader meet the | ||||
|   importlib.abc.InspectLoader ABC, allowing for namespace packages to work with | ||||
|   runpy. | ||||
| 
 | ||||
| - Issue #17177: The imp module is pending deprecation. | ||||
| 
 | ||||
| - subprocess: Prevent a possible double close of parent pipe fds when the | ||||
|  |  | |||
							
								
								
									
										2185
									
								
								Python/importlib.h
									
										
									
									
									
								
							
							
						
						
									
										2185
									
								
								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