2012-05-12 12 views
4

私の猿がモジュールにパッチを適用した場合:Pythonでのサルのパッチ適用は直接インポートに影響しますか?

# mokeypatch.py 
import other_module 

def replacement(*args, **kwargs): 
    pass 

other_module.some_func = replacement 

これは直接some_funcをインポートモジュールに影響を与えるのでしょうか、それは輸入の順序に依存しますか? 3番目のモジュールが次のような場合:

まず、このコードが実行され、次に猿のパッチが実行されます。 third_module.some_funcは古いものでしょうか?

答えて

4

はい、古い機能を指します。

from mod import funcmod2にする場合、funcは、mod2の範囲にバインドされます。
Monkeypatching mod.funcは、新しい機能にmod.funcをバインドしますが、どちらもmodmod.funcmod2.funcも存在することを知っている - と彼らは(内部的に、彼らはどこかにそれを知っているかもしれません)なかった場合でも、それは今交換したりする必要がある場合、彼らは知りませんでした。インポートされた名前を再バインドすることは問題となる理由

実用例このされています。それはリバウンドだった場合、あなたは今無限再帰と元の関数を呼び出す方法はありませんがなければならないと思い

# monkeypatch.py 
import other_module 
from other_module import func as orig_func 
def replacement(): 
    do_stuff() 
    orig_func() 
    do_stuff() 
other_module.func = replacement 

+0

はい、私はこの回帰を数回しました。 :) –

+0

しかし、サルパッチコードが最初に実行される場合、third_moduleは新しいfuncを指していますか? –

関連する問題