mirror of
https://github.com/python/cpython
synced 2024-09-15 23:57:10 +00:00
gh-112414: Fix AttributeError
when calling repr()
on a namespace package imported with a custom loader (#112425)
This commit is contained in:
parent
e954ac7205
commit
0622839cfe
|
@ -824,10 +824,16 @@ def _module_repr_from_spec(spec):
|
||||||
"""Return the repr to use for the module."""
|
"""Return the repr to use for the module."""
|
||||||
name = '?' if spec.name is None else spec.name
|
name = '?' if spec.name is None else spec.name
|
||||||
if spec.origin is None:
|
if spec.origin is None:
|
||||||
if spec.loader is None:
|
loader = spec.loader
|
||||||
|
if loader is None:
|
||||||
return f'<module {name!r}>'
|
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:
|
else:
|
||||||
return f'<module {name!r} (namespace) from {list(spec.loader._path)}>'
|
return f'<module {name!r} ({loader!r})>'
|
||||||
else:
|
else:
|
||||||
if spec.has_location:
|
if spec.has_location:
|
||||||
return f'<module {name!r} from {spec.origin!r}>'
|
return f'<module {name!r} from {spec.origin!r}>'
|
||||||
|
|
|
@ -23,6 +23,10 @@ def test___loader__(self):
|
||||||
with util.uncache('blah'), util.import_state(meta_path=[loader]):
|
with util.uncache('blah'), util.import_state(meta_path=[loader]):
|
||||||
module = self.__import__('blah')
|
module = self.__import__('blah')
|
||||||
self.assertEqual(loader, module.__loader__)
|
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,
|
(Frozen_SpecTests,
|
||||||
|
|
|
@ -80,7 +80,7 @@ def test_cant_import_other(self):
|
||||||
|
|
||||||
def test_simple_repr(self):
|
def test_simple_repr(self):
|
||||||
import foo.one
|
import foo.one
|
||||||
assert repr(foo).startswith("<module 'foo' (namespace) from [")
|
self.assertTrue(repr(foo).startswith("<module 'foo' (namespace) from ["))
|
||||||
|
|
||||||
|
|
||||||
class DynamicPathNamespacePackage(NamespacePackageTest):
|
class DynamicPathNamespacePackage(NamespacePackageTest):
|
||||||
|
|
|
@ -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.
|
Loading…
Reference in a new issue