構建一個裝飾器,通過對裝飾器中傳入類型參數,來對裝飾的函數的對應參數進行類型檢查。
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