我只是不了解此包装器参数的工作原理?

问题描述

# This version only accepts one argument
# def shout(fn):
#     def wrapper(name):
#         return fn(name).upper()
#     return wrapper

# This version works with any number of args
def shout(fn):
    def wrapper(*args,**kwargs):
        return fn(*args,**kwargs).upper()
    return wrapper

@shout
def greet(name):
    return f"Hi,I'm {name}."

@shout
def order(main,side):
    return f"Hi,I'd like the {main},with a side of {side},please."

@shout
def lol():
    return "lol"

print(greet("todd"))
print(order(side="burger",main="fries"))
print(lol())

在上面的代码中,

def wrapper(*args,**kwargs):

print(f"abc is {fn.__name__}")

    return fn(*args,**kwargs).upper()

    return wrapper

执行包装函数时,它如何知道要分配给,* args和** kwargs的参数的值。这里我们没有定义参数的值,而是给func参数。

side="burger",main="fries".

**kwargs open up the dictionary but when did we defined such dictionary?

如何将side =“ burger”,main =“ fries”设置为包装函数的参数,为什么将它们分配给args和kwargs? 为什么将给fync的参数分配给包装函数的参数?

解决方法

它们在您调用函数时设置。调用包装程序时,所有位置参数都打包到args中,所有关键字参数都放在kwargs中,然后将其解压缩并传递给包装的函数。

,

致电时

order(side="burger",main="fries")

您实际上是在使用这些参数调用wrapper()

这是分配**kwargs的时间。

wrapper()然后继续用order()*args调用您的实际函数**kwargs