【原文地址: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人)的更多相关文章

  1. 40多行python代码开发一个区块链。

    40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...

  2. 教你一招,提升你Python代码的可读性,小技巧

    Python的初学者,开发者都应该知道的代码可读性提高技巧,本篇主要介绍了如下内容: PEP 8是什么以及它存在的原因 为什么你应该编写符合PEP 8标准的代码 如何编写符合PEP 8的代码 为什么我 ...

  3. Python中内置数据类型list,tuple,dict,set的区别和用法

    Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...

  4. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  5. Effective Python之编写高质量Python代码的59个有效方法

                                                         这个周末断断续续的阅读完了<Effective Python之编写高质量Python代码 ...

  6. 编写高质量Python代码的59个有效方法

    Python学习资料或者需要代码.视频加Python学习群:960410445 1. 用Pythonic方式思考 第一条:确认自己使用的Python版本 (1)有两个版本的python处于活跃状态,p ...

  7. Python代码整洁之道(一)

    很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之养成了一种习惯.对此呢,我特意收集了一些适合所有学习 Python 的人, ...

  8. 利用这10个工具,你可以写出更好的Python代码

    我每天都使用这些实用程序来使我的Python代码可显示. 它们是免费且易于使用的. 编写漂亮的Python比看起来难. 作为发布工作流程的一部分,我使用以下工具使代码可显示并消除可避免的错误. 很多人 ...

  9. 三行Python代码,让你的数据处理脚本快别人4倍

    Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调整几十万张图像的尺 ...

随机推荐

  1. 实战模拟│JWT 登录认证

    目录 Token 认证流程 Token 认证优点 JWT 结构 JWT 基本使用 实战:使用 JWT 登录认证 Token 认证流程 作为目前最流行的跨域认证解决方案,JWT(JSON Web Tok ...

  2. 渗透测试(PenTest)基础指南

    什么是渗透测试? 渗透测试(Penetration Test,简称为 PenTest),是指通过尝试利用漏洞攻击来评估IT基础设施的安全性.这些漏洞可能存在于操作系统.服务和应用程序的缺陷.不当配置或 ...

  3. 对 API 平台的再思考【eolink翻译】

    API 是推动现代企业数字化转型的基础.它不但连接了内部应用程序.合作伙伴和客户,同时也快速持续地向市场提供了各种新产品.版本和功能. 但当下还是以集中式的 API 交付为主.一个企业的对外 API ...

  4. 07 MySQL_SQL语言分类

    SQL语言分类 DDL Data Definition Language 数据定义语言 包括: create , alter ,drop , truncate; 不支持事务 DML Data Mani ...

  5. C语言课堂--现代编译环境搭建[2020年7月]

    看过了很多专家吐槽目前的大学c语言教学问题多多: 教材难懂,消磨了学生的兴趣: 环境老旧,都2020了还有在用VC6甚至TurboC 2.0,语法不规范. 轮到自己上课,心想可不能再继续这样的c语言课 ...

  6. “杀死” App 上的疑难崩溃

    在移动应用性能方面,崩溃带来的影响是最为严重的,程序崩了可以打断用户正在进行的操作体验,造成关键业务中断.用户留存率下降.品牌口碑变差.生命周期价值下降等影响.很多公司将崩溃率作为优先级最高的技术指标 ...

  7. 关于Tornado5.1:到底是真实的异步和还是虚假的异步

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_107 我们知道Tornado 优秀的大并发处理能力得益于它的 web server 从底层开始就自己实现了一整套基于 epoll ...

  8. 基于Sikuli GUI图像识别框架的PC客户端自动化测试实践

    写在前面 最近两天,公司有个PC客户端的测试任务,除了最基础的功能测试外,还包括稳定性测试和兼容性测试需求.刚好去年接触过Sikuli这款基于GUI图像识别框架的自动化测试工具,于是便应用于测试工作中 ...

  9. Spring的简单使用(3)

    一:SM框架的整合: 所需要的依赖: <dependency> <groupId>junit</groupId> <artifactId>junit&l ...

  10. OC高仿iOS网易云音乐AFNetworking+SDWebImage+MJRefresh+MVC+MVVM

    效果 因为OC版本大部分截图和Swift版本一样,所以就不再另外截图了. 列文章目录 因为目录比较多,每次更新这里比较麻烦,所以推荐点击到主页,然后查看iOS云音乐专栏. 目简介 这是一个使用OC语言 ...