我想知道以下行爲是否預期或錯誤。我使用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