Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 183a941

Browse files
Issue #24192: Fix namespace package imports.
1 parent 188c18d commit 183a941

8 files changed

Lines changed: 4509 additions & 4575 deletions

File tree

Lib/importlib/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
except ImportError:
3636
from . import _bootstrap_external
3737
_bootstrap_external._setup(_bootstrap)
38+
_bootstrap._bootstrap_external = _bootstrap_external
3839
else:
3940
_bootstrap_external.__name__ = 'importlib._bootstrap_external'
4041
_bootstrap_external.__package__ = 'importlib'

Lib/importlib/_bootstrap.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
# Bootstrap-related code ######################################################
2424

25+
_bootstrap_external = None
26+
2527
def _wrap(new, old):
2628
"""Simple substitute for functools.update_wrapper."""
2729
for replace in ['__module__', '__name__', '__qualname__', '__doc__']:
@@ -405,7 +407,8 @@ def __eq__(self, other):
405407
def cached(self):
406408
if self._cached is None:
407409
if self.origin is not None and self._set_fileattr:
408-
import _frozen_importlib_external as _bootstrap_external # XXX yuck
410+
if _bootstrap_external is None:
411+
raise NotImplementedError
409412
self._cached = _bootstrap_external._get_cached(self.origin)
410413
return self._cached
411414

@@ -433,7 +436,10 @@ def has_location(self, value):
433436
def spec_from_loader(name, loader, *, origin=None, is_package=None):
434437
"""Return a module spec based on various loader methods."""
435438
if hasattr(loader, 'get_filename'):
436-
from ._bootstrap_external import spec_from_file_location # XXX yuck
439+
if _bootstrap_external is None:
440+
raise NotImplementedError
441+
spec_from_file_location = _bootstrap_external.spec_from_file_location
442+
437443
if is_package is None:
438444
return spec_from_file_location(name, loader=loader)
439445
search = [] if is_package else None
@@ -516,7 +522,10 @@ def _init_module_attrs(spec, module, *, override=False):
516522
if loader is None:
517523
# A backward compatibility hack.
518524
if spec.submodule_search_locations is not None:
519-
from ._bootstrap_external import _NamespaceLoader # XXX yuck
525+
if _bootstrap_external is None:
526+
raise NotImplementedError
527+
_NamespaceLoader = _bootstrap_external._NamespaceLoader
528+
520529
loader = _NamespaceLoader.__new__(_NamespaceLoader)
521530
loader._path = spec.submodule_search_locations
522531
try:
@@ -810,7 +819,6 @@ def load_module(cls, fullname):
810819
This method is deprecated. Use exec_module() instead.
811820
812821
"""
813-
from ._bootstrap_external import _load_module_shim # XXX yuck
814822
return _load_module_shim(cls, fullname)
815823

816824
@classmethod
@@ -1125,6 +1133,7 @@ def _install(sys_module, _imp_module):
11251133
sys.meta_path.append(BuiltinImporter)
11261134
sys.meta_path.append(FrozenImporter)
11271135

1136+
global _bootstrap_external
11281137
import _frozen_importlib_external
1138+
_bootstrap_external = _frozen_importlib_external
11291139
_frozen_importlib_external._install(sys.modules[__name__])
1130-
sys.modules[__name__]._bootstrap_external = _frozen_importlib_external

Lib/importlib/_bootstrap_external.py

Lines changed: 7 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -410,22 +410,6 @@ def _find_module_shim(self, fullname):
410410
return loader
411411

412412

413-
# Typically used by loader classes as a method replacement.
414-
def _load_module_shim(self, fullname):
415-
"""Load the specified module into sys.modules and return it.
416-
417-
This method is deprecated. Use loader.exec_module instead.
418-
419-
"""
420-
spec = spec_from_loader(fullname, self)
421-
if fullname in sys.modules:
422-
module = sys.modules[fullname]
423-
_bootstrap._exec(spec, module)
424-
return sys.modules[fullname]
425-
else:
426-
return _bootstrap._load(spec)
427-
428-
429413
def _validate_bytecode_header(data, source_stats=None, name=None, path=None):
430414
"""Validate the header of the passed-in bytecode against source_stats (if
431415
given) and returning the bytecode that can be compiled by compile().
@@ -517,28 +501,6 @@ def decode_source(source_bytes):
517501

