diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2023-11-27 08:53:57 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-27 08:53:57 (GMT) |
commit | f9861e69c913bfaabf57bfa9a0207d19e192dcde (patch) | |
tree | 5505884fdfc1552a34987a3541b79fee271980cb | |
parent | 42df73652dba4937489e34a92dbf184a184c2d93 (diff) | |
download | cpython-f9861e69c913bfaabf57bfa9a0207d19e192dcde.zip cpython-f9861e69c913bfaabf57bfa9a0207d19e192dcde.tar.gz cpython-f9861e69c913bfaabf57bfa9a0207d19e192dcde.tar.bz2 |
[3.12] gh-112414: Fix `AttributeError` when calling `repr()` on a namespace package imported with a custom loader (GH-112425) (#112440)
gh-112414: Fix `AttributeError` when calling `repr()` on a namespace package imported with a custom loader (GH-112425)
(cherry picked from commit 0622839cfedacbb48eba27180fd0f0586fe97771)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
4 files changed, 16 insertions, 3 deletions
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index ec2e56f..d942045 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -824,10 +824,16 @@ def _module_repr_from_spec(spec): """Return the repr to use for the module.""" name = '?' if spec.name is None else spec.name if spec.origin is None: - if spec.loader is None: + loader = spec.loader + if loader is None: return f'<module {name!r}>' + elif ( + _bootstrap_external is not None + and isinstance(loader, _bootstrap_external.NamespaceLoader) + ): + return f'<module {name!r} (namespace) from {list(loader._path)}>' else: - return f'<module {name!r} (namespace) from {list(spec.loader._path)}>' + return f'<module {name!r} ({loader!r})>' else: if spec.has_location: return f'<module {name!r} from {spec.origin!r}>' diff --git a/Lib/test/test_importlib/import_/test___loader__.py b/Lib/test/test_importlib/import_/test___loader__.py index a141639..cb9a032 100644 --- a/Lib/test/test_importlib/import_/test___loader__.py +++ b/Lib/test/test_importlib/import_/test___loader__.py @@ -26,6 +26,10 @@ class SpecLoaderAttributeTests: with util.uncache('blah'), util.import_state(meta_path=[loader]): module = self.__import__('blah') self.assertEqual(loader, module.__loader__) + expected_repr_pattern = ( + r"<module 'blah' \(<test\.test_importlib\..*SpecLoaderMock object at .+>\)>" + ) + self.assertRegex(repr(module), expected_repr_pattern) (Frozen_SpecTests, diff --git a/Lib/test/test_importlib/test_namespace_pkgs.py b/Lib/test/test_importlib/test_namespace_pkgs.py index 65428c3..cdbdecc 100644 --- a/Lib/test/test_importlib/test_namespace_pkgs.py +++ b/Lib/test/test_importlib/test_namespace_pkgs.py @@ -81,7 +81,7 @@ class SingleNamespacePackage(NamespacePackageTest): def test_simple_repr(self): import foo.one - assert repr(foo).startswith("<module 'foo' (namespace) from [") + self.assertTrue(repr(foo).startswith("<module 'foo' (namespace) from [")) class DynamicPathNamespacePackage(NamespacePackageTest): diff --git a/Misc/NEWS.d/next/Library/2023-11-26-13-44-19.gh-issue-112414.kx2E7S.rst b/Misc/NEWS.d/next/Library/2023-11-26-13-44-19.gh-issue-112414.kx2E7S.rst new file mode 100644 index 0000000..058e5a3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-11-26-13-44-19.gh-issue-112414.kx2E7S.rst @@ -0,0 +1,3 @@ +Fix regression in Python 3.12 where calling :func:`repr` on a module that +had been imported using a custom :term:`loader` could fail with +:exc:`AttributeError`. Patch by Alex Waygood. |