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人)
[原文地址:https://xiaokang2022.blog.csdn.net/article/details/126936985] 一个不会写好的类型标注和注释的Python程序员,是让使用T ...
- Python学习笔记(二)-Python文件类型及编程模式
Python环境搭建:linux,Windows... Linux下:[root@localhost StudyPython]# python #进入交互模式Python 2.7.11 (defaul ...
- 利用OpenCV给图像添加中文标注
利用OpenCV给图像添加中文标注 : 参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html 和https://blog.csdn.net/ ...
- 自定义python扩展类型
目标:自定义一个C\C++矩阵类,有几个用于演示的矩阵运算函数或者操作,将其通过 PyTypeOject newType的方式注册到python中成为一种新的类型,并且要可继承. 预备知识 建议先运行 ...
- Python列表类型及常用操作
Python列表类型 1.用途: 存放多个值,可以根据索引存取值 2.定义方式: 在[ ]内用逗号分割开多个任意类型的值 l=['yven','law','lyf'] #l=list(['yven', ...
- 5、Python 基础类型 -- Dictionary 字典类型
字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: d ...
- python 参数类型理解
简介 大家都知道,在java中,函数或者方法的参数在调用时必须对其进行传参操作,也就是所谓的必选参数,也可以称为位置参数,除此之外,python还拥有其他语言不具有的一些参数类型,以下将进行一一介绍. ...
- Python 变量类型
Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...
- Python变量类型
Python变量类型 变量是存储在内存中的值,因此在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定的内存,并决定什么数据可以被存储在内存中. 因此变量可以指定不同的数据类型, ...
- 配置错误 在唯一密钥属性“fileExtension”设置为“.log”时,无法添加类型为“mimeMap”的重复集合项
错误提示: 配置错误 在唯一密钥属性“fileExtension”设置为“.log”时,无法添加类型为“mimeMap”的重复集合项 配置文件 \\?\D:\www\abc\web.config 出现 ...
随机推荐
- Java面试题及答案整理汇总(2024最新版)
前言 辞退了老板,准备找下家,又要开始面试了,不得不准备准备八股文,还是很有必要针对性的刷一些题,很多朋友的实战能力很强,但是理论比较薄弱,要多准备准备理论知识,攻克面试官.这是我在全网寻找稍微比较完 ...
- 初识GO语言--基本数据类型
- API13Bate版来了DevEco已更新快来看新功能吧
HarmonyOS 5.0.1 Beta3,是HarmonyOS开发套件基于API 13正式发布的首个Beta版本.该版本在OS能力上主要增强了C API的相关能力,多个特性补充了C API供开发者使 ...
- AT cf17 final J Tree MST
AT cf17 final J Tree MST 考场上想出的黑题,然而写挂了-- 思路 考场推出 boruvka 算法,会的直接跳过就好. 结论:一个点向另外一个点连出的最小边,一定在最小生成树上. ...
- 返璞归真!使用 alpinejs 开发交互式 web 应用,抛弃 node_modules 和 webpack 吧!
前言 最近一直在使用 DjangoStarter 开发各种小项目,之前我是比较喜欢前后端分离的,后端用 Ninja API,前端 nextjs,开发起来也挺舒服的,交互体验也比较好. 不过我在网上冲浪 ...
- JVM中的Hello World是如何运行的?
每一个Java开发者都是通过Hello World敲开面向对象世界的大门.但是在一开始,我们考虑的只是这个语言是什么样的,我们如何更好的编码,却很少有人关心他内部是怎么运行的.看下面一个简单的hell ...
- 如何用Docker Compose部署项目?
目录 前言 Docker Compose 1. Docker Compose是什么? 2. Docker Compose 的具体步骤 3. 如何在IDEA项目里面使用Docker Compose 启动 ...
- PythonDay3Advance
PythonDay3Advance 运算符 位运算符 进制: 将整数分了几种进制表示法 二进制:由0,1构成,逢2进1,以0b开头 八进制:由0,1,2,3,4,5,6,7构成,逢8进1,以0开头 十 ...
- 负载均衡-一致性Hash算法
1. Hash算法 哈希(Hash)也称为散列,把任意长度的输入,通过散列算法变换成固定长度的输出,该输出就是散列值.哈希值(hashCode).(来自:百度百科) 在现实中,设计者常常将散列值作为索 ...
- nvm node版本管理
1.说明 NVM是NODE JS的版本管理工具,可以安装nodejs切换nodejs版本. 2.安装NVM https://github.com/coreybutler/nvm-windows/rel ...