Skip to content

Commit f51c057

Browse files
whitphxhswong3i
authored andcommitted
A better error message from importlib.resources.files() when module spec is None from python/cpython#138531
1 parent c6773a1 commit f51c057

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

importlib_resources/_adapters.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,9 @@ def files(self):
160160
return CompatibilityFiles.SpecPath(self.spec, self._reader)
161161

162162

163-
def wrap_spec(package):
163+
def wrap_spec(spec):
164164
"""
165165
Construct a package spec with traversable compatibility
166166
on the spec/loader/reader.
167167
"""
168-
return SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader)
168+
return SpecLoaderAdapter(spec, TraversableResourcesLoader)

importlib_resources/_common.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,13 @@ def from_package(package: types.ModuleType):
7979
# deferred for performance (python/cpython#109829)
8080
from .future.adapters import wrap_spec
8181

82-
spec = wrap_spec(package)
82+
if package.__spec__ is None:
83+
raise TypeError(
84+
f"Cannot access resources for '{package.__name__ or package!r}' "
85+
"as it does not appear to correspond to an importable module (its __spec__ is None)."
86+
)
87+
88+
spec = wrap_spec(package.__spec__)
8389
reader = spec.loader.get_resource_reader(spec.name)
8490
return reader.files()
8591

importlib_resources/tests/test_resource.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import types
12
import unittest
23
from importlib import import_module
34

@@ -219,5 +220,17 @@ class ResourceFromNamespaceZipTests(
219220
MODULE = 'namespacedata01'
220221

221222

223+
class ResourceFromMainModuleWithNoneSpecTests(unittest.TestCase):
224+
# `__main__.__spec__` can be `None` depending on how it is populated.
225+
# https://docs.python.org/3/reference/import.html#main-spec
226+
def test_main_module_with_none_spec(self):
227+
mainmodule = types.ModuleType("__main__")
228+
229+
self.assertIsNone(mainmodule.__spec__)
230+
231+
with self.assertRaises(TypeError, msg="Cannot access resources for '__main__' as it does not appear to correspond to an importable module (its __spec__ is None)."):
232+
resources.files(mainmodule)
233+
234+
222235
if __name__ == '__main__':
223236
unittest.main()

0 commit comments

Comments
 (0)