Python 类型注解

devtools/2025/2/2 6:27:33/

文章目录

  • Python 类型注解详解
    • 1. 引言
    • 2. Python 类型注解基础
      • 2.1 变量类型注解
      • 2.2 函数参数和返回值注解
      • 2.3 `typing` 模块的支持
    • 3. 进阶:复杂数据类型
      • 3.1 可选类型(Optional)
      • 3.2 联合类型(Union)
      • 3.3 泛型(Generics)
    • 4. 运行时类型检查
      • 4.1 `get_type_hints()` 获取类型信息
      • 4.2 自定义类型检查装饰器
    • 5. 静态类型检查工具 `mypy`
    • 6. 总结

Python 类型注解详解

1. 引言

Python 作为一门动态语言,默认不会对变量类型进行强制检查。但在大型项目或多人协作开发时,缺少类型约束可能会导致代码难以维护、调试困难。为了解决这个问题,Python 从 3.5 版本开始引入了 类型注解(Type Hinting),并在后续版本中不断增强。

本篇文章将详细介绍 Python 类型注解的用法,包括基础语法、高级应用、动态检查、类型推断等内容,帮助你写出更加安全、可读性更强的 Python 代码。


2. Python 类型注解基础

2.1 变量类型注解

Python 允许在变量定义时添加类型注解,但不会影响实际执行。

python"># 变量的类型注解
x: int = 10
y: str = "Hello"
z: float = 3.14print(__annotations__)
# 输出: {'x': <class 'int'>, 'y': <class 'str'>, 'z': <class 'float'>}

注意

  • __annotations__ 变量会存储所有的全局变量类型信息。
  • 变量的类型注解仅用于静态检查,不会影响运行时的行为。

2.2 函数参数和返回值注解

函数的参数和返回值可以使用 -> 进行类型标注。

python">def add(x: int, y: int) -> int:return x + yprint(add.__annotations__)
# 输出: {'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

这有助于 IDE 提供更好的自动补全,并能被静态分析工具(如 mypy)检查。

2.3 typing 模块的支持

对于更复杂的类型,我们可以使用 typing 模块提供的工具,例如 ListDictTuple 等。

python">from typing import List, Dict, Tuple# 列表类型
numbers: List[int] = [1, 2, 3, 4]# 字典类型
user_info: Dict[str, int] = {"age": 25, "height": 175}# 元组类型
point: Tuple[int, int] = (10, 20)

3. 进阶:复杂数据类型

3.1 可选类型(Optional)

如果某个参数可以是 None,可以使用 Optional 进行标注。

python">from typing import Optionaldef greet(name: Optional[str]) -> str:if name:return f"Hello, {name}"return "Hello, Guest"

等价于:

python">def greet(name: str | None) -> str:  # Python 3.10+ 支持 | 作为联合类型return f"Hello, {name or 'Guest'}"

3.2 联合类型(Union)

如果一个变量可以有多种类型,可以使用 Union

python">from typing import Uniondef process_data(data: Union[int, str]) -> str:return str(data)

3.3 泛型(Generics)

在处理通用数据结构时,可以使用泛型 TypeVar

python">from typing import TypeVar# 占位符类型
T = TypeVar("T")def get_first(items: list[T]) -> T:return items[0]print(get_first([1, 2, 3]))  # 输出: 1
print(get_first(["a", "b", "c"]))  # 输出: a

4. 运行时类型检查

4.1 get_type_hints() 获取类型信息

可以使用 typing.get_type_hints() 在运行时获取类型信息。

python">from typing import get_type_hintsdef example(a: int, b: str) -> bool:return str(a) == bprint(get_type_hints(example))
# 输出: {'a': <class 'int'>, 'b': <class 'str'>, 'return': <class 'bool'>}

4.2 自定义类型检查装饰器

可以使用 __annotations__ 编写运行时类型检查装饰器。

