五、Python新特性指定类型用法
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 + bdef 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 = nameself.age: int = agedef 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, GenericT = TypeVar('T')class Box(Generic[T]):def __init__(self, item: T) -> None:self.item: T = itemdef 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, Optionalclass Student:def __init__(self, name: str, scores: List[int]) -> None:self.name: str = nameself.scores: List[int] = scoresdef 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