构建一个装饰器,通过对装饰器中传入类型参数,来对装饰的函数的对应参数进行类型检查。
from inspect import signature
from functools import wraps
?
def typeassert(*tyargs,**tykwargs):
def decorator(func):
#获取指定的强制类型参数
sig=signature(func)
required_types=sig.bind_partial(*tyargs,**tykwargs).arguments#OrderedDict类型,可以只对前面的参数进行in搜索判定,可以把前面的参数当作key来获取对应的类型
?
另外也可以通过函数注解来实现,之前实现过,代码如下:
def para_check(func):#外函数,传入的参数是待检验函数对象本身
sig=inspect.signature(func)#获取函数参数签名
parameters=sig.parameters#获取参数的有序字典
arg_names=tuple(parameters.keys())#获取参数的名称
def wrapper(*args,**kwargs):#内函数
check_list=[]#待检验的参数对
for i,val in enumerate(args):#检验所有的位置参数
arg_name=arg_names[i]
anno=parameters[arg_name].annotation#该参数期待的类型
check_list.append((arg_name,anno,val))
for arg_name,val in kwargs.items():#检验所有的关键字参数
anno=parameters[arg_name].annotation
check_list.append((arg_name,anno,val))
?
for check_arg in check_list:#逐个参数检验
if not isinstance(check_arg[2],check_arg[1]):
raise TypeError(‘the input %s expect type %s,but got %s‘%(check_arg[0],check_arg[1],type(check_arg[2])))
return func(*args,**kwargs)
return wrapper
?
原文:https://www.cnblogs.com/qianfanwaer/p/14860963.html