def lowercasewrapper(func):
def wrapper(*args, **kwargs):
return [item.lower() for item in func(*args, **kwargs)]
return wrapper
我理解装饰器的作用,我已经在上面的代码中实现了装饰器并且它可以工作,但我对一些事情我不太确定。
为什么不能将(func)替换为(* args,** kwargs)并在此过程中删除def包装线?我猜测前两行并没有做同样的事情,但对我来说这就是它的样子。好像是:
def lowercasewrapper(accept function)
def wrapper(accept function)
“func”这个词有什么意义?我注意到我可以用任何东西替换那个单词,我的代码仍然有用。我放在@lowercasewrapper下面的函数是否只是输入装饰器而不管'()'中的什么?
此外,有点偏离主题,但单词项目也没有意义吗?我也可以用任何单词替换它,它仍然有效。
如果有人愿意帮助解释和详细解答而不是将我重定向到“什么是装饰者”主题,我将不胜感激。
答案 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的链接)。