【问题标题】:Decorator flow and process装饰器流程和过程
【发布时间】:2023-04-06 19:37:01
【问题描述】:
def logger(func):
    def inner(*args, **kwargs): #1
        print ('Arguments were: {}, {}'.format(args, kwargs))
        return func(*args, **kwargs) #2
    return inner

def add (x,y):
    return x+y

add = logger(add)
add(1, 2)

代码不使用@logger,基本上用add = logger(add)代替。

def logger(func):
    def inner(*args, **kwargs): #1
        print ('Arguments were: {}, {}'.format(args, kwargs))
        return func(*args, **kwargs) #2
    return inner

@logger
def add (x,y):
    return x+y

add(1, 2)

使用@loggeradd = logger (add) 的代码已被删除。

两者的输出相同且正确

我仍在学习 python 并试图了解装饰器如何为这两个示例工作。

我想知道流程是如何工作的。我知道@loggeradd = logger(add) 相同,然后示例使用add (1,2)。这意味着add(1,2) = logger(add(1,2))?

但是,如果是这种情况,为什么我尝试logger(add(1,2))时不起作用?

基本上我正在尝试结合

add = logger(add)
add(1,2)

类似

logger(add(1,2))

这不起作用。结合它的目的是让我可以更好地理解示例。

【问题讨论】:

    标签: python decorator python-decorators


    【解决方案1】:

    您正在尝试“装饰”add() 函数调用的返回值,而不是 add 函数本身

    适当的等价物是使用:

    logger(add)(1, 2)
    

    所以使用logger() 的返回值作为将1, 2 参数传递给的函数。

    换句话说,您需要替换正确的调用。如果您对装饰器调用的结果使用不同的名称,可能会更容易理解:

    decorated = logger(add)
    decorated(1, 2)
    

    然后简单地将decorated 替换为原来的logger(add) 调用:

    logger(add)(1, 2)
    

    【讨论】:

    • 我设法了解它现在如何与您的正确等效项一起工作。我的看法是,通常一个简单的函数就像函数 (1,2),但现在,如果我将 'logger(add)' 本身视为一个完整的函数,这就是 args 响应参数的原因,我与您的等价物一起获得。
    • 但是 args 怎么知道它应该存储 (1,2) 而不是 (func)?
    • @Newbie 装饰器接受func 并返回inner。然后调用返回的inner() 函数,该函数采用*args
    • 我想我明白了,不知何故。欣赏它。现在我只需要一些时间来消化它。
    猜你喜欢
    • 2019-02-09
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2012-12-23
    • 2016-09-09
    相关资源
    最近更新 更多