4

モジュールにモンキーパッチを適用する場合:

# mokeypatch.py
import other_module

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

other_module.some_func = replacement

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

# third_module.py
from other_module import some_func

最初にこのコードが実行され、次にモンキーパッチが実行されます。third_module.some_func古いものになりますか?

4

1 に答える 1

4

はい、古い関数を指します。

from mod import func内部mod2で行うfunc場合、のスコープにバインドされますmod2
モンキーパッチは新しい関数mod.funcにバインドされますが、存在することすらわかりません-そして、たとえ存在したとしても(内部的にはどこかでそれを知っているかもしれません)、それを置き換える必要があるのか​​、今なのかわかりませんでした。mod.funcmodmod.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

リバウンドされた場合、再帰は無限になり、元の関数を呼び出す方法はありません。

于 2012-05-12T09:18:53.957 に答える