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',
