import inspect
def check(fn):
def wrapper(*args,**kwargs):
# 实参检查
sig=inspect.signature(fn)
count=0 # 是用count来记录偏离args时的下标,也可使用enumerate函数生成每一个下标对应的位置
flag=False # flag 标记判断判断的参数进入args还是进入kwargs
kwargs={str(k):v for k,v in kwargs.items()}
for k,v in sig.parameters.items():
if count<=(len(args)-1) and flag==False:
if isinstance(args[count],v.annotation):
print(k,args[count])
count+=1
print('invalid')
break
else:flag = True
if flag==True:
if isinstance(kwargs[k],v.annotation): # parameter对象的annotation属性返回一个type对象等价于内建函数type的返回对象,可以用于isinstance的类型比较
print(k,kwargs[k])
print('valid')
else:
print('invalid')
break
#使用add函数
result=fn(*args,**kwargs)
return result
return wrapper
@check
def add(x:int,y:int,*args)->int:
return 1
# add(x=2,y=3)
# print('~'*100)
# add(2,3)
# print('~'*100)
# add(2,y=3)
# print('~'*100)
# add(y=3,x=1)
inspect库检查传入实参与参数注解是否匹配
最新推荐文章于 2024-07-11 18:01:45 发布