请教装饰器的执行顺序问题

虚心请教,下面是我写的两个装饰器:


def decorator_a(fun):
    print ('decorator_a')
    def inner_a(*args, **kwargs):
        print('inner_a')
        return fun(*args, **kwargs)
    return inner_a
def decorator_b(fun):
    print ('decorator_b')
    def inner_b(*args, **kwargs):
        print('inner_b')
        return fun(*args, **kwargs)
    return inner_b

@decorator_b
@decorator_a
def ls():
    print("func ls")
ls()

运行后,我期望的结果是:

decorator_b
decorator_a
inner_b
inner_a
func ls


实际上是:

decorator_a
decorator_b
inner_b
inner_a
func ls


我的问题是:为什么decorator_a会先被执行?
我是因为兴趣自学的python,很多地方都是摸着石头过河,代码有时候写的不是很直观!望谅解!!

该回答引用ChatGPT

在Python中,装饰器是按照从下往上的顺序应用的。也就是说,先应用最后一个装饰器,然后是倒数第二个,以此类推,最后是最上面的装饰器。因此,在你的代码中,装饰器b先被应用,而装饰器a后被应用。

你可以尝试交换两个装饰器的顺序,这样就会得到你期望的输出。具体来说,修改代码为:

@decorator_a
@decorator_b
def ls():
    print("func ls")
ls()

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^