专项练习 · 9 分钟阅读

Python 类型提示练习:让注解帮助读者

类型提示是沟通工具。它告诉读者函数接收和返回什么,也给编辑器足够的信息,在错误进入运行时之前发出提醒。它不会把 Python 变成静态类型语言。

给参数和返回值加注解

冒号引出参数注解,箭头引出返回注解。简单值直接使用内置类型。注解保存在 __annotations__ 中,get_type_hints 等工具可以读取。

def greet(name: str) -> str:
    return f"Hello, {name}"
print(greet("Ada"))

带类型的函数

描述集合里的内容

list[int] 表示列表里装的是整数;dict[str, float] 表示键是字符串、值是浮点数。这些提示描述接口,不会检查每个运行时值。传入包含字符串的列表仍然可以运行。

def total(values: list[int]) -> int:
    return sum(values)
print(total([1, 2, 3]))

带类型的集合

把缺失值写清楚

查找可能返回 None。用 float | None 这样的联合类型把这种可能写进返回类型。调用方就能在算术前检查 None,编辑器也能指出遗漏的分支。

def find_price(prices: dict[str, float], item: str) -> float | None:
    return prices.get(item)
print(find_price({"tea": 3.5}, "coffee"))

可能不存在的值

需要时在运行时读取注解

get_type_hints 会把注解解析成类型对象。这对小型演示和框架很有用。大多数应用代码不应根据注解分支;它们是文档和检查工具,不是第二套类型系统。

from typing import get_type_hints
def double(n: int) -> int:
    return n * 2
print(get_type_hints(double))

注解本身也是数据

期待文档作用,而不是强制检查

在标注为 int 的位置传入字符串,并不会自动抛出 TypeError。函数会继续运行,直到某个操作失败。需要静态强制时,在 CI 中使用 linter 或类型检查器;不可信输入仍需运行时校验。

def double(n: int) -> int:
    return n * 2
print(double("a"))

提示不会转换值

你的练习清单

常见问题

类型提示会让 Python 更快吗?

本身不会。它们是给工具使用的元数据,解释器不会强制执行。

每个变量都要加注解吗?

通常不用。注解函数边界,以及从名称和赋值看不出类型的值。

旧版 Python 怎么表示 list[int]?

Python 3.8 及更早版本使用 typing.List[int]。现代 Python 支持内置泛型。

练习类型提示

12 道题,覆盖注解、list[int]、可选返回值和运行时行为。

打开练习

继续阅读: