Kaydet (Commit) 13d8ff9c authored tarafından Brett Cannon's avatar Brett Cannon

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.
üst 645ab68f
...@@ -1238,12 +1238,25 @@ class NamespaceLoader: ...@@ -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): ...@@ -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):
......
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): ...@@ -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 ...@@ -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
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment