文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

python类型注解

2023-01-31 01:38

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


业务应用
函数参数类型检查
思路
    函数参数的检查,一定是在函数外
    函数作为参数,传入到检查函数中
    检查函数拿到函数传入的实际参数,与形参声明对比
    __annotations__属性是一个字典,其中包括返回值类型的声明。假设要做位置参数的判断,无法和字典中的声明对应。使用inspect模块
inspect模块
提供获取对象信息的函数,可以检查函数的类、类型检查

signature(callable),获取签名(函数签名包括了一个函数的信息,包括函数名、它的参数类型、他所在的类和名称空间及其他信息)

import inspect
def add(x:int,y:int,*args,**kwargs) -> int:
    return x + y
sig = inspect.signature(add)
print(sig,type(sig))
print('params:',sig.parameters)
print(sig.parameters['y'],type(sig.parameters['y']))
print(sig.parameters['x'].annotation)
print(sig.parameters['args'])
print(sig.parameters['args'].annotation)
print(sig.parameters['kwargs'])
print(sig.parameters['kwargs'].annotation)
sig.parameters 是一个OrderedDict 


inspect模块
inspect.isfunction(add),是否是函数
inspect.isfunction(add),是否是函数 inspect.ismethod(add)),是否是类的方法 inspect.isgenerator(add)),是否是生成器对象 inspect.isgeneratorfunction(add)),是否是生成器函数  inspect.isclass(add)),是否是类 
inspect.ismodule(inspect)),是否是模块 inspect.isbuiltin(print)),是否是内建对象


inspect模块
Parameter对象
    保存在元组中,是只读的
    name,参数的名字
    annotation,参数的注解,可能没有定义
    default,参数的缺省值,可能没有定义
    empty,特殊的类,用来标记default属性或者注释annotation属性的空值
kind,实参如何绑定到形参,就是形参的类型




业务应用练习
有函数add
请检查用户输入是否符合参数注解的要求


import inspect
def check(fn):
    def wrapper(*args,**kwargs):
        sig = inspect.signature(fn)
        param = sig.parameters
        values = list(param.values())
        for i,v in enumerate(args):
            if values[i].annotation is not inspect._empty  and not isinstance(v,values[i].annotation):
                print('!==')
        for k,t in kwargs.items():
            if param[k].annotation is not inspect._empty   and not isinstance(t,param[k].annotation):
                print('!===')
        ret = fn(*args,**kwargs)
        return ret
    return wrapper

@check
def add(x:int,y:int=7)-> int:
    return x + y
print(add(1.1,y=1.0))

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