Python装饰器中内部函数inner如何访问参数num?
关于Python装饰器中参数访问的问题解答
核心原因:函数参数作用域与装饰器执行流程
要搞懂这个问题,从两个关键点拆解:
函数参数的作用域规则:每个函数的参数都是自身局部作用域的变量,只有该函数能直接访问。外部函数无法读取内部函数的参数,反之内部函数可以访问外部函数的变量(闭包特性),但这里的
num是inner自己的参数,和外层facto_decorator没有关联。装饰器的实际执行流程:
- 当用
@facto_decorator装饰facto函数时,Python会自动执行facto = facto_decorator(facto)。这个阶段facto_decorator只接收被装饰的原函数func作为参数,完全没接触到num——毕竟此时还没调用facto函数,自然不会传入num的值,所以facto_decorator根本看不到num。 - 当你调用
facto(a)的时候,其实调用的是facto_decorator返回的inner函数,也就是inner(a)。这时候num是inner的形参,a是传入的实参,num属于inner的局部作用域,所以inner可以直接访问它。
- 当用
结合代码实例再梳理
比如你输入a=3:
- 装饰阶段:Python把原
facto函数传给facto_decorator,facto_decorator返回inner函数,此时facto变量指向的是inner。 - 第一次调用
facto(3):实际执行inner(3),num=3被传入inner,inner用这个参数检查memory字典,调用原facto函数计算结果并保存。 - 第二次调用
facto(3):还是执行inner(3),num=3再次传入,inner直接从memory取结果返回。
整个过程中,facto_decorator自始至终都没机会接触到num参数,只有inner作为实际被调用的函数,才会接收并使用num。
内容的提问来源于stack exchange,提问作者Sumit Kumar
相关产品推荐
相关产品推荐

