summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <brett@python.org>2012-04-16 00:25:23 (GMT)
committerBrett Cannon <brett@python.org>2012-04-16 00:25:23 (GMT)
commit01a76171a0fd890fabcdfe8963d26d218caf08d1 (patch)
tree164dac9ef6414aef7e6dff4e2aa6462b19c867fd
parent7c3e150d06e613571cd7f9ab4cc681f55e766279 (diff)
downloadcpython-01a76171a0fd890fabcdfe8963d26d218caf08d1.zip
cpython-01a76171a0fd890fabcdfe8963d26d218caf08d1.tar.gz
cpython-01a76171a0fd890fabcdfe8963d26d218caf08d1.tar.bz2
Issue #13959: Re-implement imp.load_module() in imp.py.
-rw-r--r--Lib/imp.py29
-rw-r--r--Python/import.c53
2 files changed, 28 insertions, 54 deletions
diff --git a/Lib/imp.py b/Lib/imp.py
index 655bf56..1d7742d 100644
--- a/Lib/imp.py
+++ b/Lib/imp.py
@@ -14,10 +14,37 @@ from _imp import (lock_held, acquire_lock, release_lock, reload,
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
index 747b0dd..06830fe 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -3601,53 +3601,6 @@ imp_load_source(PyObject *self, PyObject *args)
}
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 @@ built-in, frozen or special module and continue search in sys.path.\n\
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 @@ static PyMethodDef imp_methods[] = {
{"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},