如何从外部脚本控制wrapt装饰器的启用与禁用
解决方法
要实现跨脚本动态禁用wrapt装饰器,核心是让enabled参数对应的可调用对象支持外部修改状态,以下是具体实现:
修改script_1.py的装饰器控制逻辑
把固定返回True的_enabled函数替换为一个可动态切换状态的类实例,让外部脚本能修改它的状态来控制装饰器是否启用:
# script_1.py import wrapt class DecoratorToggle: def __init__(self): self.enabled = True # 默认启用装饰器 def __call__(self): return self.enabled # 创建全局的开关实例 decorator_toggle = DecoratorToggle() @wrapt.decorator(enabled=decorator_toggle) def my_decorator(wrapped, instance, args, kwargs): print('decorator enabled') return wrapped(*args, **kwargs) @my_decorator def my_function(): print('function enabled')
在script_2.py中调用并禁用装饰器
导入开关实例和目标函数,先修改开关状态为False,再调用函数即可跳过装饰器逻辑:
# script_2.py from script_1 import my_function, decorator_toggle # 临时禁用装饰器 decorator_toggle.enabled = False my_function() # 仅输出: function enabled # 可选:调用后恢复装饰器启用状态,不影响后续其他调用 decorator_toggle.enabled = True
原理说明
wrapt的enabled参数要求传入一个可调用对象,每次执行被装饰函数前,都会调用该对象来判断是否启用装饰器。通过将这个可调用对象设计为带有可修改属性的类实例,就能在外部脚本动态控制装饰器的启用状态。
内容的提问来源于stack exchange,提问作者Nicola
相关产品推荐
相关产品推荐

