mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
Issue #23014: Make importlib.abc.Loader.create_module() required when
importlib.abc.Loader.exec_module() is also defined. Before this change, create_module() was optional **and** could return None to trigger default semantics. This change now reduces the options for choosing default semantics to one and in the most backporting-friendly way (define create_module() to return None).
This commit is contained in:
parent
863c69cfeb
commit
02d8454002
11 changed files with 2440 additions and 2347 deletions
|
@ -1055,6 +1055,10 @@ def module_from_spec(spec):
|
|||
# If create_module() returns `None` then it means default
|
||||
# module creation should be used.
|
||||
module = spec.loader.create_module(spec)
|
||||
elif hasattr(spec.loader, 'exec_module'):
|
||||
_warnings.warn('starting in Python 3.6, loaders defining exec_module() '
|
||||
'must also define create_module()',
|
||||
DeprecationWarning, stacklevel=2)
|
||||
if module is None:
|
||||
module = _new_module(spec.name)
|
||||
_init_module_attrs(spec, module)
|
||||
|
@ -1298,6 +1302,10 @@ class FrozenImporter:
|
|||
"""
|
||||
return cls if _imp.is_frozen(fullname) else None
|
||||
|
||||
@classmethod
|
||||
def create_module(cls, spec):
|
||||
"""Use default semantics for module creation."""
|
||||
|
||||
@staticmethod
|
||||
def exec_module(module):
|
||||
name = module.__spec__.name
|
||||
|
@ -1411,6 +1419,9 @@ class _LoaderBasics:
|
|||
tail_name = fullname.rpartition('.')[2]
|
||||
return filename_base == '__init__' and tail_name != '__init__'
|
||||
|
||||
def create_module(self, spec):
|
||||
"""Use default semantics for module creation."""
|
||||
|
||||
def exec_module(self, module):
|
||||
"""Execute the module."""
|
||||
code = self.get_code(module.__name__)
|
||||
|
@ -1771,6 +1782,9 @@ class _NamespaceLoader:
|
|||
def get_code(self, fullname):
|
||||
return compile('', '<string>', 'exec', dont_inherit=True)
|
||||
|
||||
def create_module(self, spec):
|
||||
"""Use default semantics for module creation."""
|
||||
|
||||
def exec_module(self, module):
|
||||
pass
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue