一日一技:Any与TypeVar,让IDE的自动补全更好用

简介: 一日一技:Any与TypeVar,让IDE的自动补全更好用

相信有很多同学在写Python的时候,会使用类型标注来提高代码的可读性,同时还能帮助IDE实现自动补全。


假设我们现在获得了一个对象,这个对象可能是列表也可能是生成器,我写一个函数,获取它的第一个元素。代码很简单:


from typing import Iterator
from contextlib import suppress
class People:
    def __init__(self, name):
        self.name = name
    def eat(self):
        print(f'{self.name}正在吃饭')
    def walk(self):
        print(f'{self.name}正在走路')
def get_first_element(ele_list):
    if isinstance(ele_list, list):
        return ele_list[0] if ele_list else None
    if isinstance(ele_list, Iterator):
        with suppress(Exception):
            value = next(ele_list)
            return value
    return None
if __name__ == '__main__':
    kingname = People('kingname')
    pm = People('pm')
    people_list = [kingname, pm]
    obj = get_first_element(people_list)
    if obj:
        print(obj.)


代码写好了,但是当我获取第一个元素,想打印它里面的数据的时候,我发现我忘记了People这个类有哪些属性了,而此时PyCharm的自动补全也失效了,我不得不把代码往回翻,去寻找People定义的位置,效率非常低。如下图所示。


1.png


如果我们使用了类型标注,就能解决这个问题:


2.png


这个常规用法,大家肯定都知道。


现在问题来了,我们除了People类,还有Cat类,并且列表里面的元素可能全是People类的实例,也可能全是Cat类实例,这种情况怎么办呢?


首先你遇到了第一个问题,get_first_element的参数的类型标注怎么写?


你可能会写成这样:


def get_first_element(ele_list: Union[List[Union[People, Cat]], Iterator[Union[People, Cat]]])


那如果还有一个Dog类呢?


为了简化操作,你可能会用Any,类型,于是get_first_element变成了下面这样:


def get_first_element(ele_list: Union[List[Any], Iterator[Any]]) -> Optional[Any]:
    if isinstance(ele_list, list):
        return ele_list[0] if ele_list else None
    if isinstance(ele_list, Iterator):
        with suppress(Exception):
            value = next(ele_list)
            return value
    return None


现在你发现问题又来了,PyCharm的自动补全又坏了。因为Any是任何类型,所以在代码运行前,它其实不知道你返回的是什么东西。如下图所示:


3.png


这种情况下,你就需要使用Python类型标注中的泛型了。我们知道,泛型是静态语言中的概念,Python由于使用了类型标注,也有了类型。于是也就借用了这个概念。


我们来看看怎么使用它:


from typing import TypeVar
T = TypeVar('T')


注意这里的变量名T和TypeVar的参数'T'可以同时写成任意字符串,但变量名要与参数保持一致。例如:


GodType = TypeVar('GodType')


然后把T当作Any一样使用就可以。我们来看看效果:


4.png


可以看到,PyCharm又能自动补全了。使用TypeVar,可以告诉PyCharm,返回的类型跟传入参数中的T对应位置的类型保持一致。例如传入参数中,TList[T]或者

Generator[T]中,所以返回的参数需要与列表中的元素或者生成器中的元素类型保持一致。


我们用Cat生成器来测试一下,发现也能自动补全:


5.png


还有更厉害的,如果我的列表里面既有Cat的实例,又有People的实例怎么办?这个时候,PyCharm会直接把两个实例的可能补全都给你列出来:


6.png



请关注微信公众号【未闻Code】获取更多精彩文章。

目录
相关文章
|
机器学习/深度学习 人工智能 IDE
IDE AI 自动补全插件 TabNine
TabNine 是一个自动补全的编码插件,不同于一般的自动补全插件,它使用了深度学习 来帮助我们补全代码。并且开箱即用,不需要额外配置。
IDE AI 自动补全插件 TabNine
|
1月前
|
网络协议 IDE 网络安全
GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程
GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程
220 0
|
7月前
|
IDE Go 开发工具
Go开发IDE全览:GoLand vs VSCode全面解析
Go开发IDE全览:GoLand vs VSCode全面解析
273 0
|
1月前
|
IDE 测试技术 项目管理
集成开发环境(IDE)的使用:提升Visual Basic开发效率的工具和技巧
【4月更文挑战第27天】本文探讨了如何使用Visual Basic IDE提升开发效率,包括理解IDE组件、利用代码编辑器的智能功能、通过界面设计器设计GUI、使用调试和测试工具、有效管理项目与版本控制、掌握快捷键和宏、定制IDE以及利用学习资源。通过充分利用这些工具和技巧,开发者能更快地编写高质量代码,高效管理项目,从而提升整体开发效率。随着IDE的持续发展,开发者应不断学习新特性以适应进步。
|
8月前
|
IDE Linux 开发工具
GoLand IDE 2023 快捷键大全:提高开发效率的必备操作
GoLand IDE 2023 快捷键大全:提高开发效率的必备操作
178 0
|
1月前
|
IDE 前端开发 搜索推荐
5款超好用的在线IDE,媲美vscode,可以直接编写前端构建化项目,而无需在本地下载依赖包,非常适合学习、demo、原型开发
5款超好用的在线IDE,媲美vscode,可以直接编写前端构建化项目,而无需在本地下载依赖包,非常适合学习、demo、原型开发
236 0
|
1月前
|
IDE 开发工具
微信IDE开发过程,提示上传云函数 lbs_server 失败
微信IDE开发过程,提示上传云函数 lbs_server 失败
微信IDE开发过程,提示上传云函数 lbs_server 失败
|
传感器 网络协议 IDE
【基于Arduino IDE平台开发ESP8266连接巴法云】
【基于Arduino IDE平台开发ESP8266连接巴法云】
2174 0
|
8月前
|
IDE 开发工具 git
高效开发:掌握主流IDE与版本控制系统
高效开发:掌握主流IDE与版本控制系统
89 0