我想知道以下行为是否预期或错误。我使用CPython2.7通过imp.load_source以相同的名称加载模块导致模块合并
创建一个文件x.py
def funcA():
print "funcA of x.py"
def funcB():
print "funcB of x.py"
创建一个文件y.py
def funcB():
print "funcB of y.py"
创建一个文件test.py
import sys, imp
# load x.py as fff
m = imp.load_source('fff', 'x.py')
print dir(m)
print sys.modules.get('fff')
# load y.py as fff
m = imp.load_source('fff', 'y.py')
print dir(m)
print sys.modules.get('fff')
# import and exec func
import fff
fff.funcA()
fff.funcB()
print dir(fff)
结果
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'funcA', 'funcB']
<module 'fff' from 'x.py'>
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'funcA', 'funcB']
<module 'fff' from 'y.py'>
funcA of x.py
funcB of y.py
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'funcA', 'funcB']
我的期望是第二个imp.load_source
将完全用y.py替换模块x.py。实际上,sys.modules.get('fff')
显示为<module 'fff' from 'y.py'>
,但生成的模块类似于x.py和y.py的混合,后者具有优先级。
这是预期或错误?
编辑:我的测试代码有一个错字。更新了结果。
非常感谢您一直注意import.c。我想知道这有什么好的用例。该文件可能对合并更加明确。相同模块中的其他函数,如'load_module'和'reload'具有更好的文档。 – 2013-02-26 17:41:03
有没有一种方式,模块不合并,但被替换? – foobar 2013-12-29 20:51:04
是的,在imp.load_source之前总是有'del sys.modules ['module name']。 – 2014-06-17 00:19:42