天天看点

检查函数传入参数的合法性

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