在Python源码中,解释器如何实现函数装饰器的解析与执行?当定义一个使用装饰器的函数时,如`@decorator def func(): pass`,Python解释器在编译阶段会将`@decorator`视为语法糖。具体实现上,解释器会先加载装饰器对象,然后在函数定义完成后立即将函数对象作为参数传递给装饰器,即等价于`func = decorator(func)`。这一过程发生在函数定义的执行阶段,由解释器调用`PyEval_EvalCodeEx`等相关函数完成。
常见问题是:为何装饰器函数必须返回一个可调用对象?这是因为装饰后的`func`实际上是装饰器返回的结果,若返回值不可调用,则后续对`func()`的调用会引发`TypeError`。这要求开发者在设计装饰器时需确保其返回适当的函数或类实例。