summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-11-27 08:53:57 (GMT)
committerGitHub <noreply@github.com>2023-11-27 08:53:57 (GMT)
commitf9861e69c913bfaabf57bfa9a0207d19e192dcde (patch)
tree5505884fdfc1552a34987a3541b79fee271980cb
parent42df73652dba4937489e34a92dbf184a184c2d93 (diff)
downloadcpython-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>
-rw-r--r--Lib/importlib/_bootstrap.py10
-rw-r--r--Lib/test/test_importlib/import_/test___loader__.py4
-rw-r--r--Lib/test/test_importlib/test_namespace_pkgs.py2
-rw-r--r--Misc/NEWS.d/next/Library/2023-11-26-13-44-19.gh-issue-112414.kx2E7S.rst3
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.