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无法过期,失效
不支持清除操作
不支持分布式,是一个单机的缓存
使用场景,单机上需要空间换时间的地方,可以用缓存来将计算编程快速的查询