518502
# Module specifications #######################################################
519503

520-
def spec_from_loader(name, loader, *, origin=None, is_package=None):
521-
"""Return a module spec based on various loader methods."""
522-
if hasattr(loader, 'get_filename'):
523-
if is_package is None:
524-
return spec_from_file_location(name, loader=loader)
525-
search = [] if is_package else None
526-
return spec_from_file_location(name, loader=loader,
527-
submodule_search_locations=search)
528-
529-
if is_package is None:
530-
if hasattr(loader, 'is_package'):
531-
try:
532-
is_package = loader.is_package(name)
533-
except ImportError:
534-
is_package = None # aka, undefined
535-
else:
536-
# the default
537-
is_package = False
538-
539-
return _bootstrap.ModuleSpec(name, loader, origin=origin, is_package=is_package)
540-
541-
542504
_POPULATE = object()
543505

544506

@@ -653,8 +615,9 @@ def find_spec(cls, fullname, path=None, target=None):
653615
return None
654616
for loader, suffixes in _get_supported_file_loaders():
655617
if filepath.endswith(tuple(suffixes)):
656-
spec = spec_from_loader(fullname, loader(fullname, filepath),
657-
origin=filepath)
618+
spec = _bootstrap.spec_from_loader(fullname,
619+
loader(fullname, filepath),
620+
origin=filepath)
658621
return spec
659622

660623
@classmethod
@@ -695,7 +658,8 @@ def exec_module(self, module):
695658
'returns None'.format(module.__name__))
696659
_bootstrap._call_with_frames_removed(exec, code, module.__dict__)
697660

698-
load_module = _load_module_shim
661+
def load_module(self, fullname):
662+
return _bootstrap._load_module_shim(self, fullname)
699663

700664

701665
class SourceLoader(_LoaderBasics):
@@ -1061,7 +1025,7 @@ def load_module(self, fullname):
10611025
"""
10621026
# The import system never calls this method.
10631027
_verbose_message('namespace module loaded with path {!r}', self._path)
1064-
return _load_module_shim(self, fullname)
1028+
return _bootstrap._load_module_shim(self, fullname)
10651029

10661030

10671031
# Finders #####################################################################
@@ -1127,7 +1091,7 @@ def _legacy_get_spec(cls, fullname, finder):
11271091
loader = finder.find_module(fullname)
11281092
portions = []
11291093
if loader is not None:
1130-
return spec_from_loader(fullname, loader)
1094+
return _bootstrap.spec_from_loader(fullname, loader)
11311095
spec = _bootstrap.ModuleSpec(fullname, None)
11321096
spec.submodule_search_locations = portions
11331097
return spec

Lib/importlib/abc.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""Abstract base classes related to import."""
2+
from . import _bootstrap
23
from . import _bootstrap_external
34
from . import machinery
45
try:
@@ -152,7 +153,7 @@ def load_module(self, fullname):
152153
"""
153154
if not hasattr(self, 'exec_module'):
154155
raise ImportError
155-
return _bootstrap_external._load_module_shim(self, fullname)
156+
return _bootstrap._load_module_shim(self, fullname)
156157

157158
def module_repr(self, module):
158159
"""Return a module's repr.

Lib/test/test_importlib/util.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def import_importlib(module_name):
4949
fresh = ('importlib',) if '.' in module_name else ()
5050
frozen = support.import_fresh_module(module_name)
5151
source = support.import_fresh_module(module_name, fresh=fresh,
52-
blocked=('_frozen_importlib',))
52+
blocked=('_frozen_importlib', '_frozen_importlib_external'))
5353
return {'Frozen': frozen, 'Source': source}
5454

5555

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ Core and Builtins
3434
- Issue #23911: Move path-based importlib bootstrap code to a separate
3535
frozen module.
3636

37+
- Issue #24192: Fix namespace package imports.
38+
3739
- Issue #24022: Fix tokenizer crash when processing undecodable source code.
3840

3941
- Issue #9951: Added a hex() method to bytes, bytearray, and memoryview.

0 commit comments

Comments
 (0)