Python函数返回同输入类型序列的正确类型注解及错误修正
问题分析与解决
错误原因
原代码的类型注解存在两处关键问题:
- TypeVar未声明协变:
Sequence本身是协变类型,但默认的TypeVar是不变类型,mypy无法推断data[:]返回的具体Sequence子类实例能匹配不变的S类型。 - 未关联元素类型:原
TypeVar仅绑定到Sequence,未指定元素类型参数,导致mypy将切片结果推断为泛化的Sequence[Any],而非输入的具体S类型(比如list[int]或tuple[str]),因此触发类型不兼容报错。
正确的类型注解方式
要精准保证返回值与输入参数是同类型的Sequence子类,需要定义协变的TypeVar并关联Sequence的元素类型:
from typing import TypeVar, Sequence T = TypeVar("T") # 声明协变TypeVar,绑定到带元素类型的Sequence S = TypeVar("S", bound=Sequence[T], covariant=True) def chunk(data: S) -> S: return data[:]
补充说明
covariant=True:适配Sequence的协变特性,让mypy识别出切片返回的具体子类实例与输入类型S兼容。- 绑定
Sequence[T]:明确关联元素类型T,避免mypy将切片结果推断为Sequence[Any],确保类型匹配的精准性。
如果不需要严格限制返回具体子类,仅需返回Sequence类型(允许不同子类),也可以简化为:
from typing import TypeVar, Sequence T = TypeVar("T") def chunk(data: Sequence[T]) -> Sequence[T]: return data[:]
但这种方式无法保证返回的是输入的具体子类(比如输入tuple[int]可能返回list[int],mypy不会报错)。
内容的提问来源于stack exchange,提问作者Jean-Paul Calderone
相关产品推荐
相关产品推荐

