Python装饰器中被装饰函数的参数传递机制疑问
解惑装饰器中wrapper的参数传递机制
咱们一步步拆解你给出的代码,把参数传递的逻辑彻底搞明白:
首先,你已经抓准了装饰器的核心替换逻辑:@my_decorator 这个语法糖等价于执行 my_function = my_decorator(my_function)。这一步完成后,原来的my_function函数已经被替换成了wrapper函数——你打印my_function看到的<function my_decorator.<locals>.wrapper...>就是最直接的证明。
接下来重点看调用my_function(1)时发生的完整流程:
- 因为此刻
my_function变量指向的是wrapper函数,所以调用my_function(1)本质上就是调用wrapper(1)。 - 你传入的参数
1会直接被wrapper的参数func_arg接收,也就是func_arg = 1。 - 然后
wrapper内部执行func(func_arg)——这里的func是什么?是my_decorator被调用时传入的原my_function函数(还没被装饰前的那个函数)。所以这一步就是把func_arg(也就是1)传给原my_function,执行它的逻辑print(arg + 1),输出2。 - 最后
wrapper再打印After,整个调用流程结束。
为了让你更直观,咱们把代码执行顺序用伪代码梳理一遍:
- 定义
my_decorator函数,内部嵌套wrapper函数。 - 定义原
my_function函数(接收arg参数)。 - 自动执行
my_function = my_decorator(原my_function):my_decorator接收参数func = 原my_function。- 返回
wrapper函数,覆盖赋值给my_function变量。
- 调用
my_function(1)→ 等价于调用wrapper(1):wrapper接收func_arg = 1。- 打印
Before。 - 调用
func(1)→ 即原my_function(1),输出2。 - 打印
After。
如果以后遇到被装饰函数有多个参数的场景,你可以把wrapper改成用*args和**kwargs来接收任意参数,比如:
def my_decorator(func): def wrapper(*args, **kwargs): print('Before') func(*args, **kwargs) print('After') return wrapper @my_decorator def my_function(a, b, c=3): print(a + b + c) my_function(1, 2) # 输出6,参数1、2被args接收,c用默认值3
这样不管被装饰函数有多少个位置参数或关键字参数,wrapper都能正确把参数传递给原函数啦~
内容的提问来源于stack exchange,提问作者Arkon-v
相关产品推荐
相关产品推荐

