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)); char **p_name, char *buf, int *p_buflen));
static int mark_miss Py_PROTO((char *name)); static int mark_miss Py_PROTO((char *name));
static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist, 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, static PyObject * import_submodule Py_PROTO((PyObject *mod,
char *name, char *fullname)); char *name, char *fullname));
@ -1054,7 +1054,7 @@ PyImport_ImportModuleEx(name, globals, locals, fromlist)
} }
Py_DECREF(head); Py_DECREF(head);
if (!ensure_fromlist(tail, fromlist, buf, buflen)) { if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Py_DECREF(tail); Py_DECREF(tail);
return NULL; return NULL;
} }
@ -1203,11 +1203,12 @@ mark_miss(name)
} }
static int static int
ensure_fromlist(mod, fromlist, buf, buflen) ensure_fromlist(mod, fromlist, buf, buflen, recursive)
PyObject *mod; PyObject *mod;
PyObject *fromlist; PyObject *fromlist;
char *buf; char *buf;
int buflen; int buflen;
int recursive;
{ {
int i; int i;
@ -1231,7 +1232,19 @@ ensure_fromlist(mod, fromlist, buf, buflen)
return 0; return 0;
} }
if (PyString_AS_STRING(item)[0] == '*') { if (PyString_AS_STRING(item)[0] == '*') {
PyObject *all;
Py_DECREF(item); 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; continue;
} }
hasit = PyObject_HasAttr(mod, item); hasit = PyObject_HasAttr(mod, item);