五、Python新特性指定类型用法

发布于:2025-07-09 ⋅ 阅读:(12) ⋅ 点赞:(0)

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