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
相关产品推荐
相关产品推荐

