Python递归函数中元组或元组列表的类型校验问题
问题分析与解决
核心误区:Python类型注解不做运行时校验
Python的类型注解只是静态类型提示,仅用于IDE、静态检查工具(如mypy)识别潜在类型问题,Python解释器在运行时完全不会校验参数是否符合注解的类型定义。所以你传入四元素元组时,解释器不会主动抛出TypeError,只会因为元组恰好有pt[0]和pt[1]这两个元素而正常执行代码。
解决方法
1. 用静态检查工具提前发现问题
如果只是想在开发阶段拦截这类类型错误,使用mypy这类静态检查工具即可:
- 安装
mypy:pip install mypy - 运行检查:
mypy your_script.py
针对你的代码,mypy会直接给出错误提示:
error: Argument 1 to "performances" has incompatible type "Tuple[int, int, int, int]"; expected "Tuple[float, float] | List[Tuple[float, float]]" [arg-type] Found 1 error in 1 file (checked 1 source file)
2. 手动添加运行时类型校验
如果需要在程序运行时强制确保参数符合要求,要在函数内部手动添加检查逻辑:
修改后的代码示例:
from typing import Tuple, List def performances( pt: Tuple[float, float] | List[Tuple[float, float]] ) -> float | list[float]: # 校验单个二元组 if isinstance(pt, tuple): if len(pt) != 2: raise TypeError("单个参数必须是二元组") return pt[0] + pt[1] # 校验二元组列表 elif isinstance(pt, list): output = [] for pt_i in pt: if not isinstance(pt_i, tuple) or len(pt_i) != 2: raise TypeError("列表中的元素必须是二元组") output.append(performances(pt_i)) return output else: raise TypeError("参数必须是二元组或二元组列表") if __name__ == "__main__": # 正常执行 t1 = performances((1, 2)) print(t1) # 输出3 # 正常执行 t2 = performances([(1, 2), (3, 4)]) print(t2) # 输出[3,7] # 现在会抛出TypeError t3 = performances((1, 2, 3, 4)) print(t3)
3. 用第三方库简化运行时校验
如果不想写大量手动检查代码,可以用pydantic这类库自动做运行时类型验证:
from pydantic import validate_arguments from typing import Tuple, List @validate_arguments def performances( pt: Tuple[float, float] | List[Tuple[float, float]] ) -> float | list[float]: if isinstance(pt, list): return [performances(item) for item in pt] else: return pt[0] + pt[1] # 调用时不符合类型会自动抛出ValidationError
内容的提问来源于stack exchange,提问作者Romn
相关产品推荐
相关产品推荐

