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')


本文介绍如何使用Python装饰器实现函数参数的类型检查。通过装饰器,可以在运行时检查传入函数的参数类型是否符合预期,从而增强代码的健壮性和可读性。文章详细展示了装饰器的实现过程,并提供了具体的示例代码。

被折叠的 条评论
为什么被折叠?



