You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,整个调用流程结束。

为了让你更直观,咱们把代码执行顺序用伪代码梳理一遍:

  1. 定义my_decorator函数,内部嵌套wrapper函数。
  2. 定义原my_function函数(接收arg参数)。
  3. 自动执行my_function = my_decorator(原my_function):
    • my_decorator接收参数func = 原my_function。
    • 返回wrapper函数,覆盖赋值给my_function变量。
  4. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:40:35