[Python-checkins] cpython: Issue #15767: Add ModuleNotFoundError.

eric.snow python-checkins at python.org
Wed Sep 7 19:56:37 EDT 2016


https://hg.python.org/cpython/rev/90549c3c609c
changeset: 103262:90549c3c609c
user: Eric Snow <ericsnowcurrently at gmail.com>
date: Wed Sep 07 15:42:32 2016 -0700
summary:
 Issue #15767: Add ModuleNotFoundError.
files:
 Doc/c-api/exceptions.rst | 2 ++
 Doc/library/exceptions.rst | 13 +++++++++++--
 Include/pyerrors.h | 1 +
 Lib/_compat_pickle.py | 7 +++++++
 Lib/test/exception_hierarchy.txt | 1 +
 Lib/test/test_pickle.py | 8 ++++++++
 Misc/NEWS | 3 +++
 Objects/exceptions.c | 9 +++++++++
 8 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst
--- a/Doc/c-api/exceptions.rst
+++ b/Doc/c-api/exceptions.rst
@@ -782,6 +782,8 @@
 +-----------------------------------------+---------------------------------+----------+
 | :c:data:`PyExc_ImportError` | :exc:`ImportError` | |
 +-----------------------------------------+---------------------------------+----------+
+| :c:data:`PyExc_ModuleNotFoundError` | :exc:`ModuleNotFoundError` | |
++-----------------------------------------+---------------------------------+----------+
 | :c:data:`PyExc_IndexError` | :exc:`IndexError` | |
 +-----------------------------------------+---------------------------------+----------+
 | :c:data:`PyExc_InterruptedError` | :exc:`InterruptedError` | |
diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst
--- a/Doc/library/exceptions.rst
+++ b/Doc/library/exceptions.rst
@@ -170,8 +170,9 @@
 
 .. exception:: ImportError
 
- Raised when an :keyword:`import` statement fails to find the module definition
- or when a ``from ... import`` fails to find a name that is to be imported.
+ Raised when the :keyword:`import` statement has troubles trying to
+ load a module. Also raised when the "from list" in ``from ... import``
+ has a name that cannot be found.
 
 The :attr:`name` and :attr:`path` attributes can be set using keyword-only
 arguments to the constructor. When set they represent the name of the module
@@ -181,6 +182,14 @@
 .. versionchanged:: 3.3
 Added the :attr:`name` and :attr:`path` attributes.
 
+.. exception:: ModuleNotFoundError
+
+ A subclass of :exc:`ImportError` which is raised by :keyword:`import`
+ when a module could not be located. It is also raised when ``None``
+ is found in :data:`sys.modules`.
+
+ .. versionadded:: 3.6
+
 
 .. exception:: IndexError
 
diff --git a/Include/pyerrors.h b/Include/pyerrors.h
--- a/Include/pyerrors.h
+++ b/Include/pyerrors.h
@@ -160,6 +160,7 @@
 PyAPI_DATA(PyObject *) PyExc_FloatingPointError;
 PyAPI_DATA(PyObject *) PyExc_OSError;
 PyAPI_DATA(PyObject *) PyExc_ImportError;
+PyAPI_DATA(PyObject *) PyExc_ModuleNotFoundError;
 PyAPI_DATA(PyObject *) PyExc_IndexError;
 PyAPI_DATA(PyObject *) PyExc_KeyError;
 PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt;
diff --git a/Lib/_compat_pickle.py b/Lib/_compat_pickle.py
--- a/Lib/_compat_pickle.py
+++ b/Lib/_compat_pickle.py
@@ -242,3 +242,10 @@
 
 for excname in PYTHON3_OSERROR_EXCEPTIONS:
 REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'OSError')
+
+PYTHON3_IMPORTERROR_EXCEPTIONS = (
+ 'ModuleNotFoundError',
+)
+
+for excname in PYTHON3_IMPORTERROR_EXCEPTIONS:
+ REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'ImportError')
diff --git a/Lib/test/exception_hierarchy.txt b/Lib/test/exception_hierarchy.txt
--- a/Lib/test/exception_hierarchy.txt
+++ b/Lib/test/exception_hierarchy.txt
@@ -14,6 +14,7 @@
 +-- BufferError
 +-- EOFError
 +-- ImportError
+ +-- ModuleNotFoundError
 +-- LookupError
 | +-- IndexError
 | +-- KeyError
diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py
--- a/Lib/test/test_pickle.py
+++ b/Lib/test/test_pickle.py
@@ -335,6 +335,9 @@
 if (module2, name2) == ('exceptions', 'OSError'):
 attr = getattribute(module3, name3)
 self.assertTrue(issubclass(attr, OSError))
+ elif (module2, name2) == ('exceptions', 'ImportError'):
+ attr = getattribute(module3, name3)
+ self.assertTrue(issubclass(attr, ImportError))
 else:
 module, name = mapping(module2, name2)
 if module3[:1] != '_':
@@ -401,6 +404,11 @@
 if exc is not OSError and issubclass(exc, OSError):
 self.assertEqual(reverse_mapping('builtins', name),
 ('exceptions', 'OSError'))
+ elif exc is not ImportError and issubclass(exc, ImportError):
+ self.assertEqual(reverse_mapping('builtins', name),
+ ('exceptions', 'ImportError'))
+ self.assertEqual(mapping('exceptions', name),
+ ('exceptions', name))
 else:
 self.assertEqual(reverse_mapping('builtins', name),
 ('exceptions', name))
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -8043,6 +8043,9 @@
 - Issue #18137: Detect integer overflow on precision in float.__format__()
 and complex.__format__().
 
+- Issue #15767: Introduce ModuleNotFoundError which is raised when a module
+ could not be found.
+
 - Issue #18183: Fix various unicode operations on strings with large unicode
 codepoints.
 
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -706,6 +706,13 @@
 "module.");
 
 /*
+ * ModuleNotFoundError extends ImportError
+ */
+
+MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
+ "Module not found.");
+
+/*
 * OSError extends Exception
 */
 
@@ -2469,6 +2476,7 @@
 PRE_INIT(SystemExit)
 PRE_INIT(KeyboardInterrupt)
 PRE_INIT(ImportError)
+ PRE_INIT(ModuleNotFoundError)
 PRE_INIT(OSError)
 PRE_INIT(EOFError)
 PRE_INIT(RuntimeError)
@@ -2541,6 +2549,7 @@
 POST_INIT(SystemExit)
 POST_INIT(KeyboardInterrupt)
 POST_INIT(ImportError)
+ POST_INIT(ModuleNotFoundError)
 POST_INIT(OSError)
 INIT_ALIAS(EnvironmentError, OSError)
 INIT_ALIAS(IOError, OSError)
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /