概述
Python 作为动态类型语言,本身是没有真正的类型校验,而是由编译器在编译时自动进行判断和转换,这种也叫做弱类型语言,比如 JavaScript 也是弱类型语言。
弱类型语言,编写代码时,给我们提供便利的编码体验和编码速度,可以说这个就是 Python 的优势。但是在我使用 Python 在日常的工作开发中,我认为并不是一个好的优点,强类型校验确实麻烦,必须规定对应的数据必须符合规定的数据类型,虽然让编写代码时需要关注和思考的东西变多。但是我认为好处还是比坏处多。
Python 作为动态类型语言,本身是没有真正的类型校验,而是由编译器在编译时自动进行判断和转换,这种也叫做弱类型语言,比如 JavaScript 也是弱类型语言。
弱类型语言,编写代码时,给我们提供便利的编码体验和编码速度,可以说这个就是 Python 的优势。但是在我使用 Python 在日常的工作开发中,我认为并不是一个好的优点,强类型校验确实麻烦,必须规定对应的数据必须符合规定的数据类型,虽然让编写代码时需要关注和思考的东西变多。但是我认为好处还是比坏处多。
Typing 的基本类型,是可以直接使用 python 内置的数据类型,无需额外的导入(Any 类型除外), 是最基本的类型提示,也是使用的最频繁的类型
int 是 python 中的整数类型
a: int = 1
# b: int = 5.0 类型检查器会警告,因为5.0是float
def add_numbers(a: int, b: int) -> int:
return a + b
result = add_numbers(a, 3) # 正确
# result = add_numbers(a, 5.0) 类型检查器会警告,因为5.0是float
TypeVar(类型变量)是 Python 类型提示(Type Hints) 系统中用于定义泛型(Generics) 的核心工具。它允许你创建一个“占位符”类型,这个占位符可以在函数、类或方法被使用时,被具体的类型所替换,从而让代码在保持类型安全的同时,又能拥有灵活性
简单来说: TypeVar 就是类型变量,可以泛指任何类型,为任何类型进行标注。听着与 Any 一样,但是本质上是不同的
举一个简单的例子,想象有一个函数,它返回传入的列表第一个元素:
容器类型指的是 数据结构 中的 列表, 字典,集合,元组等的数据类型,Python 的容器类型,可以存储的数据类型是任意的,不像其他静态类型语言一样,是需要声明容器类型里存储的数据类型。
Typing 模块中容器类型的类型标注,也是一种泛型类型标注,可以对数据结构中的值进行类型标注,可以细致到对应数据结构中的元素类型,程序在执行中依然是不进行强制校验的,但是 Typing 的容器类型标注,是常用也是最应该使用的类型标注方式
提示
在 Python 3.9+ 以后, python 原生的容器数据结构 list,dict,set,tuple 可以等同于 typing 中的 List,Dict,Set,Tuple 等类型,可以进行泛型约束,无需再导入 typing 模块但是在此之前的 python 版本中,原生的容器类型只能做简单的类型标注,表示该值为一个容器类型。