- 介绍修饰器之前首先要介绍两个参数
*args和**kwargs
*args:是一个列表,传入的参数会被放进列表里
**kwargs:是一个字典,传入的参数以键值对的形式存放到字典里
def f(*args):
print(args)
f(1, 3, 5)
[out]: (1, 3, 5)
def f(**kwargs):
print(kwargs)
f(a=1,b=2,c =3)
[out]: {'a': 1, 'b': 2, 'c': 3}
- 基础用法
import time
def f():
start = time.clock()
print("ok")
end = time.clock()
print("start:", start, " end:", end)
f()
若有其它函数想要计算运行时间,则这样写很麻烦,这里引入修饰器
def runtime(func):
def wrapper():
start = time.clock()
func()
end = time.clock()
print("start:", start, " end:", end)
return wrapper
@runtime
def f():
print("ok")
f()
- 传递参数
# 将输出文件变为int
def toint(func):
def wrapper(*args, **kwargs):
ret = func(*args, **kwargs)
ret = list(map(int, ret))
return ret
return wrapper
@toint
def f(a, b):
assert isinstance(a, list)
assert isinstance(b, list)
a.extend(b)
return a
print(f(['11','22','33'], [44,55,66]))
[out]: [11, 22, 33, 44, 55, 66]
*报错
若要使用修饰器修函数结果进行断言则可以使用下面的语句
def isint(func):
def wrapper(*args, **kwargs):
for each in args:
assert isinstance(each, int), func.__name__ + '() 输出不为数字'
for key in kwargs:
assert isinstance(kwargs[key], int), func.__name__ + '() 输出不为数字'
ret = func(*args, **kwargs)
return ret
# 将wrapper的docstring和名称设置成和原始函数一样,有利于内省(获得自身的信息)
wrapper.__name__ = func.__name__
wrapper.__doc__ = func.__doc__
return wrapper
@isint
def f(a, b):
return a+b
print(f('2',2))
[out]: AssertionError: f() 输出不为数字
这个修饰器可以简化 functools已经封装好了
import functools
def isint(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for each in args:
assert isinstance(each, int), func.__name__ + '() 输出不为数字'
for key in kwargs:
assert isinstance(kwargs[key], int), func.__name__ + '() 输出不为数字'
ret = func(*args, **kwargs)
return ret
return wrapper
@isint
def f(a, b):
return a+b
print(f('2',2))
[out]: AssertionError: f() 输出不为数字
网友评论