以下の動作が予想されるか、バグかどうかを知りたいと思います。私が作成します作成したファイルtest.pyモジュールをimp.load_sourceでモジュールをロードして同じ名前でモジュールの合併を行います
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)
をファイルy.py
def funcB():
print "funcB of y.py"
をファイルx.py
def funcA():
print "funcA of x.py"
def funcB():
print "funcB of x.py"
をCPython2.7
を使用しています結果
['__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の組み合わせのようなもので、後者が優先されます。
これは問題なのですか、それともバグですか?
EDIT:テストコードに誤字がありました。結果を更新しました。
大変ありがとうございます。私はこれの良いユースケースが何か疑問に思います。この文書は、合併についてより明白になるかもしれない。 'load_module'や' reload'のような同じモジュール内の他の関数は、はるかに良いドキュメントを持っています。 –
モジュールがマージされずに置き換えられる方法はありますか? – foobar
はい、常に、imp.load_sourceの前に 'del sys.modules ['モジュール名']'があります。 –