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: Nonex.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)

这将适用于模块和对象,但更容易在这样的一个文件中显示。

于 2012-04-30T18:15:46.337 回答