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

Python中外层函数与内层函数调用相关原理及疑问咨询

Python装饰器底层逻辑疑问解答

实验场景与问题

你通过内层函数实验装饰器底层逻辑,写出了如下代码:

def my_decorator(test):
    
    def wrapper():
        print(test)
    return wrapper

hello = my_decorator("sup")
hello()

这段代码能成功打印"sup",但做以下操作时无法正常工作:

  • 移除return wrapper语句
  • 直接调用my_decorator("sup")而不赋值给hello变量

你有两个核心疑问:

  1. return wrapper会自动调用wrapper函数吗?
  2. 使用hello这类函数引用与直接调用my_decorator函数有何区别?

疑问解答

1. return wrapper不会自动调用wrapper函数

return wrapper返回的是wrapper函数本身的对象引用,并没有执行它。真正触发wrapper执行的是后面的hello()——因为hello被赋值为my_decorator("sup")的返回值,也就是wrapper函数对象,调用hello()等价于调用wrapper()。

如果移除return wrapper,my_decorator函数执行完后会默认返回None,此时hello = my_decorator("sup")会让hello变成None,再调用hello()就会抛出TypeError,因为None不是可调用对象。

2. 函数引用与直接调用外层函数的区别

  • 直接调用my_decorator("sup"):这只是执行了外层的my_decorator函数,它会在内部定义wrapper函数,然后返回wrapper的对象引用,但这个返回值没有被保存,也没有被调用,所以wrapper里的print(test)不会执行。
  • 赋值给hello再调用:hello = my_decorator("sup")把my_decorator返回的wrapper函数对象存到了hello变量里,此时hello就是wrapper的别名,调用hello()才会真正执行wrapper函数里的代码,打印出"sup"。

内容的提问来源于stack exchange,提问作者Cayden James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:20:45