如何将list[int, int, int]转为tuple[int, int, int]而非tuple[int, ...](mypy场景)
问题与解决方案
问题描述
我有两个函数func1和func2:
func1返回包含3个整数的listfunc2接收包含3个整数的tuple
使用mypy做类型检查时,以下代码会触发类型错误:
var1: list[int, int, int] = func1() func2(tuple(var1))
错误提示:
Expected type 'tuple[int, int, int]', got 'tuple[int, ...]' instead.
需求是将list转换为符合要求的tuple,消除mypy的类型检查错误。
解决方案
方法1:显式解构重组tuple
直接将list的三个元素解构后组装成tuple,mypy能明确识别这是长度为3的tuple;同时如果list长度不符合,运行时会抛出ValueError提前暴露问题:
var1: list[int, int, int] = func1() a, b, c = var1 func2((a, b, c))
方法2:使用类型断言
通过cast函数给mypy明确转换后的类型,适合能确保list长度一定为3的场景(运行时无检查,需自行保证数据合法性):
from typing import cast var1: list[int, int, int] = func1() func2(cast(tuple[int, int, int], tuple(var1)))
也可以用# type: ignore[arg-type]忽略特定位置的类型检查,但这种方式不够精确,不推荐大范围使用:
var1: list[int, int, int] = func1() func2(tuple(var1)) # type: ignore[arg-type]
方法3:自定义类型转换函数
编写一个辅助函数,同时实现类型注解和运行时长度校验,兼顾类型安全和运行时安全:
from typing import TypeVar, Tuple T = TypeVar('T') def list_to_3_element_tuple(lst: list[T, T, T]) -> tuple[T, T, T]: assert len(lst) == 3, "List must contain exactly 3 elements" return (lst[0], lst[1], lst[2]) var1: list[int, int, int] = func1() func2(list_to_3_element_tuple(var1))
内容的提问来源于stack exchange,提问作者rpicoder
相关产品推荐
相关产品推荐

