https://github.com/python/cpython/commit/1b460fcddc420ce791f7f7bb33b260826034f3c9 commit: 1b460fcddc420ce791f7f7bb33b260826034f3c9 branch: main author: Filipe Laíns <[email protected]> committer: FFY00 <[email protected]> date: 2025-12-09T15:50:50Z summary:
gh-84530: fix namespace package support in modulefinder (#29196) * bpo-40350: fix namespace package support in modulefinder Signed-off-by: Filipe Laíns <[email protected]> * consider that namespace package specs might have the loader set Signed-off-by: Filipe Laíns <[email protected]> * Revert "consider that namespace package specs might have the loader set" This reverts commit 23fb4e0de38466217e932115143db1a9584e35da. Signed-off-by: Filipe Laíns <[email protected]> * Fix load_module and load_package to handle namespace packages Signed-off-by: Filipe Laíns <[email protected]> * Drop _NAMESPACE constant Signed-off-by: Filipe Laíns <[email protected]> * Drop importlib changes Signed-off-by: Filipe Laíns <[email protected]> * Update NamespacePath check Signed-off-by: Filipe Laíns <[email protected]> * Mixed some Signed-off-by: Filipe Laíns <[email protected]> --------- Signed-off-by: Filipe Laíns <[email protected]> files: A Misc/NEWS.d/next/Library/2021-10-23-22-12-13.bpo-40350.t0dQMY.rst M Lib/modulefinder.py M Lib/test/test_modulefinder.py diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py index 7fb19a5c5d1805..b8dccc2dd33afe 100644 --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -66,7 +66,12 @@ def _find_module(name, path=None): file_path = spec.origin - if spec.loader.is_package(name): + # On namespace packages, spec.loader might be None, but + # spec.submodule_search_locations should always be set — check it instead. + if isinstance(spec.submodule_search_locations, importlib.machinery.NamespacePath): + return None, spec.submodule_search_locations, ("", "", _PKG_DIRECTORY) + + if spec.loader.is_package(name): # non-namespace package return None, os.path.dirname(file_path), ("", "", _PKG_DIRECTORY) if isinstance(spec.loader, importlib.machinery.SourceFileLoader): @@ -453,6 +458,11 @@ def load_package(self, fqname, pathname): if newname: fqname = newname m = self.add_module(fqname) + + if isinstance(pathname, importlib.machinery.NamespacePath): + m.__path__ = pathname + return m + m.__file__ = pathname m.__path__ = [pathname] diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py index b64e684f80599f..703bfbf94d7bff 100644 --- a/Lib/test/test_modulefinder.py +++ b/Lib/test/test_modulefinder.py @@ -76,6 +76,18 @@ from sys import version_info """] +namespace_package_test = [ + "module", + ["a", "module"], + ["a.c", "blahblah"], [], + """\ +module.py + import a + import a.c + import blahblah +a/b.py +"""] + absolute_import_test = [ "a.module", ["a", "a.module", @@ -353,6 +365,9 @@ def _do_test(self, info, report=False, debug=0, replace_paths=[], modulefinder_c def test_package(self): self._do_test(package_test) + def test_namespace_package(self): + self._do_test(namespace_package_test) + def test_maybe(self): self._do_test(maybe_test) diff --git a/Misc/NEWS.d/next/Library/2021-10-23-22-12-13.bpo-40350.t0dQMY.rst b/Misc/NEWS.d/next/Library/2021-10-23-22-12-13.bpo-40350.t0dQMY.rst new file mode 100644 index 00000000000000..a5236cc57a021d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-10-23-22-12-13.bpo-40350.t0dQMY.rst @@ -0,0 +1 @@ +Fix support for namespace packages in :mod:`modulefinder`. _______________________________________________ Python-checkins mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3//lists/python-checkins.python.org Member address: [email protected]
