[Python-checkins] cpython: Issue #13959: Re-implement imp.load_module() in imp.py.

brett.cannon python-checkins at python.org
Mon Apr 16 02:25:28 CEST 2012


http://hg.python.org/cpython/rev/2df37938b8e1
changeset:   76338:2df37938b8e1
user:        Brett Cannon <brett at python.org>
date:        Sun Apr 15 20:25:23 2012 -0400
summary:
  Issue #13959: Re-implement imp.load_module() in imp.py.

files:
  Lib/imp.py      |  29 +++++++++++++++++++-
  Python/import.c |  53 -------------------------------------
  2 files changed, 28 insertions(+), 54 deletions(-)


diff --git a/Lib/imp.py b/Lib/imp.py
--- a/Lib/imp.py
+++ b/Lib/imp.py
@@ -14,10 +14,37 @@
 from _imp import (get_magic, get_tag, get_suffixes, cache_from_source,
                   source_from_cache)
 # Should be re-implemented here (and mostly deprecated)
-from _imp import (find_module, load_module, load_compiled,
+from _imp import (find_module, load_compiled,
                   load_package, load_source, NullImporter,
                   SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION,
                   PY_RESOURCE, PKG_DIRECTORY, C_BUILTIN, PY_FROZEN,
                   PY_CODERESOURCE, IMP_HOOK)
 
 from importlib._bootstrap import _new_module as new_module
+
+
+def load_module(name, file, filename, details):
+    """Load a module, given information returned by find_module().
+
+    The module name must include the full package name, if any.
+
+    """
+    suffix, mode, type_ = details
+    if mode and (not mode.startswith(('r', 'U'))) or '+' in mode:
+        raise ValueError('invalid file open mode {!r}'.format(mode))
+    elif file is None and type_ in {PY_SOURCE, PY_COMPILED}:
+        msg = 'file object required for import (type code {})'.format(type_)
+        raise ValueError(msg)
+    elif type_ == PY_SOURCE:
+        return load_source(name, filename, file)
+    elif type_ == PY_COMPILED:
+        return load_compiled(name, filename, file)
+    elif type_ == PKG_DIRECTORY:
+        return load_package(name, filename)
+    elif type_ == C_BUILTIN:
+        return init_builtin(name)
+    elif type_ == PY_FROZEN:
+        return init_frozen(name)
+    else:
+        msg =  "Don't know how to import {} (type code {}".format(name, type_)
+        raise ImportError(msg, name=name)
diff --git a/Python/import.c b/Python/import.c
--- a/Python/import.c
+++ b/Python/import.c
@@ -3601,53 +3601,6 @@
 }
 
 static PyObject *
-imp_load_module(PyObject *self, PyObject *args)
-{
-    PyObject *name, *fob, *pathname, *pathname_obj, *ret;
-    char *suffix; /* Unused */
-    char *mode;
-    int type;
-    FILE *fp;
-
-    if (!PyArg_ParseTuple(args, "UOO(ssi):load_module",
-                          &name, &fob, &pathname_obj, &suffix, &mode, &type))
-        return NULL;
-    if (pathname_obj != Py_None) {
-        if (!PyUnicode_FSDecoder(pathname_obj, &pathname))
-            return NULL;
-    }
-    else
-        pathname = NULL;
-
-    if (*mode) {
-        /* Mode must start with 'r' or 'U' and must not contain '+'.
-           Implicit in this test is the assumption that the mode
-           may contain other modifiers like 'b' or 't'. */
-
-        if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
-            PyErr_Format(PyExc_ValueError,
-                         "invalid file open mode %.200s", mode);
-            Py_XDECREF(pathname);
-            return NULL;
-        }
-    }
-    if (fob == Py_None)
-        fp = NULL;
-    else {
-        fp = get_file(NULL, fob, mode);
-        if (fp == NULL) {
-            Py_XDECREF(pathname);
-            return NULL;
-        }
-    }
-    ret = load_module(name, fp, pathname, type, NULL);
-    Py_XDECREF(pathname);
-    if (fp)
-        fclose(fp);
-    return ret;
-}
-
-static PyObject *
 imp_load_package(PyObject *self, PyObject *args)
 {
     PyObject *name, *pathname;
@@ -3757,11 +3710,6 @@
 The module name cannot contain '.'; to search for a submodule of a\n\
 package, pass the submodule name and the package's __path__.");
 
-PyDoc_STRVAR(doc_load_module,
-"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
-Load a module, given information returned by find_module().\n\
-The module name must include the full package name, if any.");
-
 PyDoc_STRVAR(doc_get_magic,
 "get_magic() -> string\n\
 Return the magic number for .pyc or .pyo files.");
@@ -3797,7 +3745,6 @@
     {"get_magic",        imp_get_magic,    METH_NOARGS,  doc_get_magic},
     {"get_tag",          imp_get_tag,      METH_NOARGS,  doc_get_tag},
     {"get_suffixes", imp_get_suffixes, METH_NOARGS,  doc_get_suffixes},
-    {"load_module",      imp_load_module,  METH_VARARGS, doc_load_module},
     {"lock_held",        imp_lock_held,    METH_NOARGS,  doc_lock_held},
     {"acquire_lock", imp_acquire_lock, METH_NOARGS,  doc_acquire_lock},
     {"release_lock", imp_release_lock, METH_NOARGS,  doc_release_lock},

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list