前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Python如何校验函数参数入参类型以及规定返回结果类型

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

作者头像
雷子
发布2021-12-04 10:53:45
发布2021-12-04 10:53:45
3.1K00
代码可运行
举报
运行总次数:0
代码可运行

01

前言

我们在写JAVA的时候,可能大家都知道,我们可以规定参数的类型,当参数类型输入错误的时候,就抛出来对应的参数的异常,而且我们规定参数的返回类型,那么我们看下如何校验这个参数和规定返回类型。

02

正文

首先我们看下如何定义参数和返回的结果的类型:

代码语言:javascript
代码运行次数:0
复制
def add(a:int,b:int)->int:
    '''
    
    :param a: int
    :param b: int
    :return: int
    '''
    return a+b

很简单,我们看下运行下

代码语言:javascript
代码运行次数:0
复制
if __name__=="__main__":
    add("1",2)

那么结果是

但是我们想要知道参数哪个错误,错误类型是什么,如何实现呢?

代码语言:javascript
代码运行次数:0
复制
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))

那么我们改下代码

代码语言:javascript
代码运行次数:0
复制
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都知道装饰器,我们看下装饰器如何实现

代码语言:javascript
代码运行次数:0
复制
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的反射拿到了参数。然后组装成字典,最后调用校验。那么我们看下使用

代码语言:javascript
代码运行次数:0
复制
@type_ver
def add(a:int,b:int)->int:
    '''

    :param a: int
    :param b: int
    :return: int
    '''
    return a+b

我们看下最后的效果

最后的代码如下

代码语言:javascript
代码运行次数:0
复制
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)

我们看下最后的结果

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

后记

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档