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

TypeGuard与cast选型指南:解决mypy类型不匹配报错问题

mypy元组类型匹配问题:解决方案探讨

先看这段会触发mypy报错的代码:

T_day = int | None
T_week = tuple[T_day, T_day, T_day, T_day, T_day, T_day, T_day]


def shift_week(dayofweek: int, week: T_week) -> T_week:
    week_shifted: list[T_day] = []
    week_shifted.extend(week[dayofweek:])
    week_shifted.extend(week[:dayofweek])
    return tuple(week_shifted)  # <- mypy error

mypy给出的报错信息:

Incompatible return value type (got "tuple[int | None, ...]", expected "tuple[int | None, int | None, int | None, int | None, int | None, int | None, int | None]") [return-value]

我想到了三种解决思路:

  • 让mypy忽略该报错(比如添加# type: ignore[return-value]注释)
  • 使用cast强制转换返回值类型,覆盖mypy的自动类型检测
  • 添加TypeGuard,让mypy识别实际类型

对应的实现代码如下:

方案二:使用cast

from typing import cast

T_day = int | None
T_week = tuple[T_day, T_day, T_day, T_day, T_day, T_day, T_day]

def shift_week(dayofweek: int, week: T_week) -> T_week:
    week_shifted: list[T_day] = []
    week_shifted.extend(week[dayofweek:])
    week_shifted.extend(week[:dayofweek])
    rt = cast(T_week, tuple(week_shifted))
    return rt

方案三:使用TypeGuard

from typing import TypeGuard

T_day = int | None
T_week = tuple[T_day, T_day, T_day, T_day, T_day, T_day, T_day]

def has_7(tup: tuple[T_day, ...]) -> TypeGuard[T_week]:
    return len(tup) == 7


def shift_week(dayofweek: int, week: T_week) -> T_week:
    week_shifted: list[T_day] = []
    week_shifted.extend(week[dayofweek:])
    week_shifted.extend(week[:dayofweek])
    rt = tuple(week_shifted)
    assert has_7(rt)
    return rt

我觉得TypeGuard虽然能提供更精准的类型检查,但运行时的长度判断略显冗余。想问下我是不是过度思考了?有没有其他更简洁的解决方案?

内容的提问来源于stack exchange,提问作者Marcel Wilson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 15:03:22