You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:55:01