mirror of
https://github.com/python/cpython.git
synced 2025-07-19 17:25:54 +00:00
Issue #15767: Introduce ModuleNotFoundError, a subclass of
ImportError. The exception is raised by import when a module could not be found. Technically this is defined as no viable loader could be found for the specified module. This includes ``from ... import`` statements so that the module usage is consistent for all situations where import couldn't find what was requested. This should allow for the common idiom of:: try: import something except ImportError: pass to be updated to using ModuleNotFoundError and not accidentally mask ImportError messages that should propagate (e.g. issues with a loader). This work was driven by the fact that the ``from ... import`` statement needed to be able to tell the difference between an ImportError that simply couldn't find a module (and thus silence the exception so that ceval can raise it) and an ImportError that represented an actual problem.
This commit is contained in:
parent
638ce0779b
commit
b1611e2772
17 changed files with 424 additions and 408 deletions
|
@ -68,7 +68,15 @@ class ImportTests(unittest.TestCase):
|
|||
def tearDown(self):
|
||||
unload(TESTFN)
|
||||
|
||||
setUp = tearDown
|
||||
def test_import_raises_ModuleNotFoundError(self):
|
||||
with self.assertRaises(ModuleNotFoundError):
|
||||
import something_that_should_not_exist_anywhere
|
||||
|
||||
def test_from_import_raises_ModuleNotFoundError(self):
|
||||
with self.assertRaises(ModuleNotFoundError):
|
||||
from something_that_should_not_exist_anywhere import blah
|
||||
with self.assertRaises(ModuleNotFoundError):
|
||||
from importlib import something_that_should_not_exist_anywhere
|
||||
|
||||
def test_case_sensitivity(self):
|
||||
# Brief digression to test that import is case-sensitive: if we got
|
||||
|
@ -487,7 +495,7 @@ func_filename = func.__code__.co_filename
|
|||
header = f.read(12)
|
||||
code = marshal.load(f)
|
||||
constants = list(code.co_consts)
|
||||
foreign_code = test_main.__code__
|
||||
foreign_code = importlib.import_module.__code__
|
||||
pos = constants.index(1)
|
||||
constants[pos] = foreign_code
|
||||
code = type(code)(code.co_argcount, code.co_kwonlyargcount,
|
||||
|
@ -1014,16 +1022,5 @@ class ImportTracebackTests(unittest.TestCase):
|
|||
importlib.SourceLoader.load_module = old_load_module
|
||||
|
||||
|
||||
def test_main(verbose=None):
|
||||
run_unittest(ImportTests, PycacheTests, FilePermissionTests,
|
||||
PycRewritingTests, PathsTests, RelativeImportTests,
|
||||
OverridingImportBuiltinTests,
|
||||
ImportlibBootstrapTests,
|
||||
TestSymbolicallyLinkedPackage,
|
||||
ImportTracebackTests)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Test needs to be a package, so we can do relative imports.
|
||||
from test.test_import import test_main
|
||||
test_main()
|
||||
unittest.main()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue