函数1
def Typed(**kwargs):
def wrappers(obj):
print("=======>")
for key,val in kwargs.items():
setattr(obj,key,val)
return obj
print("---->")
return wrappers
@Typed(x=2)
def Text():
pass
函数2
def Typed2(func):
def wrappers():
print("=======>")
func()
# return res
print("---->")
return wrappers
@Typed2
def Text2():
pass
函数3
def foo(**kwargs):
pass
1、同时运行两个函数,为什么第一个函数里面的wrappers函数会执行,第二个里面的函数不会执行。
2、为什么第一个函数**kwargs是必须值,第三个函数的**kwargs不是必须的。
第一个问题:问题的本质是没搞懂装饰器@的定义,函数1@被你传参为一个实例,不是函数,返回的是也一个实例对象,不是一个函数定义,等于你在函数1前调用了另一个函数。仅执行一次,不能复用。恰恰第二个函数起到了装饰的作用,是一个不带参数的装饰器,所以它的效果是声明了一个定义,不是运行一个函数,是可以服用的,会在你每次调用函数2时触发,你可以自行测试。
第二个问题:既然是装饰器,它是会自动把被装饰函数作为参数传入的,而且是用位置参数传递的,你修改为关键字参数,又没传参,所以会报错,解决方法可以在位置参数前加上*args
;而函数三没用装饰器,它就是一个可变的关键字参数,自然可以没有