装饰器的应用:判断函数参数类型是否符合定义
import inspect
from functools import wraps
def check(fn):
@wraps(fn)
def wrapper(*args,**kwargs):
print(args,kwargs)
sig = inspect.signature(fn)
params = sig.parameters #有序字典
print('params :',sig.parameters)
print("-"*40)
# for param in sig.parameters.values():
# print(param.name,param)
# print(param.annotation,param.kind,param.default)
#位置参数处理
param_list = list(params.keys())
# print(param_list)
for i,x in enumerate(args):
# print(i,x)
k = param_list[i]
if isinstance(x,params[k].annotation):
print(x,' is ',params[k].annotation)
else:
errstr = "{} {} {}".format(x,' is not ',params[k].annotation)
print(errstr)
raise TypeError(errstr)
#关键字参数处理
for k,v in kwargs.items():
if isinstance(v,params[k].annotation):
print(v,' is ',params[k].annotation)
else:
errstr = "{} {} {}".format(x,' is not ',params[k].annotation)
print(errstr)
raise TypeError(errstr)
ret = fn(*args,**kwargs)
return ret
return wrapper
@check
def add(x:int,y:int=7) -> int:
return x+y
add(4,y=5)
print("=="*20)
add(4.0,y=5)