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

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值