zl程序教程

您现在的位置是:首页 >  Python

当前栏目

Python如何校验函数参数入参类型以及规定返回结果类型

2023-04-18 14:28:11 时间

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)

我们看下最后的结果

我们在执行方法的时候,就可以校验我们方法参数类型,然后根据我们想要的异常信息。

后记

发现问题,解决问题。遇到问题,慢慢解决问题即可。