浅谈怎么给Python添加类型标注
作者:枇杷鹭 发布时间:2023-11-21 05:16:17
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实用宝典的文章(知乎)),如果之后我遇到合适的场景也会成文分享。
来源:https://blog.csdn.net/weixin_42815609/article/details/117630136


猜你喜欢
- 首先我们利用NodeJs先构建一个基本的服务器。 index.js var requestHandler = require(".
- 如何显示数据库中的图片和超级链接?代码见下:<% set conn=server.creatobject(&quo
- 1.冒泡排序,相邻位置比较大小,将比较大的(或小的)交换位置def maopao(a): for i in ran
- 介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。 摘 要
- 首先给大家分享一个个人在使用python的ctypes调用c库的时候遇到的一个小坑这次出问题的地方是一个C函数,返回值是malloc生成的字
- 描述Python rindex() 方法返回子字符串最后一次出现在字符串中的索引位置,该方法与 rfind() 方法一样
- 命令首先数据库迁移的两大命令: python manage.py makemigrations & python manage.py
- 由于下载这个clsExport2Excel 代码时,已经找不到代码出处感谢上传这个类的朋友,为大家带来了方便我只对其中的属性传递做了一些调整
- 在利用DL解决图像问题时,影响训练效率最大的有时候是GPU,有时候也可能是CPU和你的磁盘。很多设计不当的任务,在训练神经网络的时候,大部分
- 在 MySQL 中通常我们使用 limit 来完成页面上的分页功能,但是当数据量达到一个很大的值之后,越往后翻页,接口的响应速度就越慢。本文
- 我们一般在调试程序的时候,有些操作会莫名地失败,又没有错误消息提示,特别是在执行数据库操作的时候,明明执行过去了,可就是数据库里没有记录变动
- 微服务架构在现代软件开发中日益普及,它将复杂的应用程序拆分成多个可独立部署的小型服务。本文将介绍如何使用 Python 的 FastAPI
- VBScript似乎已经成为ASP服务器端开发的首先语言,VBScript函数库丰富、而且使用起来也很容易上手,即使平时不太编程的朋友,只要
- 本文实例分析了Python中的异常处理try/except/finally/raise用法。分享给大家供大家参考,具体如下:异常发生在程序执
- 因为Python是自带文档,可以通过help函数来查询每一个系统函数的用法解释说明。一般来说,关键的使用方法和注意点在这个系统的文档中都说的
- 这篇文章主要讲TensorFlow中的Session的用法以及Variable。Session会话控制Session是TensorFlow为
- 记录训练过程中的每一步的loss变化 if verbose and step % verbose == 0: sys.stdout.writ
- 很多小伙伴在学习Django的时候,总是搞不定版本的问题,下面来一起看一张表,轻松解决Python版本和Django版本的兼容问题。Djan
- 一、环境安装 1.安装apache2 sudo apt-get install apache2 安装后在浏览器中打开:http://loca
- MySQL 客户端连接成功后,通过 show [session|global]status 命令 可以提供服务器状态信息,也可以在操作系统上