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 出现 ...
随机推荐
- python之图片与视频互转
图片转视频 def image_to_video(image_dir, video_dir, fps): im_list = [i for i in os.listdir(image_dir) if ...
- 基于BIO的Socket通信
基于BIO的Socket通信 告知对方命令发送完毕 关闭socket:socket.close() 关闭流:socket.shutdownOutput(),ocket.shutdownInput() ...
- Linux_rpm包的管理
介绍 rpm用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文·件.RPM是RedHat Package Manager ( RedHat软件包管理工具)的 ...
- Spring AI 再更新:如何借助全局参数实现智能数据库操作与个性化待办管理
引言 好的,今天我们继续聊一下Spring AI的相关内容.在10月的时候,我使用Spring AI搭建了一个简易版的个人助理系统,整体来说效果还是非常不错的.通过这次尝试,我对业务系统与AI结合的探 ...
- C# Modbus 之 EasyModbus
直接上代码 public int EasyModbusReadInputRegisters() { ModbusClient modbusClient = new ModbusClient(_spHe ...
- Air201资产定位模组LuatOS:录音&播放录音功能的操作方法
一直有小伙伴们问,迷你小巧的合宙Air201虽然有很多优点,超低功耗.精准定位,那么它是否支持录音.播放录音功能? 那必须能!高集成化设计的Air201自带了ES8311音频解码芯片(Audio ...
- 小米R3G刷了padavan后时间不同步和定时关闭外网(wan)端口
怎么刷openwrt或者padavan请见我2022年3月份的帖子 https://www.cnblogs.com/jar/p/15954037.html 最近遇到个新环境,遂拿出来用用 有1个问题和 ...
- springboot~jpa优雅的处理isDelete的默认值
如果多个实体类都有 isDelete 字段,并且你希望在插入时为它们统一设置默认值,可以采取以下几种方法来减少代码重复: 1. 使用基类(抽象类) 创建一个基类,其中包含 isDelete 字段和 @ ...
- C++ 实现万年历(原创)
2020年08月31日 首次分享文档源代码. 2023年11月23日 对文档.代码进行了更新,希望可以帮助到你. 1. 实现功能 提供菜单方式选择,假定输入的年份在1940-2040年之间. 输入一个 ...
- fastadmin表格 - 自定义接口
1.文本过长溢出 文本超过250px则隐藏,如果需要修改此宽度,请在具体页面中重新定义formatter方法 点击通过弹窗展示完整的内容 弹窗插件使用Layer.js 调用方法 {field: 'co ...