文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python--参数注解

2023-01-31 05:35

关注

一,函数定义的弊端:

    1)Python是动态语言,变量随时可以被赋值,且能赋值为不同的类型。

    2)Python不是静态编译型语言,变量类型是运行器决定的

    3)动态语言很灵活,但这也是其弊端:

def add(x + y):
    return x + y
print(add(4,5))
print(add('hello','world'))
add(4,'hello')  #这句显然是错的

         首先,难发现,由于不做任何类型检查,直到运行期问题菜显现出来,或线上运行时才发现问题;

        其次,难使用,函数使用者看到函数的时候并不知道你的函数的设计,并不知道应该传入什么类型的数据

二,如何解决这种弊端?

    1)增加文档Documentation String:

        这只是一个惯例,并不是强制标准,不能要求程序员一定为函数提供说明文档,并且函数定义更新了,文档未必同步更

def add(x,y):
    '''
    :param x:int
    :param y:int
    :return: int
    '''
    return x + y
print(help(add))

    2)函数注解

def add(x:int,y:int)->int:
    '''
    :param x:int
    :param y:int
    :return: int
    '''
    return x + y
print(help(add))
print(add(4,5))
print(add('func','tion'))

        定义:

        Python 3.5引入;对函数的参数进行类型注解;对函数的返回值进行类型注解;只对函数参数做一个辅助的说明,并不对函数参数进行类型检查;提供给第三方工具,做代码分析,发现隐藏BUG;函数的注解信息保存在__annotations__属性中;

        变量注解在Python 3.6中引入:   i :int = 3

      3) inspect模块:




    4)业务应用:函数参数类型的检查

        思路:1,函数参数的检查,一定是在函数外;

                  2,函数应该作为参数,传入到检查函数中;

                  3,检查函数拿到函数传入的实际参数,与形参声明对比;

                 4,__annotations__属性是一个字典,其中包括返回值类型的声明.假设要做位置参数的判断,无法和字典中的声明对应,使用inspect模块提供获取对象信息的函数,可以检查函数和类,类型检查


import inspect
import functools
def dect(fn):
    @functools.wraps(fn)
    def _dect(*args,**kwargs):
        sig = inspect.signature(fn)
        params = sig.parameters   #有序字典
        keys = list(params.keys())
        values = [_ for _ in params.values()]
        for i,m in enumerate(args):   #args用tuple包装二元组的方式保存位置参数
            if values[i].annotation is not inspect._empty and isinstance(m,values[i].annotation):  #和注解进行比较
                print(keys[i],'==', m)
        for k,v in kwargs.items():  
            if paras[k].annotation is not inspect._empty and isinstance(v,params[k].annotation):    #业务需求应该是没有注解就不比较了
                print(k,'===',v)
        ret = fn(*args,**kwargs)
        return ret 
    return _dect
@dect
def add(x,y:int =7) -> int:  #add = dect(add)
    return x + y
add(4,5)

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