python是一门动态语言,因此在调用函数的时候,可以传入任何类型的数据,而他又是一门强类型语言,当传入的参数不合法时,便会在内部报错。
为了减少这一错误的发生,python从3.5开始引入了函数注解,如下所示:
def fn(x:int, y:int):
pass
配合inspect模块,可以有效的检查传入函数是否合法
首先,通过sig=inpect.signature(fn),可以获取到fn函数的参数,然后通过sig.parameters得到一个参数的OrderedDict,当调用函数fn时,通过获取函数调用时传入的参数,来判断是否符合有序字典中相应的参数类型。
在此,可以把该方法包装成一个check装饰器,具体代码实现大致如下:
import inspect,functools
def check(fn):
@functools.wraps(fn) #把被包装函数的属性赋给wrapper
def wrapper(*args,**kwargs):
sig = inspect.signature(fn) #获取函数参数类型
params = sig.parameters #有序字典
values = list(params.values())
for i,v in enumerate(args): #获取函数调用时的值
if values[i].annotation is inspect._empty or isinstance(v, values[i].annotation): #如果函数注解为空或者输入的值符合函数注解时pass,否则提示参数错误
pass
else:
print('wrong param')
return
for k, v in kwargs.items():
if params[k].annotation is inspect._empty or isinstance(v, params[k].annotation):
pass
else:
print('wrong param')
return
x = fn(*args,**kwargs)
return x
return wrapper