问题描述
# 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
。