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。