python3 新增了函数注解,大致用法就是 def func(a:int,b:str) -> str ,用:来表示函数形参的类型,但是目前为止这个注解在python解释器中不会起到任何作用,实参类型不会因为形参注解类型而发生任何异常,所以我突发奇想,结合python的装饰器和inspect 模块一起做一个简单的类型检测(可能存在一点bug,但是我觉得实现过程值得被记录)
在以下的代码中,需要使用到inspect模块里面的signature、Parameter
#异常检测类,对于类型不匹配的抛出此类异常
class typenotmatch(Exception):
def __str__(self):
return "类型不匹配"
#检测类型装饰器
def typeof(func):
def decorator(*args,**kwargs):
signal=signature(func)
bound_args=signal.bind(*args,**kwargs) #此处做一个函数签名,获取实参字典
print(bound_args)
#获取参数键值对字典
params=dict(bound_args.arguments.items())
#做一次深拷贝
clone=copy.deepcopy(dict(signal.parameters.items()))
#检测参数
try:
for item in params:
if clone[item].kind != Parameter.POSITIONAL_OR_KEYWORD:
continue
if clone[item].annotation is not type(params[item]):
raise typenotmatch
except Exception as e:
print(e)
return False
#检测返回值
try:
result=func(*args,**kwargs)
if type(result) is not signal.return_annotation:
raise typenotmatch
except Exception as e:
print(e)
return False
return result
return decorator
@typeof
def test(a:int,b:str,tup:tuple) -> str:
print("Hello 我成功执行了")
return repr(a)+repr(b)
test(1,"2",(1,))
|