当前位置: 首页 > 后端技术 > Python

Python装饰器实现函数动态类型检查

时间:2023-03-26 19:48:47 Python

Python装饰器实现函数的动态类型检查(fn)params=sig.parameters#Handlekwargs:dictionaryfork,vinkwargs:param=params[k]ifparam.annotation!=inspect._emptyandnotisinstance(v,param.annotation):raiseTypeError('parameter{}requires{},butgot{}'.format(k,param.annotation,type(v)))#processingargs:tuplefori,xinenumerate(args):param=list(params.values())[i]ifparam.annotation!=inspect._emptyandnotisinstance(x,param.annotation):raiseTypeError('参数{}需要{},但得到了{}'。format(param.name,param.annotation,type(x)))ret=fn(*args,**kwargs)returnretreturnwrap@typeHintsdefadd(x:int,y:int)->int:返回x+y@typeHintsdefadd1(x,y:int)->int:返回x+yprint(add(3,5))#输出结果为8print(add1(1,2))#输出结果为3,类型检查主要使用inspect库。本代码运行环境为python3.5.2。inspect库的使用说明如下。inspect模块检查函数的动态类型时,我们主要使用inspect库中的签名类和参数类。可以使用help方法查看inspect的详细信息:importinspecthelp(inspect)inspect库的源码可以在:/home/clg/.pyenv/versions/3.5.2/lib/python3.5/inspect.py该库用于获取Python动态对象的有用信息,比如本次使用的注解。签名类Signature是inspect模块的一个类。inspect模块的signature函数用于获取一个Signature对象。函数原型如下:signature()-为callableSignature类获取一个Signature对象,其属性为OrderedDict类型的参数,存储在参数名称到参数对象(Parameter类的对象)的有序映射中。Parameter类Parameter类的对象主要用来组成signature()返回的Signature对象的parameters属性。Parameter类有两个常用的属性:name:str参数注解的名字,参数的注解。如果没有注解,注解就是Parameter.emptyinspect模块。示例defadd(x:int,y:int)->int:returnx+yimportinspectsig=inspect.signature(add)print(sig.parameters)print(sig.parameters['x'])print(sig.parameters.values())#输出结果OrderedDict([('x',),('y',)])x:intodict_values([,])odict_values类似于list,但是不支持下面的表操作,所以需要先用list()转换成list再进行下面的操作表操作。记得给我点赞哦!对计算机各个方向的视频课程和电子书,从入门、进阶、实用进行了认真梳理,并按照目录进行合理分类。你总能找到你需要的学习资料。你在等什么?立即关注并下载!!!念念不忘,必有回响,朋友们,请点个赞,万分感谢。我是职场亮哥,四年工作经验的YY高级软件工程师,拒绝当领导的斜杠程序员。听我说,我进步很大。如果有幸帮到你,请给我一个【点赞】,给我一个关注,如能评论鼓励,将不胜感激。职场凉阁文章列表:更多文章我的所有文章和回答均与版权保护平台合作,版权归职场凉阁所有。未经授权转载必究!