mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	gh-104310: Rename the New Function in importlib.util (gh-105255)
The original name wasn't as clear as it could have been. This change includes the following: * rename the function * change the default value for "disable_check" to False * add clues to the docstring that folks should probably not use the function --------- Co-authored-by: Kirill Podoprigora <kirill.bast9@mail.ru>
This commit is contained in:
		
							parent
							
								
									7799c8e678
								
							
						
					
					
						commit
						34c63b86d3
					
				
					 3 changed files with 41 additions and 18 deletions
				
			
		|  | @ -116,12 +116,24 @@ def find_spec(name, package=None): | |||
| # is imported by runpy, which means we want to avoid any unnecessary | ||||
| # dependencies.  Thus we use a class. | ||||
| 
 | ||||
| class allowing_all_extensions: | ||||
|     """A context manager that lets users skip the compatibility check. | ||||
| class _incompatible_extension_module_restrictions: | ||||
|     """A context manager that can temporarily skip the compatibility check. | ||||
| 
 | ||||
|     NOTE: This function is meant to accommodate an unusual case; one | ||||
|     which is likely to eventually go away.  There's is a pretty good | ||||
|     chance this is not what you were looking for. | ||||
| 
 | ||||
|     WARNING: Using this function to disable the check can lead to | ||||
|     unexpected behavior and even crashes.  It should only be used during | ||||
|     extension module development. | ||||
| 
 | ||||
|     If "disable_check" is True then the compatibility check will not | ||||
|     happen while the context manager is active.  Otherwise the check | ||||
|     *will* happen. | ||||
| 
 | ||||
|     Normally, extensions that do not support multiple interpreters | ||||
|     may not be imported in a subinterpreter.  That implies modules | ||||
|     that do not implement multi-phase init. | ||||
|     that do not implement multi-phase init or that explicitly of out. | ||||
| 
 | ||||
|     Likewise for modules import in a subinterpeter with its own GIL | ||||
|     when the extension does not support a per-interpreter GIL.  This | ||||
|  | @ -130,10 +142,14 @@ class allowing_all_extensions: | |||
| 
 | ||||
|     In both cases, this context manager may be used to temporarily | ||||
|     disable the check for compatible extension modules. | ||||
| 
 | ||||
|     You can get the same effect as this function by implementing the | ||||
|     basic interface of multi-phase init (PEP 489) and lying about | ||||
|     support for mulitple interpreters (or per-interpreter GIL). | ||||
|     """ | ||||
| 
 | ||||
|     def __init__(self, disable_check=True): | ||||
|         self.disable_check = disable_check | ||||
|     def __init__(self, *, disable_check): | ||||
|         self.disable_check = bool(disable_check) | ||||
| 
 | ||||
|     def __enter__(self): | ||||
|         self.old = _imp._override_multi_interp_extensions_check(self.override) | ||||
|  |  | |||
|  | @ -653,7 +653,7 @@ def test_magic_number(self): | |||
| 
 | ||||
| 
 | ||||
| @unittest.skipIf(_interpreters is None, 'subinterpreters required') | ||||
| class AllowingAllExtensionsTests(unittest.TestCase): | ||||
| class IncompatibleExtensionModuleRestrictionsTests(unittest.TestCase): | ||||
| 
 | ||||
|     ERROR = re.compile("^<class 'ImportError'>: module (.*) does not support loading in subinterpreters") | ||||
| 
 | ||||
|  | @ -678,8 +678,8 @@ def run_with_shared_gil(self, script): | |||
|     @unittest.skipIf(_testsinglephase is None, "test requires _testsinglephase module") | ||||
|     def test_single_phase_init_module(self): | ||||
|         script = textwrap.dedent(''' | ||||
|             import importlib.util | ||||
|             with importlib.util.allowing_all_extensions(): | ||||
|             from importlib.util import _incompatible_extension_module_restrictions | ||||
|             with _incompatible_extension_module_restrictions(disable_check=True): | ||||
|                 import _testsinglephase | ||||
|             ''') | ||||
|         with self.subTest('check disabled, shared GIL'): | ||||
|  | @ -688,8 +688,8 @@ def test_single_phase_init_module(self): | |||
|             self.run_with_own_gil(script) | ||||
| 
 | ||||
|         script = textwrap.dedent(f''' | ||||
|             import importlib.util | ||||
|             with importlib.util.allowing_all_extensions(False): | ||||
|             from importlib.util import _incompatible_extension_module_restrictions | ||||
|             with _incompatible_extension_module_restrictions(disable_check=False): | ||||
|                 import _testsinglephase | ||||
|             ''') | ||||
|         with self.subTest('check enabled, shared GIL'): | ||||
|  | @ -713,8 +713,8 @@ def test_incomplete_multi_phase_init_module(self): | |||
|             ''') | ||||
| 
 | ||||
|         script = prescript + textwrap.dedent(''' | ||||
|             import importlib.util | ||||
|             with importlib.util.allowing_all_extensions(): | ||||
|             from importlib.util import _incompatible_extension_module_restrictions | ||||
|             with _incompatible_extension_module_restrictions(disable_check=True): | ||||
|                 module = module_from_spec(spec) | ||||
|                 loader.exec_module(module) | ||||
|             ''') | ||||
|  | @ -724,8 +724,8 @@ def test_incomplete_multi_phase_init_module(self): | |||
|             self.run_with_own_gil(script) | ||||
| 
 | ||||
|         script = prescript + textwrap.dedent(''' | ||||
|             import importlib.util | ||||
|             with importlib.util.allowing_all_extensions(False): | ||||
|             from importlib.util import _incompatible_extension_module_restrictions | ||||
|             with _incompatible_extension_module_restrictions(disable_check=False): | ||||
|                 module = module_from_spec(spec) | ||||
|                 loader.exec_module(module) | ||||
|             ''') | ||||
|  | @ -738,8 +738,8 @@ def test_incomplete_multi_phase_init_module(self): | |||
|     @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") | ||||
|     def test_complete_multi_phase_init_module(self): | ||||
|         script = textwrap.dedent(''' | ||||
|             import importlib.util | ||||
|             with importlib.util.allowing_all_extensions(): | ||||
|             from importlib.util import _incompatible_extension_module_restrictions | ||||
|             with _incompatible_extension_module_restrictions(disable_check=True): | ||||
|                 import _testmultiphase | ||||
|             ''') | ||||
|         with self.subTest('check disabled, shared GIL'): | ||||
|  | @ -748,8 +748,8 @@ def test_complete_multi_phase_init_module(self): | |||
|             self.run_with_own_gil(script) | ||||
| 
 | ||||
|         script = textwrap.dedent(f''' | ||||
|             import importlib.util | ||||
|             with importlib.util.allowing_all_extensions(False): | ||||
|             from importlib.util import _incompatible_extension_module_restrictions | ||||
|             with _incompatible_extension_module_restrictions(disable_check=False): | ||||
|                 import _testmultiphase | ||||
|             ''') | ||||
|         with self.subTest('check enabled, shared GIL'): | ||||
|  |  | |||
|  | @ -0,0 +1,7 @@ | |||
| In the beta 1 release we added a utility function for extension module | ||||
| authors, to use when testing their module for support in multiple | ||||
| interpreters or under a per-interpreter GIL.  The name of that function has | ||||
| changed from ``allowing_all_extensions`` to | ||||
| ``_incompatible_extension_module_restrictions``.  The default for the | ||||
| "disable_check" argument has change from ``True`` to ``False``, to better | ||||
| match the new function name. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Eric Snow
						Eric Snow