zoukankan      html  css  js  c++  java
  • 类型注解

    python类型注解:
    python是动态语言,变量随时可以被赋值,且能赋值为不同的类型
    python不是静态语言,变量类型在运行时才决定
     
    动态语言弊端:
    难发现,难使用;不做任何类型检查,只会在运行时才暴露出问题,函数的使用者看到时并不知道你的函数的设计,不知道该传入什么类型的数据
     
    关于弊端解决的办法:
         1.增加文档,这是一个惯例,不是强制标准,需要注意的是,函数定义更新了,文档未必同步更新
         2.利用函数注解:
    在3.5以后的版本才引入使用,
    对函数的参数进行注解
    对函数的返回值进行类型注解
    支队函数参数做一个辅助的说明,并不对函数参数进行类型检查
    提供第三方工具,做代码分析,发现隐藏的bug
    函数注解的信息,保存在__annotations__
    调用类方法:     函数.__annotations__
    变量注解,在3.6后引入:      i: int = 3
     
    业务应用:
    函数类型检查
    思路,
         函数参数的检查一定实在函数外
         检查函数(实际应用参数):
                   利用形参定义与实际应用参数的类型进行比较
         .__annotations__属性是一个字典,其中包括返回值类型的声明,几级啊折要做位置参数的判断,无法与字典中的声明对应,可使用inspect模块
     
    inspect模块:
         提供获取对象新的函数,可以检查函数和类,类型检查
    signature(callable) 获取签名,(函数签名包含了一个函数的信息,它包括函数名、他的参数类型、他所在的类和名称空间及其他信息)
    import inspect
    def add (x:int,y:int,*args,**kwargs)->int: #定义函数参数的注解
         return x+y
    print(add.__annotations__) #查看add函数定义类型
    sig=inspect.signature(add) #函数的定义(签名)
    print(sig) #查看add函数的签名(声明)
    print('params:',sig.parameters) #有序字典(有序的参数列表)
    print('return:',sig.return_annotation) #查看返回值的定义类型
    print(sig.parameters['y']) #查看参数y的参数注解
    print(sig.parameters['x'].annotation) #查看参数y的定义类型
    print(sig.parameters['args']) #查看参数args的参数注解
    print(sig.parameters['args'].annotation) #查看参数args的参数定义类型
    print(sig.parameters['kwargs']) #查看kwargs的参数注解
    print(sig.parameters['kwargs'].annotation) #查看kwargs的参数定义类型
    使用inspect模块对一个函数进行判断:
    inspect.isfunction(func):是否是函数
    inspect.ismethod(func):是否是类的方法
    inspect.isgenerator(func):是否是生成器对象
    inspect.isgeneratorfunction(func):是否是生成器函数
    inspect.isclass(func) :是否是类
    inspect.ismodule(模块):是否是模块
    inspect.isbuiltin(print):是否是内建对象
    is函数可通过查阅iinspect模块查看更多使用帮助
    Parameter对象:(有序字典)
         保存在元组中,是只读的
     
         name,参数的名字
         annotation,参数的注解,可能未定义
         default,      参数的缺省值,可能未定义
         empty ,      特殊的类,用来标记default属性或者注释annotation属性的空值
         kind             实参如何绑定到形参,就是形参的类型
    POSITIONAL_ONLY,值必须是位置参数提供(python未实现)
    POSITIONAL_OR_KEYWORD,值可以作为关键字或者位置参数提供
    VAR_POSITIONAL 可变位置参数,对应*args
    KEYWORD-ONLY keyword-only参数,对应*或者*args之后的出现非可变关键之参数
    VAR_KEYWORD,可变关键字参数,对应**kwargs
    partial
    偏函数,把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成了一个新的函数并返回
    从partial生成的新函数,是对原函数的封装
     
    lru_cache(maxsize=128,typed=Flase)
    least-recently-used装饰器,lru,最近最少使用,cache缓存
    如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制增长,当max是二的幂时,LRU功能执行的最好
    如果typed设置为True,则不同类型的函数参数将单独缓存,例如f(3),f(3.0)将被视为具有不同结果的不同调用
     
    lru_cache装饰器作用
    使用前提:
         同样的函数参数一定得到同样的结果
         函数执行时间很长,且要执行多次执行
    本质是函数调用的参数=>返回值
    缺点:
    不支持缓存过期,key无法过期,失效
    不支持清除操作
    不支持分布式,是一个单机的缓存
    使用场景,单机上需要空间换时间的地方,可以用缓存来将计算编程快速的查询
          
  • 相关阅读:
    【BZOJ1067】【SCOI2007】降雨量(线段树)
    【BZOJ3489】A simple rmq problem(树套树)
    【BZOJ1146】【CTSC2008】网络管理
    【BZOJ3236】【Ahoi2013】作业
    计算几何的一些板
    【BZOJ3173】【Tjoi2013】最长上升子序列(树状数组)
    解决phpmyadmin导入长脚本超时
    make报错make: *** [sapi/cli/php] Error 1
    wampserver配置redis在phpinfo()里面找不到
    阿里云服务器安装Apache环境外网不能访问
  • 原文地址:https://www.cnblogs.com/spidermansam/p/7716231.html
Copyright © 2011-2022 走看看