前面相关文章:
Python核心基础DAY1--Python的基础变量类型之字符串和数字类型
Python核心基础DAY2--复合类型之序列类型、映射类型和集合类型
Python核心基础DAY3--Python表达式及常见语句
Python核心基础DAY4--Python函数和内置函数总结
Python应用进阶DAY6--类和对象的基本概念及属性和方法的常见分类和使用场景
Python应用进阶DAY7--面向对象编程基本特性和super函数
目录
[类型注解Type Hinting](#类型注解Type Hinting)
类型注解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
模块中的类型别名,如 List
、Dict
、Tuple
等
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、类型检查器)提供清晰的类型提示。
基本语法
- 参数注解:
参数名: 类型
(如 x:int 表示参数x应为整数)。 - 返回值注解:
-> 类型
(如 → 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
- 根据函数 / 变量的类型注解进行检查。
- 若无注解,
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 重要特性