装饰器中使用了可变参数列表,就可以支持了不同函数中有不同参数个数的情况,要是函数中有关键字参数嘞,那该如何定义:
先看关键字参数的用法:用双星号
**
定义关键字参数
def f3(func_name1,func_name2,**kw):
print(func_name1+func_name2)
print(kw)
f3('test,','test2',a=1,b=2,c='123')
-----------------------------------------------
输出:
test,test2
{'a': 1, 'b': 2, 'c': '123'}
且看定义的f3
使用装饰器:
import time
def decorator(func):
def wrapper(*args):
print(time.time())
func(*args)
return wrapper
decorator
def f1(func_name):
print('Hello world!' + func_name)
@decorator
def f2(func_name1,func_name2):
print(func_name1+func_name2)
@decorator
def f3(func_name1,func_name2,**kw):
print(func_name1+func_name2)
print(kw)
f3('test,','test2',a=1,b=2,c='123')
--------------------------------------------------
输出:
Traceback (most recent call last):
File "E:/projects/python_learn/twelve/c8.py", line 27, in <module>
f3('test,','test2',a=1,b=2,c='123')
TypeError: wrapper() got an unexpected keyword argument 'a'
这样就报错的了。
解决办法:仿照在装饰器中定义的可变参数列表*args
,再定义一个关键字参数:
import time
def decorator(func):
def wrapper(*args,**kw):
print(time.time())
func(*args,**kw)
return wrapper
@decorator
def f1(func_name):
print('Hello world!' + func_name)
@decorator
def f2(func_name1,func_name2):
print(func_name1+func_name2)
@decorator
def f3(func_name1,func_name2,**kw):
print(func_name1+func_name2)
print(kw)
f1('hello')
f2('he','llo')
f3('test,','test2',a=1,b=2,c='123')
-------------------------------------------------------
输出:
1535902344.7262278
Hello world!hello
1535902344.7262278
hello
1535902344.7262278
test,test2
{'a': 1, 'b': 2, 'c': '123'}
这样,f3
中也打印了时间,也能使用定义的装饰器了。
这个装饰器才算通用性更强!
在装饰器中的一个写法(小技巧
):func(*args,**kw)
,这样使用的话,不管调用的函数有多少个参数,还是有关键字参数,或者我们并不知道函数中的参数是什么样子的,都可以用*args
,**kw
来调用的。