mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Issue #13959: Re-implement imp.load_module() in imp.py.
This commit is contained in:
		
							parent
							
								
									7c3e150d06
								
							
						
					
					
						commit
						01a76171a0
					
				
					 2 changed files with 28 additions and 54 deletions
				
			
		
							
								
								
									
										29
									
								
								Lib/imp.py
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								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) | ||||
|  |  | |||
|  | @ -3600,53 +3600,6 @@ imp_load_source(PyObject *self, PyObject *args) | |||
|     return m; | ||||
| } | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
|  | @ -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}, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Brett Cannon
						Brett Cannon