Python中外层函数与内层函数调用相关原理及疑问咨询
Python装饰器底层逻辑疑问解答
实验场景与问题
你通过内层函数实验装饰器底层逻辑,写出了如下代码:
def my_decorator(test): def wrapper(): print(test) return wrapper hello = my_decorator("sup") hello()
这段代码能成功打印"sup",但做以下操作时无法正常工作:
- 移除
return wrapper语句 - 直接调用
my_decorator("sup")而不赋值给hello变量
你有两个核心疑问:
return wrapper会自动调用wrapper函数吗?- 使用
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
相关产品推荐
相关产品推荐

