一日一技: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
|
6月前
|
网络协议 IDE 网络安全
GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程
GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程
723 0
|
IDE Go 开发工具
Go开发IDE全览:GoLand vs VSCode全面解析
Go开发IDE全览:GoLand vs VSCode全面解析
510 0
|
26天前
|
IDE 开发工具 C++
AvaloniaUI项目离线开发全攻略:IDE安装、模板应用与NuGet私有化部署一站式解决
本文详细介绍了在离线环境中开发Avalonia UI项目的完整解决方案,包括Visual Studio 2022和JetBrains Rider的离线安装、Avalonia UI模板的配置、私有NuGet服务的部署与使用,以及NuGet包的制作和上传。通过这些步骤,您可以在网络受限或完全离线的环境中顺利进行Avalonia UI项目的开发。
AvaloniaUI项目离线开发全攻略:IDE安装、模板应用与NuGet私有化部署一站式解决
|
1月前
|
机器学习/深度学习 存储 监控
AllData数据中台核心菜单五:实时开发IDE
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
6月前
|
IDE 测试技术 项目管理
集成开发环境(IDE)的使用:提升Visual Basic开发效率的工具和技巧
【4月更文挑战第27天】本文探讨了如何使用Visual Basic IDE提升开发效率,包括理解IDE组件、利用代码编辑器的智能功能、通过界面设计器设计GUI、使用调试和测试工具、有效管理项目与版本控制、掌握快捷键和宏、定制IDE以及利用学习资源。通过充分利用这些工具和技巧,开发者能更快地编写高质量代码,高效管理项目,从而提升整体开发效率。随着IDE的持续发展,开发者应不断学习新特性以适应进步。
155 1
|
4月前
|
监控 IDE Java
函数计算产品使用问题之如何不使用FC的IDE进行开发,并将开发好的应用部署到FC上
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
IDE Linux 开发工具
GoLand IDE 2023 快捷键大全:提高开发效率的必备操作
GoLand IDE 2023 快捷键大全:提高开发效率的必备操作
248 0
|
6月前
|
IDE 开发工具
微信IDE开发过程,提示上传云函数 lbs_server 失败
微信IDE开发过程,提示上传云函数 lbs_server 失败
微信IDE开发过程,提示上传云函数 lbs_server 失败