python - 可以用 Python 中的上下文管理器全局替换函数吗?

标签 python contextmanager

我想用 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但我不清楚上下文管理器是否有足够的信息来实际执行此操作。

最佳答案

这实际上相当容易做到,只要您不介意传递包含对象和变量名称,而不是变量本身(这不应该是问题)。

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)

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

关于python - 可以用 Python 中的上下文管理器全局替换函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10388411/

相关文章:

python - 如何访问上下文管理器的属性?

Python:在类方法上使用 contextmanager 的意外行为

python - 在 python 中 json.load 文件的等效方法?

Python 记录器不打印调试消息,尽管它设置正确

python - 使用 pymongo 和 Flask 对 MongoDB 结果中的项目进行聚合和计数

python - 无法解析超链接关系的 URL

python - Graphite 烯在上下文管理器中运行所有解析器

python - 使用子进程python获取命令行执行抛出的错误

python - 为什么我的列表不会填充?索引错误 : List Out of Range

python - Heroku Flask-SocketIO 错误 __init__() 得到意外的关键字参数 'server_hostname