if spec is not None:
break
else:
- raise ImportError(f'No module named {absolute_name!r}')
+ msg = f'No module named {absolute_name!r}'
+ raise ModuleNotFoundError(msg, name=absolute_name)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sys.modules[absolute_name] = module
a :exc:`DeprecationWarning` in Python 3.6 and a :exc:`RuntimeError` in
Python 3.8.
+* With the introduction of :exc:`ModuleNotFoundError`, import system consumers
+ may start expecting import system replacements to raise that more specific
+ exception when appropriate, rather than the less-specific :exc:`ImportError`.
+ To provide future compatibility with such consumers, implementors of
+ alternative import systems that completely replace :func:`__import__` will
+ need to update their implementations to raise the new subclass when a module
+ can't be found at all. Implementors of compliant plugins to the default
+ import system shouldn't need to make any changes, as the default import
+ system will raise the new subclass when appropriate.
+
+
Changes in the C API
--------------------