浅谈怎么给Python添加类型标注

 更新时间:2021年06月08日 16:23:58   作者:枇杷鹭  
今天给大家带来的文章是Python的相关知识,文章围绕着怎么给Python添加类型标注展开,文中有非常详细的介绍,需要的朋友可以参考下

Python 添加类型标注

Python 如此简洁,书写者在声明变量时甚至无需考虑类型。

但是简洁与复杂间,是存在一个平衡点的。当我们书写较为复杂的项目时,还是希望可以拥有「静态类型语言」强大的类型检查和智能的提示。

好消息是,并不需要像 TypeScript 那样,引入一个新的编译器来给 JavaScript 做“升级”来进行类型检查, Python 自带的 typing 工具可以在一定程度上把 Python 变成「静态类型语言」;坏消息是, Python 归根结底不是「静态类型语言」,经过我的简单测试,其代码还是「自由松散」的。

给 Python 标注类型

首先和读者声明我们的实验环境。

❯ python --version
Python 3.7.0

本文参考了 Python3.7 的 中文文档

我们声明一个变量,通过如下方式声明类型:

a: int = 1
b: float = .2
print(f'{a}, {b}')  # 1, 0.2

遗憾的是,在 Python 中,a: int = 1 这句话并没什么意义,说的直白点,就是『脱裤子放屁』;再说得好听点, Python 的类型标注放在这里这么用完全没有必要。

首先, a = 1 中解释器会自动把 a 推断为 int 类型,诸如 Pylance 的 Language Server 也会在我们书写时提供 int 的方法补全。

此外,就算我们把 a 的类型规定为 int ,然后将 str 赋给 a ,解释器和 Language Server 也完全不会报错。如下。

a: int
a = '1'
print(a)  # 非常迷

做上述类型检查对于现代编译技术而言应该是毫无难度的,但这里就是没有报错、没有警告。这大概与 Python 的设计哲学有关。

我们看看 TypeScript 是如何表现的:

TypeScript 把自己当作静态类型语言,要求书写时就确保类型的正确性。

使用 typing

尽管 Python 并不强制要求类型的正确性,并且会自动帮我们做强类型转换,但是我们依旧可以享受类型标注带来的诸多便利。

比如,我们现在要定义一个函数 foo ,函数返回一个列表 dogList ,列表中的元素都是我们自定义的类 Dog 的实例。

如果没有类型标注,我们无法获得智能提示,如下。

Python 中从来就不要求 List 对象中的元素都是同一类型,因此,解释器或者 Language Server 也不会「吃力不讨好」般地去把程序运行一遍,然后推断你这个 List 里放的东西是什么类型。

自然,当你从 List 中拿元素时(比如上述的 dogList[0] ),它没法告诉你 List 中你拿的元素是什么类型,也就没办法提示(No suggestion.)。

这与实际业务场景不符,因为我们写代码时,在一个列表中装入的往往都是同一类型。 为了在取元素时获得补全提示,我们可以使用 typing.List + 极简的泛型 。如下。

我们规定, foo 返回的元素必是一个 List ,且其中元素类型是 Dog 类型。然后我们的 dogList[0] 也被识别成了 Dog 类型,获得了补全。舒服。

题外话:聪明的 Pylance

其实 Pylance 自己也可以做一些类型推导。比如我们使用生成器生成列表时, Pylance 就会判断这个列表中元素属于什么类型:

结语

关于 typing 的用法,还有很多内容可以讨论,我的参考资料主要是:Python3.7 的 typing中文文档 。此外,用 Python 泛型实现函数重载相比静态类型语言似乎十分麻烦(我参考了Python实用宝典的文章(知乎)),如果之后我遇到合适的场景也会成文分享。

到此这篇关于浅谈怎么给Python添加类型标注的文章就介绍到这了,更多相关Python添加类型标注内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中的异步:async 和 await以及操作中的事件循环、回调和异常

    Python中的异步:async 和 await以及操作中的事件循环、回调和异常

    在现代编程中,异步操作在处理 I/O 密集型任务时,可以显著提高程序的性能和响应速度,Python 提供了 async 和 await 关键字,使得编写异步代码变得更加直观和简洁,在这篇文章中,我们将深入探讨 Python 的异步操作,并通过实际代码示例来说明其使用方法
    2024-12-12
  • Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】

    Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】

    这篇文章主要介绍了Python 网络编程之UDP发送接收数据功能,结合实例形式分析了Python使用socket套接字实现基于UDP协议的数据发送端与接收端相关操作技巧,需要的朋友可以参考下
    2019-10-10
  • Python pip通过requirements.txt 文件安装依赖

    Python pip通过requirements.txt 文件安装依赖

    requirements.txt是定义项目依赖的python包,可通过工具生成,本文主要介绍了Python pip通过requirements.txt文件安装依赖,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Python语法快速入门指南

    Python语法快速入门指南

    这篇文章主要介绍了Python语法快速入门指南,包括注释和引号的使用等基本语法知识,需要的朋友可以参考下
    2015-10-10
  • Python tkinter进度条控件(Progressbar)的使用

    Python tkinter进度条控件(Progressbar)的使用

    这篇文章主要介绍了Python tkinter进度条控件(Progressbar)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python冲顶大会 快来答题!

    Python冲顶大会 快来答题!

    直播答题冲顶大会,你玩了吗?本文为大家分享了10道Python测试题,你答对1道算我输
    2018-01-01
  • python决策树之CART分类回归树详解

    python决策树之CART分类回归树详解

    这篇文章主要为大家详细介绍了python决策树之CART分类回归树,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Python操作MySQL数据库的简单步骤分享

    Python操作MySQL数据库的简单步骤分享

    这篇文章主要给大家介绍了关于Python操作MySQL数据库的简单步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 详解Python编程中time模块的使用

    详解Python编程中time模块的使用

    这篇文章主要介绍了详解Python编程中time模块的使用,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • Django中的用户身份验证示例详解

    Django中的用户身份验证示例详解

    这篇文章主要给大家介绍了关于Django中用户身份验证的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL Django具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08

最新评论