0
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. 另外,有点跑题了,但是item这个词也没有意义吧?我也可以用任何单词替换它,它仍然有效。

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

4

1 回答 1

3

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

@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 的链接)。

于 2013-10-27T04:54:20.923 回答