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


Posted in Python onJune 08, 2021

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 的方法补全。

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

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

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

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

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

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

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

使用 typing

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

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

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

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

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

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

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

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

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

题外话:聪明的 Pylance

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

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

结语

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

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

Python 相关文章推荐
使用python解析xml成对应的html示例分享
Apr 02 Python
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
python连接oracle数据库实例
Oct 17 Python
讲解Python中运算符使用时的优先级
May 14 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
Mar 23 Python
python3.5基于TCP实现文件传输
Mar 20 Python
python 实现倒排索引的方法
Dec 25 Python
Python加密模块的hashlib,hmac模块使用解析
Jan 02 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
Python Unittest原理及基本使用方法
Nov 06 Python
Python如何导出导入所有依赖包详解
Jun 08 #Python
OpenCV-Python实现油画效果的实例
OpenCV-Python实现图像平滑处理操作
OpenCV-Python模板匹配人眼的实例
健身房被搭讪?用python写了个小米计时器助人为乐
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
OpenCV-Python实现轮廓拟合
You might like
小偷PHP+Html+缓存
2006/11/25 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
Javascript 构造函数 实例分析
2008/11/26 Javascript
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
2010/03/20 Javascript
javascript 面向对象 function类
2010/05/13 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
JavaScript随机生成颜色的方法
2016/10/15 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
Django ORM 查询管理器源码解析
2019/08/05 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
业务经理的岗位职责
2013/11/16 职场文书
学雷锋宣传标语
2014/06/25 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
学习雷锋主题班会
2015/08/14 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
怎样写好工作计划
2019/04/10 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技