类型注解的简要理解

本文探讨了Python的动态类型特性,介绍了动态语言的弊端以及通过函数注解和inspect模块进行类型检查的解决方案。重点讲解了如何使用lru_cache和partial等工具优化函数性能,并揭示了它们在业务中的应用场景。
摘要由CSDN通过智能技术生成

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无法过期,失效

不支持清除操作

不支持分布式,是一个单机的缓存

使用场景,单机上需要空间换时间的地方,可以用缓存来将计算编程快速的查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值