diff options
author | Brett Cannon <brett@python.org> | 2012-04-16 00:25:23 (GMT) |
---|---|---|
committer | Brett Cannon <brett@python.org> | 2012-04-16 00:25:23 (GMT) |
commit | 01a76171a0fd890fabcdfe8963d26d218caf08d1 (patch) | |
tree | 164dac9ef6414aef7e6dff4e2aa6462b19c867fd | |
parent | 7c3e150d06e613571cd7f9ab4cc681f55e766279 (diff) | |
download | cpython-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.py | 29 | ||||
-rw-r--r-- | Python/import.c | 53 |
2 files changed, 28 insertions, 54 deletions
@@ -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}, |