首页 文章

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

提问于
浏览
0
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下面的函数是否只是输入装饰器而不管'()'中的什么?

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

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

1 回答

  • 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的链接),如果这对你没有意义的话 .

相关问题