装饰器中的包装器角色:为什么返回包装器而不调用它



这里有类似的问题,但我找不到任何东西来清楚地回答我的问题。我不明白为什么下面的两块代码会有这样的行为。

因此,无论何时运行文件,都会打印以下代码(注意:我之前在这里有"已保存",但下面的一条注释更正了我(:

def outerFunction(function):
def wrapper():
function()
print('wrapper')
wrapper()

@outerFunction
def innerFunction():
print('innerFunction')
return

但是以下代码需要调用内部函数才能打印:

def outerFunction(function):
def wrapper():
function()
print('wrapper')
return wrapper

@outerFunction
def innerFunction():
print('innerFunction')
return
innerFunction()

为了更好地理解我所做的努力:阅读教程,阅读这里的帖子,修改代码。

我知道,当外部函数被声明为decorator时,它会被自动调用,return wrapper就是这样做的,所以以我的理解水平,我可以编写decorator并使它们工作,但显然,在没有很好地理解它们的情况下这样做是不理想的。我很难理解wrapper((return wrapper之间的区别。

Decorator语法是函数应用程序的快捷方式。装饰器在执行装饰的def语句后立即调用,并使用

@outerFunction
def innerFunction():
print('innerFunction')
return

完全等同于(除了一些明显的特定于实现的优化,以减少加载/存储操作的数量(

def innerFunction():
print('innerFunction')
return
innerFunction = outerFunction(innerFunction)

在第一种情况下,不再有绑定到innerFunction的函数;在执行outerFunction时立即执行它,然后将值None绑定到名称innerFunction

在第二种情况下,innerFunction绑定到包装器本身,包装器将调用(每次调用(原始innerFunction

最新更新