1

関数をグローバルに一時的に無効にするコンテキストマネージャーをPythonで作成したいと思います。そのようなことは一般的に行うことができますか?望ましい動作の例を次に示します。

#in module x
def disable_me(): print "do stuff"

#in module y
import x
def run_me():
    print "run_me"
    x.disable_me()

#in module z
import x
import y
with disable_function(x.disable_me):
    y.run_me()

#desired output: run_me

lambda *args, **kwargs: None原則として、一時的に割り当てることができることは知っていx.disable_meますが、コンテキストマネージャーが実際にこれを行うのに十分な情報を持っているかどうかはわかりません。

4

1 に答える 1

3

変数自体ではなく、含まれているオブジェクトと変数の名前を渡してもかまわないのであれば、これは実際にはかなり簡単です(これは問題にはならないはずです)。

from contextlib import contextmanager

class X:
    def disable_me():
        print("do stuff")

def run_me(x):
    print("run_me")
    x.disable_me()

@contextmanager
def disable_function(obj, name):
    temp = getattr(obj, name)
    setattr(obj, name, lambda: None)
    yield
    setattr(obj, name, temp)

x = X()
with disable_function(x, "disable_me"):
    run_me(x)

これはオブジェクトだけでなくモジュールでも機能しますが、このように1つのファイルで表示する方が簡単です。

于 2012-04-30T18:15:46.337 に答える