Understanding a specific decorator, Why is there a function inside a function?
1 2 3 4 | def lowercasewrapper(func): def wrapper(*args, **kwargs): return [item.lower() for item in func(*args, **kwargs)] return wrapper |
我知道装饰师做什么,我已经将上面的装饰器实现到我的代码中,它可以工作,但是我对一些事情有点不确定。
为什么不能将(func)替换为(*args,**kwargs),并在此过程中删除def包装线?我猜前两行不会做同样的事情,但对我来说这就是它的样子。好像是:
1 2 | def lowercasewrapper(accept function) def wrapper(accept function) |
号
这里"func"这个词的意思是什么?我注意到我可以用任何东西替换这个词,我的代码仍然有效。我放在@lowercasewrapper下面的函数是否只是馈送到decorator中,而不管"()"中有什么?
还有,有点离题,但单词项也没有意义,对吗?我也可以用任何词来代替它,但它仍然有效。
如果有人能帮助我,解释并详细回答我的问题,而不是把我引向"什么是装饰师"的线索,我将不胜感激。
简短的版本是,一个修饰符实际上把这个:
1 2 3 | @decorated def f(*args): # function body |
在这方面:
1 2 3 | def f(*args): # function body f = decorated(f) |
号
所以您需要内部函数的原因是修饰器必须返回一个函数,否则上面的内容没有意义。考虑到这一点:
点1:注意最后一行返回
第2点和第3点:没错,它只是一个任意变量名,在这个函数之外没有任何意义。
所以!考虑到这一点,下面是装饰师正在做的事情:
- 调用
lowercasewrapper(f) (其中,f 显然假定返回一个不可数的字符串) lowercasewrapper 定义了另一个函数,该函数接受一些任意参数,然后对这些参数调用f,然后返回结果,但将项转换为小写。- 然后返回修改后的函数
这里最大的障碍可能是返回函数的想法,而不是返回调用函数的结果。如果这对你没有意义的话,请阅读一流的功能(或参阅Leon Young的链接)。