Python 类型注解(Type Hints),也称类型标注或类型提示,是给代码添加类型信息的语法,通过显示声明变量、函数参数和返回值的预期数据类型,不影响程序运行但能显著提升代码可读性、可维护性和开发工具支持。本文小编与大家分享 Python 类型注解的相关知识。
一、为什么需要类型注解
Python 以其动态类型特性而闻名。不需要提前声明变量的类型,解释器会在运行时自动推断。这种特性虽然灵活,但也带来了问题:
代码难以理解:调用函数时,不清楚应该传入什么类型的数据;
隐藏的 bug:如果误传错误类型,直到运行时才报错;
开发效率低:IDE 无法提供准确的代码提示和补全。
类型注解(简称注解)通过提供可选的类型信息来解决这些问题,使代码更加健壮和可维护。类型注解作用在于:
需要说明的是,注解只是提示性的,即使不按照注解进行赋值,代码也不会报错(可能某些 IDE 会有警告信息)。但是不遵循注解可能在后期开发遇到不可预见问题,特别是复杂应用或团队协作项目时。 |
二、基本数据类型注解
(一)变量注解
采用 变量名 : 类型 语法为变量注解,例如:name : str,可以读作“变量 name 的类型是 str ”。注意:字符串类型的注解为 str。
(二)函数注解
1、参数注解
使用 参数名 : 类型 语法对函数参数进行注解。
2、默认值参数注解
可以同时使用参数默认值和注解。
3、返回值注解
在函数的括号后面和冒号之前,使用 -> 类型 语法为函数返回值注解。如果无返回值,使用 None 关键字表示。
(三)自定义类的注解
自定义类中的成员同样可以使用注解:
属性与普遍变量注解方式相同;
实例方法中 self 参数不需注解,其他与普通方法注解方式相同;
类方法(@classmethod 标记)中 cls 参数,可直接使用 cls : 类名 语法,也可采用 cls : Type['类名'] 或 cls :Type[类名] 语法注解,其他与普通方法注解方式相同;
静态方法(@staticmethod 标记)与普通方法注解方式相同;
三、复杂数据类型注解
前面介绍的多为基本数据类型注解,但是在处理容器(如,列表、字典等)和复杂数据结构时,就不能仅仅只是注解类型那么简单,例如:
说明列表(list)中只接受某种基本数据类型。比如,只接受 int;
说明字典(dict)中键、值只能是某种基本数据类型。例如,键只接受 str,值只接受 int;
某个数据是联合类型(值可能是多种数据类型中的一种)。比如,用户ID可以是 int 也可以 str;
......;
下面对常见的复杂数据类型注解进行介绍:
(一)列表注解
1、不指定类型
list1 : list = [1, 2, 3, 'a', 'b']
2、指定数据类型
list2 : list[int] = [1, 2, 3]
(二)字典注解
1、键值不指定类型
dict1 : dict = {'Jack' : 20, 'Rose' : 18, 1 : 'a'}
2、键值指定类型
dict2 : dict[str,int] = {'Jack' : 20, 'Rose' : 18}
(三)元祖注解
1、不指定类型
tuple1 : tuple = (1, 'a', 2)
2、指定类型
tuple2 : tuple[str] = ('a', 'b', 'c')
(四)集合注解
1、不指定类型
set1 : set = {1, 2, 'a', 'b'}
2、指定类型
set2 : set[str] = {'a', 'b', 'c'}
(五)联合类型注解
联合类型表明值可以是多种类型中的一种。Python 3.10 以上版本的联合类型注解使用 | 分隔不同数据类型。
userID : None | int | str = '1002'
(六)typing 模块
从 Python 3.5开始,标准库引入了 typing 模块,它提供了多种类型注解工具,使得类型注解更加丰富和强大。typing 模块在后续泛型章节会进行介绍,大家有兴趣也可先自行查阅文档了解。
四、Mypy 静态检查工具
Mypy 是 Python 的静态类型检查工具,能在代码运行前帮助开发者找出类型错误。有关 Mypy 工具的使用在程序调试章节将会进行介绍。
五、类型注解的注意事项
类型注解是 Python 开发的辅助工具,在实际工程中,应注意以下事项:
无须过度注解。例如,循环中的临时计数变量,完全不需要加注解。注解只用于必要的地方;
团队注解风格统一;
考虑版本兼容,使用高版本语法可能在低版本环境中不被支持;
配合使用静态检查工具(例如,Mypy)在运行前进行错误检测;
类型注解的主要用于代码理解和静态检查,且类型注解是非强制性的,即使不遵从注解,代码仍可执行,但是它并不能发现逻辑错误。