3

在有关装饰器和“复合语句”的官方 Python 文档的此页面上,给出了以下代码示例:

[样品开始]

@f1(arg)
@f2
def func(): pass

相当于:

def func(): pass
func = f1(arg)(f2(func))

[样本结束]

但是,我不明白'func = f1(arg)(f2(func))'。我以前从未见过这样的电话,我不知道这意味着什么。是使用不同参数进行多次调用,每对括号包含一个参数(第一个中的'arg',第二个中的'f2(func)'),还是别的什么?我需要了解这一点才能学习装饰器。另外,这在 Python 2.7 中有效吗?我咨询过的关于装饰器的网站之一是关于 Python 3.2 的。

4

3 回答 3

2

你需要知道的是,函数是第一类对象——你可以像ints 或strs 一样传递函数。

f1返回一个函数,因此您发布的内容类似于:

def func(): pass
f1_ret = f1(arg)
f2_ret = f2(func)
func = f1_ret(f2_ret)
于 2012-05-08T20:08:21.997 回答
1

Python 函数调用的结果与其他任何值一样。如果你愿意,你可以func = f1(arg)(f2(func))写成

def func(): pass
x = f2(func)
y = f1(arg)
func = y(x)
于 2012-05-08T20:08:41.263 回答
1

接受参数的装饰器必须返回一个执行实际装饰的函数。所以@f1(arg)调用f1(arg)f1返回一个函数,可以使用通常的(...)符号来调用它:f1(arg)(...). 第二组括号中的内容是什么?被装饰的函数,这是f2(func)因为第二个装饰器。所以把它们放在一起,你就得到了f1(arg)(f2(func))

那么,您缺少的部分是f1返回一个函数,而第二组括号正在调用返回的函数。

于 2012-05-08T20:08:50.773 回答