Python 类型注解

ops/2025/2/3 12:55:28/

文章目录

  • 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/ops/155310.html

相关文章

AD电路仿真

目录 0 前言 仿真类型 仿真步骤 仿真功能及参数设置 仿真模型 应用优势 1 新建原理图 2 放置元器件及布线 3 放置探头 4 实验结果 Operating Point 分析的作用 DC Sweep 的主要功能 Transient Analysis 的主要功能 AC Analysis 的功能 5 总结 1. 直流工作点分析…

【含文档+PPT+源码】基于微信小程序连锁药店商城

项目介绍 本课程演示的是一款基于微信小程序连锁药店商城&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带的…

Deepseek的RL算法GRPO解读

在本文中&#xff0c;我们将深入探讨Deepseek采用的策略优化方法GRPO&#xff0c;并顺带介绍一些强化学习&#xff08;Reinforcement Learning, RL&#xff09;的基础知识&#xff0c;包括PPO等关键概念。 策略函数&#xff08;policy&#xff09; 在强化学习中&#xff0c; a…

MYSQL学习笔记(六):聚合函数、sql语句执行原理简要分析

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇是内容较少&#xff0c;主要讲解&#xff1a;聚合函数和简要介绍sql语句执行过…

w189电商平台的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

matlab下面zoom显示75%是什么意思

在MATLAB中&#xff0c;zoom命令用于控制图形的缩放。当你看到zoom显示75%这样的表述时&#xff0c;它通常意味着当前图形的缩放比例被设置为75%。这里的百分比表示图形相对于其原始大小的缩放程度。 具体来说&#xff1a; - **100%** 表示图形是原始大小&#xff0c;没有进行…

AI软件栈:LLVM分析(一)

文章目录 AI 软件栈后端编译LLVM IRLLVM的相关子项目AI 软件栈后端编译 AI软件栈的后端工作通常与硬件架构直接相关,为了实现一个既能适配现代编程语言、硬件架构发展的目标,所以提出了LLVM具备多阶段优化能力提供基础后端描述,便于进行编译器开发兼容标准编译器的行为LLVM …

工业数据分析:解锁工厂数字化的潜力

工业数据分析:解锁工厂数字化的潜力 引言 工业数据分析是工业4.0时代的核心技术之一。从生产设备的传感器数据,到供应链的物流信息,工业环境中每天都会产生海量数据。这些数据蕴藏着巨大的潜力,能够帮助企业优化生产流程、降低运营成本、提高产品质量。 然而,如何高效地…