changeset: 97380:bbe6b215df5d branch: 3.5 parent: 97374:1a144ff2d78b parent: 97379:cf3a62a8d786 user: Brett Cannon date: Fri Aug 14 11:06:43 2015 -0700 files: Misc/NEWS description: Merge from 3.5.0 for issue #24492 diff -r 1a144ff2d78b -r bbe6b215df5d Lib/test/test_import/__init__.py --- a/Lib/test/test_import/__init__.py Fri Aug 14 11:47:41 2015 +1200 +++ b/Lib/test/test_import/__init__.py Fri Aug 14 11:06:43 2015 -0700 @@ -324,6 +324,19 @@ with self.assertRaisesRegex(ImportError, "^cannot import name 'bogus'"): from re import bogus + def test_from_import_AttributeError(self): + # Issue #24492: trying to import an attribute that raises an + # AttributeError should lead to an ImportError. + class AlwaysAttributeError: + def __getattr__(self, _): + raise AttributeError + + module_name = 'test_from_import_AttributeError' + self.addCleanup(unload, module_name) + sys.modules[module_name] = AlwaysAttributeError() + with self.assertRaises(ImportError): + from test_from_import_AttributeError import does_not_exist + @skip_if_dont_write_bytecode class FilePermissionTests(unittest.TestCase): diff -r 1a144ff2d78b -r bbe6b215df5d Misc/NEWS --- a/Misc/NEWS Fri Aug 14 11:47:41 2015 +1200 +++ b/Misc/NEWS Fri Aug 14 11:06:43 2015 -0700 @@ -37,6 +37,10 @@ Core and Builtins ----------------- +- Issue #24492: A "package" lacking a __name__ attribute when trying to perform + a ``from .. import ...`` statement will trigger an ImportError instead of an + AttributeError. + - Issue #24667: Resize odict in all cases that the underlying dict resizes. Library diff -r 1a144ff2d78b -r bbe6b215df5d Python/ceval.c --- a/Python/ceval.c Fri Aug 14 11:47:41 2015 +1200 +++ b/Python/ceval.c Fri Aug 14 11:06:43 2015 -0700 @@ -5085,19 +5085,24 @@ sys.modules. */ PyErr_Clear(); pkgname = _PyObject_GetAttrId(v, &PyId___name__); - if (pkgname == NULL) - return NULL; + if (pkgname == NULL) { + goto error; + } fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name); Py_DECREF(pkgname); - if (fullmodname == NULL) + if (fullmodname == NULL) { return NULL; + } x = PyDict_GetItem(PyImport_GetModuleDict(), fullmodname); - if (x == NULL) - PyErr_Format(PyExc_ImportError, "cannot import name %R", name); - else - Py_INCREF(x); Py_DECREF(fullmodname); + if (x == NULL) { + goto error; + } + Py_INCREF(x); return x; + error: + PyErr_Format(PyExc_ImportError, "cannot import name %R", name); + return NULL; } static int