我有以下代码,我很难理解为什么它按顺序打印语句。
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
是否不运行返回的函数?
答案 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
中并返回。