]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Added support for __all__, which should be a list of modules to be
authorGuido van Rossum <guido@python.org>
Mon, 8 Sep 1997 16:07:11 +0000 (16:07 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 8 Sep 1997 16:07:11 +0000 (16:07 +0000)
imported when the user says "from package import *".

Python/import.c

index 95e5aa9e65020e62749ab33840c0a39d4f7abcb4..3bf205f25e9342f18b57b1deda262443dfce0e20 100644 (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);