为何装饰器在函数装饰阶段触发而非调用时?代码更新时机疑问
装饰器执行时机问题解答
问题1:为什么装饰器会在函数被装饰时触发,而非调用被装饰后的函数时触发?
Python的装饰器@语法是语法糖,本质等价于:
被装饰函数 = 装饰器(被装饰函数)
这行代码会在**函数定义阶段(模块加载、代码执行到函数定义语句时)**直接执行,不是等你调用被装饰后的函数才运行。所以装饰器函数本身会在装饰目标函数的瞬间就触发执行,而非函数调用阶段。
问题2:在代码中,为什么每次装饰函数(例如装饰api4函数)时ls1都会被更新,而不是在调用该函数时才更新?
你贴的代码里,ls1.append((datetime.today(), f.__name__))是直接写在装饰器register_usage的顶层逻辑中的。当用@register_usage装饰api4时,Python会立刻执行register_usage(api4),这行append语句会直接运行,自然就更新了ls1。
如果要实现调用函数时才更新ls1,需要把append逻辑放到装饰器返回的包装函数里,修改后的代码如下:
import datetime ls1=[] def register_usage(f): def wrapper(): ls1.append((datetime.today(), f.__name__)) return f() return wrapper @register_usage def api4(): return 'api4'
这样只有调用api4()时,才会触发wrapper函数里的append操作,进而更新ls1。
内容的提问来源于stack exchange,提问作者Vaggelis Ntaloukas
相关产品推荐
相关产品推荐

