import inspect import functools def typeHints(fn): @functools.wraps(fn) def wrap(*args, **kwargs): sig = inspect.signature(fn) params = sig.parameters # 处理kwargs:字典 for k, v in kwargs: param = params[k] if param.annotation != inspect._empty and not isinstance(v, param.annotation): raise TypeError('parameter {} requires {}, but got {}'.format(k, param.annotation, type(v))) # 处理args:元组 for i, x in enumerate(args): param = list(params.values())[i] if param.annotation != inspect._empty and not isinstance(x, param.annotation): raise TypeError('parameter {} requires {}, but got {}'.format(param.name, param.annotation, type(x))) ret = fn(*args, **kwargs) return ret return wrap @typeHints def add(x: int, y: int) -> int: return x + y @typeHints def add1(x, y:int) -> int: return x + y print(add(3, 5)) # 输出结果为8 print(add1(1, 2)) # 输出结果为3
类型检查主要使用了inspect库。本次代码运行环境是python3.5.2。inspect库的使用方法在下面介绍。python
检查函数动态类型时,咱们主要使用的是inspect库中的signature类,parameter类。能够使用help方法查看inspect的详细信息:程序员
import inspect help(inspect)
inspect库的源代码见:/home/clg/.pyenv/versions/3.5.2/lib/python3.5/inspect.pyide
这个库用来获取Python动态对象的有用信息,好比本次用到的注解。函数
Signature是inspect模块的一个类,inspect模块的signature函数用来获取一个Signature对象,函数原型以下:学习
signature() - get a Signature object for the callable
ui
Signature类有一个属性是OrderedDict类型的parameters,存储的是参数名称到参数对象(Parameter类的对象)的一个有序映射。code
Parameter类的对象主要用来组成signature()返回的Signature对象的parameters属性。Parameter类有两个经常使用的属性:orm
Parameter.empty
inspect模块示例视频
def add(x: int, y: int) -> int: return x + y import inspect sig = inspect.signature(add) print(sig.parameters) print(sig.parameters['x']) print(sig.parameters.values()) # 输出结果 OrderedDict([('x', <Parameter "x:int">), ('y', <Parameter "y:int">)]) x:int odict_values([<Parameter "x:int">, <Parameter "y:int">])
odict_values
相似于list,可是不支持下表操做,所以须要用list()
转化为list以后再作下表操做。对象
记得帮我点赞哦!
精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,按照目录合理分类,总能找到你须要的学习资料,还在等什么?快去关注下载吧!!!
念念不忘,必有回响,小伙伴们帮我点个赞吧,很是感谢。
我是职场亮哥,YY高级软件工程师、四年工做经验,拒绝咸鱼争当龙头的斜杠程序员。
听我说,进步多,程序人生一把梭
若是有幸能帮到你,请帮我点个【赞】,给个关注,若是能顺带评论给个鼓励,将不胜感激。
职场亮哥文章列表:更多文章
本人全部文章、回答都与版权保护平台有合做,著做权归职场亮哥全部,未经受权,转载必究!