【发布时间】:2019-05-28 12:46:44
【问题描述】:
我有以下代码,我很难理解为什么它会按顺序打印语句。
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 不运行它返回的函数吗?
【问题讨论】:
-
代码不会运行,因为
registry是main()函数的本地函数,并且没有在register装饰器中定义 -
"在我看来,接下来应该打印 3,因为 f1 已返回" 但
f1只是 返回;它被 not 调用。 (但实际上,对我来说,它会打印2 4 3 1) -
即使
registry是一个预定义的全局变量,输出的第一个值也会是2,因为register在main之前运行。
标签: python python-3.x decorator