栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

通过具有相同名称的imp.load_source加载模块,导致模块合并

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过具有相同名称的imp.load_source加载模块,导致模块合并

这是预期的行为。
参见http://docs.python.org/2/library/imp.html

imp.load_source(name,pathname [,file])

加载并初始化实现为Python源文件的模块,然后返回其模块对象。如果模块已经初始化,它将再次被初始化。name参数用于创建或 访问 模块对象。

由于您的第二个模块与第一个模块具有相同的名称,因此它不会替代第一个模块,但是会合并到第一个模块中。

源代码给了我们相同的答案。

imp
是内置模块,在import.c中定义。
让我们看一下
load_source

static PyObject *load_source_module(char *name, char *pathname, FILE *fp){    ......    m = Pyimport_ExecCodeModuleEx(name, (PyObject *)co, pathname);    Py_DECREF(co);    return m;}

它只是的包装

Pyimport_ExecCodeModuleEx

PyObject *Pyimport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname){    PyObject *modules = Pyimport_GetModuleDict();    PyObject *m, *d, *v;    m = Pyimport_AddModule(name);    ......    d = PyModule_GetDict(m);    ......    v = Pyeval_evalCode((PyCodeObject *)co, d, d);    ......}

现在,我们只需要关注

Pyimport_AddModule
。Python使用它来获取模块对象。您解析的源文件将放入此模块对象。

PyObject *Pyimport_AddModule(const char *name){    PyObject *modules = Pyimport_GetModuleDict();    PyObject *m;    if ((m = PyDict_GetItemString(modules, name)) != NULL &&        PyModule_Check(m))        return m;    m = PyModule_New(name);    if (m == NULL)        return NULL;    if (PyDict_SetItemString(modules, name, m) != 0) {        Py_DECREF(m);        return NULL;    }    Py_DECREF(m);     return m;}

最后,我们找到了答案。给定一个

name
,如果某个模块已经具有
name
,则
name insys.modules
,Python将不会创建新模块,而是会重用该模块。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/669646.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号