python">def enforce_types(func):def wrapper(*args, **kwargs):hints = func.__annotations__for arg, (param, expected_type) in zip(args, hints.items()):if param != 'return' and not isinstance(arg, expected_type):raise TypeError(f"参数 {param} 应该是 {expected_type}, 但接收到 {type(arg)}")return func(*args, **kwargs)return wrapper@enforce_types
def multiply(a: int, b: int) -> int:return a * bprint(multiply(2, 3))  # 正常执行
print(multiply("2", 3))  # 抛出 TypeError

5. 静态类型检查工具 mypy

Python 类型注解主要用于静态检查,推荐使用 mypy 进行检查。

安装 mypy

pip install mypy

运行静态检查

mypy my_script.py

如果 my_script.py 中有类型错误,mypy 会报错。


6. 总结

Python 的类型注解可以帮助提高代码可读性和可维护性,并且可以结合 mypy 进行静态检查。本篇文章介绍了:

✅ 变量、函数的基础类型注解
typing 模块的高级类型(OptionalUnion、泛型等)
✅ 运行时类型检查的方法
mypy 进行静态类型检查

若有错误与不足请指出,关注DPT一起进步吧!!!


http://www.ppmy.cn/devtools/155360.html

相关文章

基于Flask的旅游系统的设计与实现

【Flask】基于Flask的旅游系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为后端开发语言&#xff0c;结合前端Bootstrap框架&#xff0c;为用户提供了丰富…

【深度学习】softmax回归的从零开始实现

softmax回归的从零开始实现 (就像我们从零开始实现线性回归一样&#xff0c;)我们认为softmax回归也是重要的基础&#xff0c;因此(应该知道实现softmax回归的细节)。 本节我们将使用Fashion-MNIST数据集&#xff0c;并设置数据迭代器的批量大小为256。 import torch from IP…

家居EDI:Hom Furniture EDI需求分析

HOM Furniture 是一家成立于1977年的美国家具零售商&#xff0c;总部位于明尼苏达州。公司致力于提供高品质、时尚的家具和家居用品&#xff0c;满足各种家庭和办公需求。HOM Furniture 以广泛的产品线和优质的客户服务在市场上赢得了良好的口碑。公司经营的产品包括卧室、客厅…

2025_2_1 C语言中关于字符串

1.字符串 C语言中的字符串都是字符数组&#xff0c;以空字符 ‘\0’结尾。 创建一个字符数组必须以空字符结尾&#xff0c;不然会访问非法区域&#xff0c;直到找到\0为止 char c[] {a, b, c, \0};长度为n的字符串字面值&#xff0c;会存储在虚拟内存中的只读数据段中&#…

使用 Spring JDBC 进行数据库操作:深入解析 JdbcTemplate

目录 1. Spring JDBC 简介 2. JdbcTemplate 介绍 3. 创建数据库和表 4. 配置 Spring JDBC 5. 创建实体类 6. 使用 JdbcTemplate 实现增、删、改、查操作 7. Spring JDBC 优点 8. 小结 1. Spring JDBC 简介 Spring JDBC 是 Spring 框架中的一个模块&#xff0c;旨在简化…

ES2021+新特性、常用函数

一、ES2021新特性 ES2021 数字分隔符 let num 1234567 let num2 1_234_567 Promise.any 与 Promise.all 类似&#xff0c;Promise.any 也接受一个 Promise 的数组。当其中任何一个 Promise 完成&#xff08;fullfill&#xff09;时&#xff0c;就返回那个已经有完成值的 …

WPS怎么使用latex公式?

1、下载并安装mathtype https://blog.csdn.net/weixin_43135178/article/details/125143654?sharetypeblogdetail&sharerId125143654&sharereferPC&sharesourceweixin_43135178&spm1011.2480.3001.8118 2、将mathtype嵌入在WPS MathType面板嵌入器,免费工具…

【huawei】云计算的备份和容灾

目录 1 备份和容灾 2 灾备的作用&#xff1f; ① 备份的作用 ② 容灾的作用 3 灾备的衡量指标 ① 数据恢复时间点&#xff08;RPO&#xff0c;Recoyery Point Objective&#xff09; ② 应用恢复时间&#xff08;RTO&#xff0c;Recoyery Time Objective&#xff09; 4…