01
前言
我们在写JAVA的时候,可能大家都知道,我们可以规定参数的类型,当参数类型输入错误的时候,就抛出来对应的参数的异常,而且我们规定参数的返回类型,那么我们看下如何校验这个参数和规定返回类型。
02
正文
首先我们看下如何定义参数和返回的结果的类型:
def add(a:int,b:int)->int:
'''
:param a: int
:param b: int
:return: int
'''
return a+b
很简单,我们看下运行下
if __name__=="__main__":
add("1",2)
那么结果是
但是我们想要知道参数哪个错误,错误类型是什么,如何实现呢?
from typing import get_type_hints
def ver(obj,**kwargs):
#返回方法的入参出参等数据
hints=get_type_hints(obj)
for parame,parametype in hints.items():
#遍历不等于return的
if parame!='return':
if not isinstance(kwargs[parame],parametype):
raise TypeError("参数:{} 类型错误,应该是:{} 类型".format(parame,parametype))
那么我们改下代码
def add(a:int,b:int)->int:
'''
:param a: int
:param b: int
:return: int
'''
ver(add,a=a,b=b)
return a+b
我们运行下看下结果
这样,我们知道了哪个参数类型错误,应该是什么类型?
我们都知道,这样写能实现,熟悉python都知道装饰器,我们看下装饰器如何实现
def type_ver(dec):
@wraps(dec)
def wrapp(*args,**kwargs):
#通过反射拿到函数的参数
fun_arg=getfullargspec(dec)
#参数,入参组和
kwargs.update(dict(zip(fun_arg[0],args)))
ver(dec,**kwargs)
return dec(**kwargs)
return wrapp
我们利用了python的反射拿到了参数。然后组装成字典,最后调用校验。那么我们看下使用
@type_ver
def add(a:int,b:int)->int:
'''
:param a: int
:param b: int
:return: int
'''
return a+b
我们看下最后的效果
最后的代码如下
from functools import wraps
from inspect import getfullargspec
from typing import get_type_hints
def ver(obj,**kwargs):
hints=get_type_hints(obj)
for parame,parametype in hints.items():
if parame!='return':
if not isinstance(kwargs[parame],parametype):
raise TypeError("参数:{} 类型错误,应该是:{} 类型".format(parame,parametype))
def type_ver(dec):
@wraps(dec)
def wrapp(*args,**kwargs):
#通过反射拿到函数的参数
fun_arg=getfullargspec(dec)
#参数,入参组和
kwargs.update(dict(zip(fun_arg[0],args)))
ver(dec,**kwargs)
return dec(**kwargs)
return wrapp
@type_ver
def add(a:int,b:int)->int:
'''
:param a: int
:param b: int
:return: int
'''
return a+b
if __name__=="__main__":
add("1",2)
我们看下最后的结果
我们在执行方法的时候,就可以校验我们方法参数类型,然后根据我们想要的异常信息。
后记
发现问题,解决问题。遇到问题,慢慢解决问题即可。