了解特定的装饰器,为什么函数内部有函数?

时间:2013-10-27 04:35:59

标签: python decorator

def lowercasewrapper(func):
    def wrapper(*args, **kwargs):
        return [item.lower() for item in func(*args, **kwargs)]
    return wrapper

我理解装饰器的作用,我已经在上面的代码中实现了装饰器并且它可以工作,但我对一些事情我不太确定。

  1. 为什么不能将(func)替换为(* args,** kwargs)并在此过程中删除def包装线?我猜测前两行并没有做同样的事情,但对我来说这就是它的样子。好像是:

    def lowercasewrapper(accept function) 
        def wrapper(accept function)
    
  2. “func”这个词有什么意义?我注意到我可以用任何东西替换那个单词,我的代码仍然有用。我放在@lowercasewrapper下面的函数是否只是输入装饰器而不管'()'中的什么?

  3. 此外,有点偏离主题,但单词项目也没有意义吗?我也可以用任何单词替换它,它仍然有效。

  4. 如果有人愿意帮助解释和详细解答而不是将我重定向到“什么是装饰者”主题,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

简短的版本是装饰者实际上是这样的:

@decorated
def f(*args):
    # function body

进入这个:

def f(*args):
    # function body
f = decorated(f)

所以你需要内部函数的原因是装饰器必须返回一个函数,否则上面没有意义。考虑到这一点:

第1点:注意最后一行返回wrapper,如函数wrapper本身。这就是为什么你不能删除那部分;该函数实际上构建了一个改变的函数来返回。

第2点和第3点:你是对的,它只是一个任意的变量名,在这个函数之外没有任何意义。

原来如此!考虑到这一点,这是装饰者正在发生的事情:

    调用
  • lowercasewrapper(f)(显然假设f返回可迭代的字符串)
  • lowercasewrapper定义另一个带有一些任意参数的函数,然后在这些参数上调用f,然后返回结果,但将项目转换为小写
  • lowercasewrapper然后返回更改的函数

这里最大的障碍可能是返回一个函数而不是返回调用函数的结果。如果这对你没有意义,请阅读一流的功能(或参见Leon Young的链接)。