Typing 模块介绍
Typing 模块介绍
概述
Python 作为动态类型语言,本身是没有真正的类型校验,而是由编译器在编译时自动进行判断和转换,这种也叫做弱类型语言,比如 JavaScript 也是弱类型语言。
弱类型语言,编写代码时,给我们提供便利的编码体验和编码速度,可以说这个就是 Python 的优势。但是在我使用 Python 在日常的工作开发中,我认为并不是一个好的优点,强类型校验确实麻烦,必须规定对应的数据必须符合规定的数据类型,虽然让编写代码时需要关注和思考的东西变多。但是我认为好处还是比坏处多。
在我的日常工作开发中,Python 弱类型有些时候真的让人头疼:
随着代码量的增多,经常会忽视掉上层代码的各种类型问题,可能就会因为类型的异常,导致程序出现各种各样的 BUG,而且这种类型的错误,还不是那么容易找,需要花时间和精力去 DeBug,寻找问题点
当接手别人的项目或者维护自己写了很久的代码时,弱类型真的会让人奔溃,经常会出现,需要判断这个变量是什么类型,从哪里赋值,赋值给谁,这个方法返回了什么,需要传什么类型的参数,参数从哪来,最后执行完会是什么类型的数据,然后一行一行代码的跟,慢慢的推,想想就觉得窒息
当有时候调用一些第三方库,我们是在编码过程中,突然忘记需要调用的方法叫什么或者需要传入什么类型的参数,或者需要接什么类型的数据,这个时候就得去查教程找开发文档
这些可以说,是开发过程中很常见的问题,所以 Typing 我认为是每个 Python 开发者都需要掌握的第三方库,他可以很好减少我们在开发中因为类型而带来的问题
介绍
Typing 是 Python 3.5 新增的内置库,用于对变量、函数、类进行类型注解。但是 Python 仍然是 动态类型语言,所以类型注解只是对编码时类型进行标注,并不会影响运行时行为。
类型注解是可选的,可以逐步添加到现有项目中,不会对现有的程序或者代码造成影响,他只是让我们在编码时候可以写出更加优雅且明了的代码,可以帮助程序员避免错误,提高代码质量,养成良好的编程习惯。
注意
但是并不意味着类型注解必须使用和过度使用,过度使用复杂类型会使整个代码变得十分冗长复杂,可读性变得更差,适得其反,得要学会如和合理高效的使用类型注解
Typing 的好处
代码可读性:明确参数和返回值的预期类型,使代码更易于理解
IDE 支持:现代 IDE(如 PyCharm、VSCode)可以利用类型注解提供更好的代码补全、错误检查和重构支持
静态类型检查:可以使用 mypy 或 pyright 等工具进行静态类型检查,在运行前发现潜在的类型错误
文档:作为代码文档的一部分,比注释更结构化
大型项目维护:在大型项目中帮助团队协作,减少类型相关的错误
Typing 类型分类
Typing 模块包含了日常开发中大部分的类型
大致有以下这几种常用类型:
| 类型种类 | 类型名称 | 类型描述 |
|---|---|---|
| 基本类型 | int | 整型 |
| float | 浮点型 | |
| str | 字符类型 | |
| bool | 布尔型 | |
| bytes | 字节类型 | |
| tuple | 元组类型 | |
| dict | 字典类型 | |
| set | 集合类型 | |
| list | 列表类型 | |
| Any | 任意类型 | |
| None | 空类型 | |
| 容器类型 | List | 列表类型 |
| Tuple | 元组类型 | |
| Dict | 字典类型 | |
| Set | 集合类型 | |
| FrozenSet | 不可变集合类型 | |
| Sequence | 只读序列(抽象基类) | |
| Mapping | 映射类型 | |
| 复合类型 | Union | 联合类型 |
| Optional | 可选类型 | |
| Literal | 字面量类型 | |
| Final | 常量类型 | |
| Annotated | 注解类型 | |
| 函数类型 | Callable | 可调用类型 |
| Generator | 生成器类型 | |
| Coroutine | 协程类型 | |
| AsyncGenerator | 异步生成器类型 | |
| Awaitable | 可等待类型 | |
| Iterable | 可迭代类型 | |
| Iterator | 迭代器类型 | |
| 泛型定义 | TypeVar | 类型变量 |
| Generic | 泛型基类 | |
| Protocol | 协议类型 | |
| 其他类型 | 自定义类 | |
| TypeAlias | 类型别名 | |
| TypedDict | 类型字典 | |
| NewType | 创建区分类型 | |
| @overload | 函数重载 | |
| @final | 禁止继承 | |
| @runtime_checkable | 运行时检查 |