SF Patch #441791, with changes: when "import foo.bar" fails with an

exception in the execution of bar, ensure that foo.bar exists.
(Previously, while sys.modules['foo.bar'] would exist, foo.bar would
only be created upon successful execution of bar.  This is
inconvenient; some would say wrong. :-)
This commit is contained in:
Guido van Rossum 2001-07-23 13:27:49 +00:00
parent fa712ca1ed
commit f48f11cd79
1 changed files with 16 additions and 4 deletions

View File

@ -1789,7 +1789,7 @@ static PyObject *
import_submodule(PyObject *mod, char *subname, char *fullname) import_submodule(PyObject *mod, char *subname, char *fullname)
{ {
PyObject *modules = PyImport_GetModuleDict(); PyObject *modules = PyImport_GetModuleDict();
PyObject *m; PyObject *m, *res = NULL;
/* Require: /* Require:
if mod == None: subname == fullname if mod == None: subname == fullname
@ -1829,9 +1829,21 @@ import_submodule(PyObject *mod, char *subname, char *fullname)
m = load_module(fullname, fp, buf, fdp->type); m = load_module(fullname, fp, buf, fdp->type);
if (fp) if (fp)
fclose(fp); fclose(fp);
if (m != NULL && mod != Py_None) { if (mod != Py_None) {
if (PyObject_SetAttrString(mod, subname, m) < 0) { /* Irrespective of the success of this load, make a
Py_DECREF(m); reference to it in the parent package module.
A copy gets saved in the modules dictionary
under the full name, so get a reference from
there, if need be. (The exception is when
the load failed with a SyntaxError -- then
there's no trace in sys.modules. In that case,
of course, do nothing extra.) */
res = m;
if (res == NULL)
res = PyDict_GetItemString(modules, fullname);
if (res != NULL &&
PyObject_SetAttrString(mod, subname, res) < 0) {
Py_XDECREF(m);
m = NULL; m = NULL;
} }
} }