Python应用进阶DAY9--类型注解Type Hinting

前面相关文章:

Python核心基础DAY1--Python的基础变量类型之字符串和数字类型

Python核心基础DAY2--复合类型之序列类型、映射类型和集合类型

Python核心基础DAY3--Python表达式及常见语句

Python核心基础DAY4--Python函数和内置函数总结

Python应用进阶DAY5--Python装饰器函数总结

Python应用进阶DAY6--类和对象的基本概念及属性和方法的常见分类和使用场景

Python应用进阶DAY7--面向对象编程基本特性和super函数

Python应用进阶DAY8--迭代器和生成器


目录

[类型注解Type Hinting](#类型注解Type Hinting)

一、容器类型

二、复杂类型

联合类型

泛型

三、函数注解

基础函数注解

变长参数的注解

函数作为参数的注解(Callable)

四、自定义类型

字典结构约束

创建别名类型

五、Any与NoReturn

六、静态检查

七、总结

基本类型注解速查表

函数注解细节说明表


类型注解Type Hinting

类型注解(Type Hinting)是从Python 3.5开始引入的功能,可用于提高代码的可读性、可维护性,并帮助静态分析工具进行类型检查

基本类型注解

类型 说明 示例
int 整数类型 x: int = 10
float 浮点数类型 pi: float = 3.14
bool 布尔类型 flag: bool = True
str 字符串类型 name: str = "Python"
None 空值 value: None = None

一、容器类型

需要 typing 模块中的类型别名,如 ListDictTuple

python 复制代码
from typing import List, Dict, Tuple, Set  # 导入所需的类型注解
nums: List[int] = [1, 2, 3]  # 定义一个整数列表
info: Dict[str, int] = {"age": 30}  # 定义一个字符串到整数的字典
coordinates: Tuple[float, float] = (1.5, 3.2)  # 定义一个包含两个浮点数的元组
unique_items: Set[str] = {"apple", "banana"}  # 定义一个字符串集合

可选类型

表示变量可能是某种类型,也可能是 None:

python 复制代码
from typing import Optional  # 导入Optional类型用于表示可选值
# 定义一个函数get_name,接受一个整数参数user_id,并返回一个可选的字符串
def get_name(user_id: int) -> Optional[str]:
    # 如果user_id等于1,返回字符串"Alice",否则返回None
    return "Alice" if user_id == 1 else None

等价于:

python 复制代码
def get_name(user_id: int) -> str | None:
    return "Alice" if user_id == 1 else None

二、复杂类型

联合类型

Union[A, B]表示变量可以是A或B:

python 复制代码
from typing import Union  # 导入Union类型用于表示联合类型
# 定义一个函数process,接受一个参数data,该参数可以是整数或字符串,并返回一个字符串
def process(data: Union[int, str]) -> str:  
    return str(data)  # 将传入的数据转换为字符串并返回

Python 3.10+ 可简化为:

python 复制代码
def process(data: int | str) -> str:
    return str(data)

泛型

如果函数或类可以适用于不同类型,但需要保证类型一致,用泛型 Generic[T]

使用 TypeVar 创建泛型类型:

python 复制代码
from typing import TypeVar, Generic  # 导入TypeVar和Generic用于定义泛型
T = TypeVar("T")  # 定义一个泛型类型变量T
class Box(Generic[T]):  # 定义一个泛型类Box,接受一个类型参数T
    def __init__(self, content: T):  # 定义构造函数,接受一个参数content,其类型为T
        self.content = content  # 将传入的内容存储在实例变量content中
box1: Box[int] = Box(10)  # 创建一个Box对象,指定内容类型为int,并初始化为10
box2: Box[str] = Box("hello")  # 创建一个Box对象,指定内容类型为str,并初始化为"hello"

三、函数注解

函数注解是 Python 3 引入的特性,允许在函数定义时为参数和返回值添加类型说明。注解本身不会影响函数的执行(Python 解释器不会强制检查类型),但能为开发者和工具(如 IDE、类型检查器)提供清晰的类型提示。

基本语法

  1. 参数注解:参数名: 类型(如 x:int 表示参数x应为整数)。
  2. 返回值注解:-> 类型(如 → int 表示函数返回值应为整数)。

基础函数注解

python 复制代码
from typing import Callable  # 导入Callable类型用于表示可调用对象
def add(x: int, y: int) -> int:  # 定义一个函数add,接受两个整数参数x和y,返回一个整数
    return x + y  # 返回x和y的和

变长参数的注解

变长参数包括位置变长参数(*args)和关键字变长参数(**kwargs),注解需指定参数内部元素的类型

python 复制代码
# 定义一个函数multiply,接受任意数量的整数参数,并返回一个整数
def multiply(*args: int) -> int:  
    result = 1  # 初始化结果为1
    for num in args:  # 遍历所有传入的参数
        result *= num  # 将每个参数乘到结果上
    return result  # 返回最终的结果
# 定义一个函数user_info,接受一个字符串参数name和任意数量的关键字参数kwargs
def user_info(name: str, **kwargs: str) -> None:  
    print(f"User: {name}, Details: {kwargs}")  # 打印用户名和详细信息

函数作为参数的注解(Callable

当函数的参数是另一个函数时,需使用 typing.Callable 注解函数类型,语法为 Callable[[参数类型...], 返回值类型]

python 复制代码
from typing import Callable  # 导入Callable类型用于表示可调用对象
def apply_func(func: Callable[[int, int], int], x: int, y: int) -> int:
    # 定义一个函数apply_func,接受一个可调用对象func和两个整数参数x和y,并返回一个整数
    return func(x, y)  # 调用传入的函数func,并将x和y作为参数传递给它,返回其结果

四、自定义类型

自定义类型有比较高的灵活性

字典结构约束

python 复制代码
from typing import TypedDict
# 定义一个TypedDict类,用于指定字典的键及其对应的值类型
class User(TypedDict):
    name: str    # name 键对应的是字符串类型
    age: int     # age 键对应的是整数类型
# 创建一个符合User类型的字典实例
user: User = {
    "name": "Alice",  # 字典中name键的值为字符串"Alice"
    "age": 25         # 字典中age键的值为整数25
}

创建别名类型

python 复制代码
from typing import NewType
# 使用NewType定义一个新的类型UserID,它是int类型的子类型
UserID = NewType("UserID", int)
# 定义一个函数get_user,接受一个UserID类型的参数并返回一个字符串
def get_user(user_id: UserID) -> str:
    # 返回格式化的字符串,包含传入的user_id
    return f"User {user_id}"
# 创建一个UserID实例,值为1001
uid = UserID(1001)
# 调用get_user函数,并打印其返回值
print(get_user(uid))

五、Any与NoReturn

爱啥啥 和 啥也没

【任何类型】:

python 复制代码
from typing import Any
def process(data: Any) -> None:
    print(data)

【不返回值】:

python 复制代码
from typing import NoReturn
def fatal_error(message: str) -> NoReturn:
    raise RuntimeError(message)
    # 之后的代码不再执行

六、静态检查

静态类型检查 :在代码运行前(编译阶段或执行前)分析代码中的类型注解,验证类型的一致性,提前发现潜在的类型错误。

与动态类型的区别:Python 是动态类型语言(运行时才检查类型),而静态类型检查通过注解在编译期发现问题。

mypy是 Python 最流行的静态类型检查工具,需单独安装

python 复制代码
pip install mypy
  1. 根据函数 / 变量的类型注解进行检查。
  2. 若无注解,mypy默认按Any类型处理(不检查类型)。
python 复制代码
mypy script.py  # 检查单个Python文件
mypy directory/  # 递归检查目录下所有Python文件

示例

假设有以下代码(script.py):

python 复制代码
def add(x: int, y: int) -> int:
    return x + y
result = add("2", 3)  # 错误:字符串不能作为int类型参数

运行mypy script.py会输出:

python 复制代码
script.py:3: error: Argument 1 to "add" has incompatible type "str"; expected "int"
Found 1 error in 1 file (checked 1 source file)

七、总结

类型注解:通过标注变量、函数的类型,提升代码可读性,支持静态检查工具提前发现类型错误,是大型项目和团队协作的重要实践。

基本类型注解速查表

注解语法 说明 示例代码
int 整数类型 age: int = 25
float 浮点数类型 pi: float = 3.14
bool 布尔类型 is_valid: bool = True
str 字符串类型 name: str = "Python"
None 空值类型 result: None = None
List[元素类型] 列表(需导入 typing.List nums: List[int] = [1, 2, 3]
Dict[键类型, 值类型] 字典(需导入 typing.Dict info: Dict[str, int] = {"age": 30}
Tuple[类型1, 类型2] 元组(需导入 typing.Tuple point: Tuple[float, float] = (1.5, 3.2)
Set[元素类型] 集合(需导入 typing.Set tags: Set[str] = {"python", "code"}

函数注解细节说明表

注解对象 语法格式 说明 示例代码
普通参数 参数名: 类型 标注参数的预期类型 python<br>def add(x: int, y: int) -> int:<br> return x + y<br>
返回值 -> 类型 标注函数的返回值类型 同上
位置变长参数(*args) *args: 元素类型 标注 *args 中元素的类型 python<br>def sum(*args: int) -> int:<br> return sum(args)<br>
关键字变长参数(**kwargs) ** kwargs: 值类型 标注 **kwargs 中值的类型 python<br>def log(** kwargs: str) -> None:<br> print(kwargs)<br>
自定义类型约束 TypedDict 类定义 约束字典的键和对应值的类型 python<br>class User(TypedDict):<br> name: str<br> age: int<br>user: User = {"name": "Alice", "age": 25}<br>

通过以上表格可以快速查阅生成器的特性、类型注解的语法规则及应用场景,帮助理解和使用这两个 Python 重要特性

相关推荐
杜子不疼.9 分钟前
C语言—如何生成随机数+原理详细分析
c语言·开发语言
java1234_小锋19 分钟前
【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 基于jieba实现词频统计
python·自然语言处理·flask
星期天要睡觉27 分钟前
python网络爬虫(第一章/共三章:网络爬虫库、robots.txt规则(防止犯法)、查看获取网页源代码)
开发语言·爬虫·python
能工智人小辰35 分钟前
二刷 黑马点评 秒杀优化
java·开发语言
杨小扩36 分钟前
夯实基础:配置Java开发环境JDK与构建工具Maven
java·开发语言·maven
大飞pkz37 分钟前
【Lua】闭包可能会导致的变量问题
开发语言·lua
大飞pkz40 分钟前
【Lua】题目小练2
开发语言·lua·游戏开发·lua题目
Gyoku Mint42 分钟前
深度学习×第10卷:她用一块小滤镜,在图像中找到你
人工智能·python·深度学习·神经网络·opencv·算法·cnn
测试老哥1 小时前
使用Jmeter进行http接口性能测试
自动化测试·软件测试·python·测试工具·jmeter·http·测试用例
云和数据.ChenGuang1 小时前
bash-completion未安装或未启用
开发语言·bash