← Backend / Python / 基础专题

18_类型注解与静态检查

为函数和容器标注类型,理解注解与运行时校验的区别。

Python 基础专题 18:类型注解与静态检查

学习目标:为函数和容器标注类型,理解注解与运行时校验的区别。

核心知识

类型注解说明“期望传入和返回什么”,帮助编辑器与静态检查工具发现错误。Python 默认不会因为注解而拒绝错误类型;若输入来自 HTTP、命令行或 JSON,仍需实际校验。str | None 表示字符串或无值,list[str] 表示字符串列表,dict[str, int] 表示键和值的类型。

def normalize_titles(raw_titles: list[str]) -> list[str]:
    result: list[str] = []
    for title in raw_titles:
        cleaned = title.strip()
        if cleaned:
            result.append(cleaned)
    return result

参数若可能没有值,要在使用前缩小类型:if value is None: ...。Any 关闭了相应位置的类型约束,应谨慎使用。TypedDict 可描述字典结构,Protocol 可描述对象所需方法,初学时先把普通函数的入参和返回值写清楚即可。

静态检查只分析可能的类型问题,不能证明业务逻辑正确;仍需测试边界条件。不要为了通过检查而盲目强制转换类型,应找到数据来源的真实契约。

逐步理解

注解 list[str] 只描述期望,运行时仍可能收到 [1, 2],随后调用 strip() 才报错。外部数据应先检查结构和元素类型;内部代码可借助静态检查尽早发现不匹配。给 str | None 赋值时,不要立即调用字符串方法,应先处理 None 分支,让剩余分支的类型明确为字符串。

动手练习

练习:给 find_title(titles, keyword) 加注解,找不到返回 None。答案要点:返回类型为 str | None,调用处先判断是否为 None。