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

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:注意最后一行返回wrapper,就像函数wrapper本身一样。这就是为什么您不能删除该部分;该函数实际上正在构建一个要返回的已更改函数。

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

    所以!考虑到这一点,下面是装饰师正在做的事情:

    • 调用lowercasewrapper(f)(其中,f显然假定返回一个不可数的字符串)
    • lowercasewrapper定义了另一个函数,该函数接受一些任意参数,然后对这些参数调用f,然后返回结果,但将项转换为小写。
    • 然后返回修改后的函数

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