diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 45beb51659f5b7..3f4170f7b1cfdd 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -938,6 +938,14 @@ def is_package(cls, fullname): """Return False as built-in modules are never packages.""" return False + @classmethod + def discover(cls, spec=None): + if spec is not None: # assume that built-in modules have no submodule + return + for name in sys.builtin_module_names: + if mod_spec := cls.find_spec(name): + yield mod_spec + class FrozenImporter: diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 5dc11253e0d5c8..b4ab39a869113a 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -5004,6 +5004,26 @@ def func(): actual = self.get_suggestion(func) self.assertIn("forget to import '_io'", actual) + def test_import_builtin_module_typo_suggestion(self): + def func(): + import itertool # noqa: F401 + + actual = self.get_suggestion(func) + self.assertIn("Did you mean: 'itertools'?", actual) + + def test_import_file_module_typo_suggestion(self): + def func(): + import abs # noqa: F401 + + actual = self.get_suggestion(func) + self.assertIn("Did you mean: 'abc'?", actual) + + def test_import_submodule_typo_suggestion(self): + def func(): + import multiprocessing.dumy # noqa: F401 + + actual = self.get_suggestion(func) + self.assertIn("Did you mean: 'multiprocessing.dummy'?", actual) class PurePythonSuggestionFormattingTests(