https://zhuanlan.zhihu.com/p/139056271
利用”装饰函数对被装饰函数进行一番操作然后再返回被装饰函数”这一操作,可以进行”python函数实参的类型检查”:
虽然动态语言python不对变量作出编译性质的类型声明,但可以使用装饰函数对被装饰函数进行”类型检查”
此例只是将”类型检查”的信息输出,如要实现”强制类型检查”,可以在wrapper()的类型检查语句中对”实参类型与形参类型不符”的情况抛出值错误异常:
def check(fn):
def wrapper(*args,**kwargs):
print(fn.__annotations__)#函数fn()的注释字典 '形参名':形参类型(按形参从左至右顺序)+'return':返回值类型
list_anno_values=list(fn.__annotations__.values()) #按序的形参类型+返回值类型+'return':返回值类型 的列表
print(list_anno_values)
for index,para in enumerate(args): #将位置形参按 整数下标:形参值 生成字典,为了获取位置形参对应下标来访问形参类型
print('位置实参值:期望类型',para,':',list_anno_values[index],end='')
print(isinstance(para,list_anno_values[index])) #位置形参肯定从形参列表第一个形参开始从左至右连续出现,故下表对应
if not isinstance(para,list_anno_values[index]):
raise ValueError
for k,v in kwargs.items(): #关键字形参 形参:形参值 的字典 通过str(形参)可从fn.__annotations__映射形参类型
print('关键字实参',str(k),'的值:期望类型',v,':',fn.__annotations__[str(k)],end='')
print(isinstance(v,fn.__annotations__[str(k)]))
if not isinstance(v,fn.__annotations__[str(k)]):
raise ValueError
ret=fn(*args,**kwargs)
return wrapper
@check
def add(x:int,y:int,z:int)->int:
return x+y+z
add(4,z=5,y=6)
add(2,'heihei')