1. 什么是类型注解
类型注解是 Python 3.5+ 引入的特性,用于为变量、函数参数和返回值指定类型。它不会影响代码运行,但有助于代码可读性和 IDE 支持。
2. 基本类型注解
# 变量类型注解
name: str = "张三"
age: int = 25
height: float = 175.5
is_student: bool = True
# 列表类型注解
numbers: list[int] = [1, 2, 3, 4, 5]
names: list[str] = ["张三", "李四", "王五"]
# 字典类型注解
person: dict[str, str] = {"name": "张三", "city": "北京"}
3. 函数类型注解
def greet(name: str) -> str:
return f"你好,{name}!"
def add(a: int, b: int) -> int:
return a + b
def get_user_info(name: str, age: int) -> dict[str, str]:
return {"name": name, "age": str(age)}
# 调用函数
result = greet("李四") # 类型:str
sum_result = add(10, 20) # 类型:int
4. 复杂类型注解
from typing import List, Dict, Tuple, Optional, Union
# 列表类型
def process_numbers(numbers: List[int]) -> List[int]:
return [x * 2 for x in numbers]
# 字典类型
def update_user(user: Dict[str, str]) -> Dict[str, str]:
user["updated"] = "true"
return user
# 元组类型
def get_coordinates() -> Tuple[int, int]:
return (10, 20)
# 可选类型(可能为 None)
def find_user(user_id: int) -> Optional[str]:
if user_id == 1:
return "张三"
return None
# 联合类型(多种可能类型)
def process_data(data: Union[str, int]) -> str:
return str(data)
5. 类类型注解
class User:
def __init__(self, name: str, age: int) -> None:
self.name: str = name
self.age: int = age
def get_info(self) -> str:
return f"{self.name}, {self.age}岁"
# 使用类类型注解
def create_user(name: str, age: int) -> User:
return User(name, age)
user: User = create_user("王五", 30)
6. 泛型类型注解
from typing import TypeVar, Generic
T = TypeVar('T')
class Box(Generic[T]):
def __init__(self, item: T) -> None:
self.item: T = item
def get_item(self) -> T:
return self.item
# 使用泛型
string_box: Box[str] = Box("hello")
int_box: Box[int] = Box(42)
7. 类型别名
from typing import List, Dict
# 定义类型别名
UserId = int
UserName = str
UserList = List[Dict[str, str]]
def get_users() -> UserList:
return [
{"id": "1", "name": "张三"},
{"id": "2", "name": "李四"}
]
8. 实际应用示例
from typing import List, Dict, Optional
class Student:
def __init__(self, name: str, scores: List[int]) -> None:
self.name: str = name
self.scores: List[int] = scores
def get_average(self) -> float:
return sum(self.scores) / len(self.scores)
def process_students(students: List[Student]) -> Dict[str, float]:
result: Dict[str, float] = {}
for student in students:
result[student.name] = student.get_average()
return result
# 使用示例
students: List[Student] = [
Student("张三", [85, 90, 78]),
Student("李四", [92, 88, 95])
]
averages: Dict[str, float] = process_students(students)
print(averages) # 输出:{'张三': 84.33..., '李四': 91.66...}
9. 类型检查工具
可以使用 mypy
进行类型检查:
pip install mypy
mypy your_file.py