我想知道以下行为是预期的还是错误的。我正在使用 CPython2.7
创建一个文件 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 的混合,后者具有优先级。
这是预期的还是错误的?
编辑:我的测试代码有错字。更新了结果。