已获取被装饰函数参数,如何获取装饰器test_decorator的参数a、b、c?
获取装饰器的参数值方法
默认情况下,functools.wraps 只会复制原函数的元数据,不会保留装饰器自身的参数。要获取 test_decorator 的参数 a、b、c,需要在装饰器内部手动将这些参数绑定到包装函数的属性中,具体步骤如下:
1. 修改装饰器,存储参数
修改装饰器代码,把装饰器的参数保存为包装函数的自定义属性:
import functools def test_decorator(a, b, c): def decorator(function): @functools.wraps(function) def wrapper(*args, **kwargs): return function(*args, **kwargs) # 将装饰器参数存入wrapper的自定义属性 wrapper.decorator_params = {'a': a, 'b': b, 'c': c} return wrapper return decorator @test_decorator(a=1, b=2, c=3) def test(d, e, f): return None
2. 获取装饰器参数
现在可以直接通过被装饰函数的属性读取参数:
# 获取所有装饰器参数 print(test.decorator_params) # 输出: {'a': 1, 'b': 2, 'c': 3} # 单独获取某个参数 print(test.decorator_params['b']) # 输出: 2
补充说明
如果无法修改原装饰器代码,没有办法直接获取这些参数——因为装饰器执行时的参数不会自动被留存,必须提前在装饰器内部做存储逻辑。
内容的提问来源于stack exchange,提问作者Iain MacCormick
相关产品推荐
相关产品推荐

