For instance: # `a` is an empty directory, a PEP 420 namespace package >>> import importlib.util >>> importlib.util.find_spec('a') ModuleSpec(name='a', loader=None, origin='namespace', submodule_search_locations=_NamespacePath(['/tmp/x/a'])) https://docs.python.org/3/library/importlib.html#importlib.machinery.ModuleSpec.origin > ... Normally “origin” should be set, but it may be None (the default) which indicates it is unspecified (e.g. for namespace packages). above the `origin` is `'namespace'` https://docs.python.org/3/library/importlib.html#importlib.machinery.ModuleSpec.submodule_search_locations > List of strings for where to find submodules, if a package (None otherwise). However the `_NamespacePath` object above is not indexable: >>> x = importlib.util.find_spec('a').submodule_search_locations >>> x[0] Traceback (most recent call last): File "", line 1, in TypeError: '_NamespacePath' object does not support indexing I can work around however with: >>> next(iter(x)) '/tmp/x/a' ====================== so I guess a few things can/should come out of this: - Document the `'namespace'` origin - Document that `submodule_search_paths` is a Sized[str] instead - Add `__getitem__` to `_NamespacePath` such that it implements the full `Sized` protocol
Hmmm, it appears this was changed in python3.7 to have `None` for the origin instead of `'namespace'` -- however the `submodule_search_locations` is still not indexable: >>> importlib.util.find_spec('a') ModuleSpec(name='a', loader=None, submodule_search_locations=_NamespacePath(['/tmp/x/a'])) >>> importlib.util.find_spec('a').origin >>> spec = importlib.util.find_spec('a') >>> spec.submodule_search_locations _NamespacePath(['/tmp/x/a']) >>> spec.submodule_search_locations[0] Traceback (most recent call last): File "", line 1, in TypeError: '_NamespacePath' object does not support indexing