首先装饰器写法
“@ + 函数名”在执行函数上方
python函数中的参数args和*kwargs的含义和用法
在python语言写成的模块中的函数里,常常可以看到函数的参数表列里面有这两个参数,形如:
def some_function(*args, **kwargs):
首先,解释星号的作用,一个星号*的作用是将tuple或者list中的元素进行unpack,分开传入,作为多个参数;两个星号**的作用是把dict类型的数据作为参数传入。
装饰器具体使用
函数process1
def process1(**kwargs):
print(kwargs)
a = kwargs['a']
b = kwargs['b']
print("a+b={}".format(a+b))
执行结果:
process1(a=1,b=3)
函数set_a
def set_a(f):
def wrapper(**kwargs):
key = kwargs['key']
print('start')
print(kwargs)
if key == 1:
f(ccc=123,**kwargs)
else:
return False
print('end')
return wrapper
在process1上添加set_a装饰器
def set_a(f):
def wrapper(**kwargs):
key = kwargs['key']
print('start')
print(kwargs)
if key == 1:
f(ccc=123,**kwargs)
else:
return False
print('end')
return wrapper
@set_a
def process1(**kwargs):
print(kwargs)
a = kwargs['a']
b = kwargs['b']
print("a+b={}".format(a+b))
process1(a=1,b=3,key=1)
执行
process1(a=1,b=3,key=1)
参数key是装饰器set_a中需要用到,得到结果如下,通过装饰器set_a多传入了一个参数ccc=123
在process1上再添加set_b装饰器
def set_a(f):
def wrapper(**kwargs):
key = kwargs['key']
print('start')
print(kwargs)
if key == 1:
f(ccc=123,**kwargs)
else:
return False
print('end')
return wrapper
def set_b(f):
def wrapper(**kwargs):
print(kwargs)
print('start2')
f(**kwargs,dd=2)
print('end2')
return wrapper
@set_a
@set_b
def process1(**kwargs):
print(kwargs)
a = kwargs['a']
b = kwargs['b']
print("a+b={}".format(a+b))
process1(a=1,b=3,key=1)
得到结果如下,通过装饰器set_a多传入了一个参数ccc=123,所有参数会传入set_b函数内,然后又多传入一个参数dd=2