为什么我的装饰器按此顺序执行代码?

时间:2019-05-28 12:46:45

标签: python python-3.x decorator

我有以下代码,我很难理解为什么它按顺序打印语句。

def main():
    print('1')
    registry=[]

def register(func):
    print('2')
    registry.append(func)
    return func

@register
def f1():
    print('3')
print('4')
f1()
main()

此代码显示:

1
2
4
3

但是我想知道为什么它不打印:

1
2
3
4

当调用@register时,我了解到调用了register(f1)时,它将打印2,然后返回f1。对我来说,自返回3以来,似乎应该再打印f1了。但是相反,f1直到最后一个f1()语句才被调用。 return func是否不运行返回的函数?

1 个答案:

答案 0 :(得分:1)

考虑使用装饰器语法的等效代码。另外,我们将registry设为预定义的全局变量,以便代码实际运行。

registry = []

def main():
    print('1')
    #registry=[]

def register(func):
    print('2')
    registry.append(func)
    return func

def f1():
    print('3')

f1 = register(f1)
print('4')
f1()
main()

第一个调用的函数是register,因此第一个输出的值是2。接下来,print('4')输出4。第三,调用f1并输出3。最后,main被调用并输出1

register从不打电话 f1;只需将其添加到列表registry中并返回。