理解一个特定的装饰器,为什么在一个函数中有一个函数?

2024-09-29 17:23:05 发布

您现在位置:Python中文网/ 问答频道 /正文

def lowercasewrapper(func):
    def wrapper(*args, **kwargs):
        return [item.lower() for item in func(*args, **kwargs)]
    return wrapper

我了解decorator是做什么的,我已经将上面的decorator实现到我的代码中,并且它可以工作,但是我对一些事情有点不确定。你知道吗

  1. 为什么不能用(*args,**kwargs)替换(func)并在此过程中删除def包装行?我猜前两行做的不一样,但对我来说就是这样。好像是:

    def lowercasewrapper(accept function) 
        def wrapper(accept function)
    
  2. “func”这个词在这里有什么意义?我注意到我可以用任何东西替换这个词,我的代码仍然有效。我放在@lowercasewrapper下面的函数是否直接输入到decorator中,而不管“()”中的内容是什么?

  3. 另外,有点离题,但这个词的项目也没有意义,对吧?我也可以用任何一个词来代替它,它仍然有效。

如果有人能提供帮助,详细解释和回答,而不是把我引向“什么是装饰师”的话题,我将不胜感激。你知道吗


Tags: 代码forreturndefargsfunctiondecoratoritem
1条回答
网友
1楼 · 发布于 2024-09-29 17:23:05

简而言之,装饰师实际上是这样做的:

@decorated
def f(*args):
    # function body

对此:

def f(*args):
    # function body
f = decorated(f)

因此,需要内部函数的原因是decorator必须返回一个函数,否则上述操作毫无意义。记住这一点:

第1点:注意最后一行返回wrapper,就像函数wrapper本身一样。这就是为什么不能删除该部分;函数实际上是在构建一个经过修改的函数来返回。你知道吗

第2点和第3点:你说得对,它只是一个任意变量名,在这个函数之外没有任何意义。你知道吗

所以!考虑到这一点,以下是装饰师的情况:

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

这里最大的障碍可能是返回函数的想法,而不是返回调用函数的结果。如果这对你来说毫无意义,请阅读关于一流函数的文章(或参阅Leon Young的链接)。你知道吗

相关问题 更多 >

    热门问题