Added support for __all__, which should be a list of modules to be

imported when the user says "from package import *".
This commit is contained in:
Guido van Rossum 1997-09-08 16:07:11 +00:00
parent c8bf884248
commit 9905ef9669

View File

@ -1000,7 +1000,7 @@ static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
char **p_name, char *buf, int *p_buflen));
static int mark_miss Py_PROTO((char *name));
static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
char *buf, int buflen));
char *buf, int buflen, int recursive));
static PyObject * import_submodule Py_PROTO((PyObject *mod,
char *name, char *fullname));
@ -1054,7 +1054,7 @@ PyImport_ImportModuleEx(name, globals, locals, fromlist)
}
Py_DECREF(head);
if (!ensure_fromlist(tail, fromlist, buf, buflen)) {
if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Py_DECREF(tail);
return NULL;
}
@ -1203,11 +1203,12 @@ mark_miss(name)
}
static int
ensure_fromlist(mod, fromlist, buf, buflen)
ensure_fromlist(mod, fromlist, buf, buflen, recursive)
PyObject *mod;
PyObject *fromlist;
char *buf;
int buflen;
int recursive;
{
int i;
@ -1231,7 +1232,19 @@ ensure_fromlist(mod, fromlist, buf, buflen)
return 0;
}
if (PyString_AS_STRING(item)[0] == '*') {
PyObject *all;
Py_DECREF(item);
/* See if the package defines __all__ */
if (recursive)
continue; /* Avoid endless recursion */
all = PyObject_GetAttrString(mod, "__all__");
if (all == NULL)
PyErr_Clear();
else {
if (!ensure_fromlist(mod, all, buf, buflen, 1))
return 0;
Py_DECREF(all);
}
continue;
}
hasit = PyObject_HasAttr(mod, item);