次の動作が予想されるのか、バグなのか知りたいのですが。私は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']
私の期待は、2番目imp.load_source
がモジュールx.pyをy.pyに完全に置き換えることでした。実際sys.modules.get('fff')
には表示されます<module 'fff' from 'y.py'>
が、結果のモジュールはx.pyとy.pyの組み合わせのようであり、後者が優先されます。
これは予想されることですか、それともバグですか?
編集:私のテストコードにタイプミスがありました。結果を更新しました。