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:
parent
fa712ca1ed
commit
f48f11cd79
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue