Python 代码智能感知 —— 类型标注与特殊的注释(献给所有的Python人)
【原文地址:https://xiaokang2022.blog.csdn.net/article/details/126936985】
一个不会写好的类型标注和注释的Python程序员,是让使用TA的代码的人都痛苦无比的事情……
—— 某某大佬
一、代码智能感知
想必大部分现代的集成开发环境(IDE)都有代码智能感知功能吧!
智能感知(IntelliSense),就是在我们写代码的时候,代码编辑器自动弹出我们代码中需要补全的部分,而这些补全的部分就是代码编辑器通过智能感知得到的,最重要的是,代码编辑器智能地感知补全的部分是通过代码中的变量的类型来得到的。

说了这么多之后,大家一定都清楚智能感知是什么了,但有些时候,代码却没有智能感知(如下)

当代码量很大的时候,代码的智能感知是十分重要的,它可以帮你迅速了解到这个变量那个变量是个什么东西,以减少你生产BUG!
写一个好的注释(或者类型标注),不仅仅是方便未来复用你代码的人,也是为了自己,实际上,“为了自己”可不只是简单的方便自己了解代码,更多的是让IDE智能地感知到你的代码,IDE理解了你的代码,它就会为你提供对应的信息(如代码补全和提示作用),这对程序员是极其友好的!
通过了解后面的类型标注和特殊的注释,你将解决几乎所有的智能感知失效的问题!
二、类型标注
Python的类型标注有几种,在下面我给出我所知道的一些
函数参数的类型标注
【简单操作】
1 def function(num: int, string: str):
2 pass
在上面的代码中,函数参数的后面跟了一个冒号和一个类名,代表参数的数据类型,这个类名可以是内置的类,如str、int、float等,也可以是自己定义的类、也可以是模块、库中的类,如tkinter.Tk
num参数是int类型的,string参数是str类型的,这些类型标注不仅仅在函数被定义的地方可以被看见,在调用该函数的时候也能通过IDE的智能感知而被看见(如下)

这个类型标注之后,并不会强制该参数使用该类型,它只是起提示作用,相当于注释,同时,IDE会通过智能感知该类型标注,给出相应的代码提示

【高级操作】
1 import typing
2
3 def function(num: int,
4 lis: list[int],
5 key: typing.Literal[4, 5, 6],
6 string: str | None = '123'):
7 pass
上面的代码中:
list[int] 的意思是,lis参数的数据类型为一个内含整数数据的列表类型
typing是一个官方的内置模块,专门用于类型标注,typing.Literal[4, 5, 6] 表示参数key的预期值只能为4或者5或者6,也就是说,该函数接收的key参数,它只希望它是4、5或者6这三个值中的一个
str | None 的意思是,string参数的数据类型可以为str或者是None类型,此处说明一下,类型标注中用 “|” 代表或者的这种操作是在 Python3.10 的时候才加入的,在之前的版本中,这种用法只在 pyi 文件(Python存根文件)中可以用
下面的代码提示中,我们就能看到类似于上面的类型标注的作用

顺便一提,那个省略号(三个连续的小数点)的意思的默认值(一般用于pyi存根文件中)
函数返回值的类型标注
1 def pow(m: int, n: int) -> int:
2 return m**n
函数返回值的类型标注类似于上面所说的参数类型标注,只不过这里标注的类型只的是函数的返回值的数据类型,同样的,只起提示作用,没有强制效果
这个标注也有高级用法,与上面的完全,一样,此处不再赘述
顺便一提,list[int, int, int] 表示一个含有三个整数数据的列表类型
变量的类型标注
传言有一种从天而降的写法,不知大家见过没有
1 key: int
2 key = 3
3
4 """
5 或者这样写:
6 key: int = 3
7 """
8
9 print(key) # 输出3
这个变量名后面加一个冒号、再加一个类名的写法也是类型标注的一种,只不过它不是函数的参数,而是一般变量而已,用法同上
那么,这个类型标注有什么用呢?直接赋值给该变量一个列表,那么IDE不也能识别它么?
这对于一般的变量确实没啥用,但是,下面的这种操作,你可看好了

上面的这种情况,当变量没有提前做好类型标注时,后面写代码就因为没有IDE的提示而极其麻烦
变量的类型标注还有一种方法,将在后面的 特殊的注释 中讲到
三、特殊的注释
一段看似普通的注释,实际也有着特殊的作用,就像C#中的特殊注释一样(三条斜杠“///”),Python也有着它特殊的注释
【三引号注释】
想必一个合格的Python程序员,都知道三引号注释的特殊作用吧
它不仅仅是一段普通的注释,它可以换行(都知道的),它写在函数和类下面表示帮助文档等等……这里就不再赘述了
【特殊的 # 注释】
它只能单行注释……除此之外难道它还有别的特性???对!别的特性!
当 # 注释以这样一种格式写的时候,它有着和类型标注同样的效果!!!
1 key = [] # type: list[float]
# 注释后面写上 type,再加一个冒号、然后加上数据类型,它就成了类型标注!!!

是不是大多数人都不知道这个特性呢?
四、特殊的类型
有一些比较特别的数据类型,有些不是内置的但又算是内置的,但你又不容易找到它,比如迭代器类型、生成器类型、函数类型(Python里函数实际也是个对象,也有类型)等等,下面给出一个表格方便大家进行类型的标注
类型名称 | 数据类型 | 引用方式 |
函数 | function |
function types.FunctionType |
方法 | method |
types.MethodType |
迭代器 | Iterator |
typing.Iterator collections.abc.Iterator |
生成器 | Generator |
typing.Generator collections.abc.Generator |
序列 | Sequence |
typing.Sequence collections.abc.Sequence |
【看了这么多,是不是感觉又涨知识了呢?那么,你的赞呢?】
Python 代码智能感知 —— 类型标注与特殊的注释(献给所有的Python人)的更多相关文章
- 40多行python代码开发一个区块链。
40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...
- 教你一招,提升你Python代码的可读性,小技巧
Python的初学者,开发者都应该知道的代码可读性提高技巧,本篇主要介绍了如下内容: PEP 8是什么以及它存在的原因 为什么你应该编写符合PEP 8标准的代码 如何编写符合PEP 8的代码 为什么我 ...
- Python中内置数据类型list,tuple,dict,set的区别和用法
Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- Effective Python之编写高质量Python代码的59个有效方法
这个周末断断续续的阅读完了<Effective Python之编写高质量Python代码 ...
- 编写高质量Python代码的59个有效方法
Python学习资料或者需要代码.视频加Python学习群:960410445 1. 用Pythonic方式思考 第一条:确认自己使用的Python版本 (1)有两个版本的python处于活跃状态,p ...
- Python代码整洁之道(一)
很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之养成了一种习惯.对此呢,我特意收集了一些适合所有学习 Python 的人, ...
- 利用这10个工具,你可以写出更好的Python代码
我每天都使用这些实用程序来使我的Python代码可显示. 它们是免费且易于使用的. 编写漂亮的Python比看起来难. 作为发布工作流程的一部分,我使用以下工具使代码可显示并消除可避免的错误. 很多人 ...
- 三行Python代码,让你的数据处理脚本快别人4倍
Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调整几十万张图像的尺 ...
随机推荐
- (一)Linux环境的学习环境的搭建
我们使用VMWARE来安装Debian11系统来进行我们的LINUX学习 Debian虚拟机的安装 vmware-tools的安装 xShell的安装使用 samba的配置 gcc环境的配置 Debi ...
- STM32液晶显示HT1621驱动原理及程序代码
1.HT1621电路分析 HT1621为32×4即128点内存映像LCD驱动器,包含内嵌的32×4位显示RAM内存和时基发生器以及WDT看门狗定时器. HT1621驱动电路如下图所示: 图1 与单片机 ...
- LMC7660即-5V产生电路
LMC7660为小功率极性反转电源转换器,通过LMC7660电路产生-5V电压,其芯片管脚定义如下表所示. LMC7660负电压产生电路如下图所示. 其中6脚当供电电压大于等于5V时该脚必须悬空,当供 ...
- 近期碰到的一些面试题--WPF、C#、数据库
最近想换工作的念头特别强烈,面了几家公司没有拿到满意的offer,心仪的公司面完锁HC,有点无奈,感觉今年有点卷,把碰到过的面试题总结下. WPF相关: 1.定义依赖属性需要注意哪些地方? (1)依赖 ...
- samba打开一个文件的函数调用栈
ceph_open cephwrap_open open_fn smb_vfs_call_open SMB_VFS_OPEN fd_open fd_open_atomic open_file open ...
- VIM编辑器的宏操作
这两天看到一个小练习,要求如下: 在GVIM下,将下面这张图的内容 改成下面这样 并且指出,要用批量操作的方式,不能一行一行的键入 其实第一反应是利用正则表达式来操作,但是让用正则表达式以外的操作方式 ...
- 2022徐特立科学营&BIT机器人队电控课程讲义
目录 \(\cdot\)电控简介 \(\cdot\)认识单片机 什么是单片机 时钟-单片机的脉搏 \(\cdot\)外设及应用 GPIO PWM 定时器 UART \(\cdo ...
- while循环和dowhile
while循环语句 根据条件来选择是否执行循环体内的执行语句 while语句会循环判断条件是否成立只要成立就会执行,直到条件不匹配循环结束 int a = 0: while(a<10){ a++ ...
- Docker非root用户使用
Docker 用户管理 安装Docker后docker相关命令都需要加上sudo才能执行,这里为特定用户添加下权限 Docker群组 不过一般安好docker后该群组已创建 sudo groupadd ...
- 2499-springboot使用jar形式打包在linux上运行
由于maven使用的种种问题,以前springboot版本变化较快带来的一些不兼容问题,是否考虑下使用jar形式运行web程序,而不是固守于war包与tomcat: 主要原理有两点: 使用nohup来 ...