mirror of https://github.com/python/cpython
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
|
@ -1238,12 +1238,25 @@ class NamespaceLoader:
|
||||||
def module_repr(cls, module):
|
def module_repr(cls, module):
|
||||||
return "<module '{}' (namespace)>".format(module.__name__)
|
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):
|
def load_module(self, fullname):
|
||||||
"""Load a namespace module."""
|
"""Load a namespace module."""
|
||||||
_verbose_message('namespace module loaded with path {!r}', self._path)
|
_verbose_message('namespace module loaded with path {!r}', self._path)
|
||||||
with module_to_load(fullname) as module:
|
with module_to_load(fullname) as module:
|
||||||
|
self.init_module_attrs(module)
|
||||||
module.__path__ = self._path
|
module.__path__ = self._path
|
||||||
module.__package__ = fullname
|
|
||||||
return module
|
return module
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -188,7 +188,7 @@ class InspectLoader(Loader):
|
||||||
load_module = _bootstrap._LoaderBasics.load_module
|
load_module = _bootstrap._LoaderBasics.load_module
|
||||||
|
|
||||||
_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter,
|
_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter,
|
||||||
machinery.ExtensionFileLoader)
|
machinery.ExtensionFileLoader, _bootstrap.NamespaceLoader)
|
||||||
|
|
||||||
|
|
||||||
class ExecutionLoader(InspectLoader):
|
class ExecutionLoader(InspectLoader):
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
import sys
|
|
||||||
import contextlib
|
import contextlib
|
||||||
import unittest
|
from importlib._bootstrap import NamespaceLoader
|
||||||
|
import importlib.abc
|
||||||
|
import importlib.machinery
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
import types
|
||||||
|
import unittest
|
||||||
|
|
||||||
from test.test_importlib import util
|
from test.test_importlib import util
|
||||||
from test.support import run_unittest
|
from test.support import run_unittest
|
||||||
|
@ -286,9 +290,24 @@ class ModuleAndNamespacePackageInSameDir(NamespacePackageTest):
|
||||||
self.assertEqual(a_test.attr, 'in module')
|
self.assertEqual(a_test.attr, 'in module')
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
class ABCTests(unittest.TestCase):
|
||||||
run_unittest(*NamespacePackageTest.__subclasses__())
|
|
||||||
|
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__":
|
if __name__ == "__main__":
|
||||||
test_main()
|
unittest.main()
|
||||||
|
|
|
@ -123,6 +123,10 @@ Core and Builtins
|
||||||
Library
|
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.
|
- Issue #17177: The imp module is pending deprecation.
|
||||||
|
|
||||||
- subprocess: Prevent a possible double close of parent pipe fds when the
|
- 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…
Reference in New Issue