如何为Python的make_iter_converter函数正确添加类型注解?
修复
make_iter_converter的类型注解错误 你遇到的TypeError是因为普通TypeVar不能像泛型类型那样使用下标(比如_ITEMS_T[_ITEM_T])。_ITEMS_T只是一个代表单一类型的变量,不是泛型构造器,无法接受类型参数。
解决方案
不需要定义额外的Generic类,只需重新设计类型变量,明确区分输入元素类型、输出元素类型和目标集合类型,即可完成正确的类型注解:
from typing import TypeVar, Callable, Iterable, Iterator # 输入迭代器的元素类型 _ItemIn = TypeVar("_ItemIn") # 转换后的元素类型 _ItemOut = TypeVar("_ItemOut") # 最终生成的集合类型(如 tuple[int]、list[int]),协变标记保证类型兼容性 _Collection = TypeVar("_Collection", covariant=True) def make_iter_converter( items_converter: Callable[[Iterator[_ItemOut]], _Collection], item_converter: Callable[[_ItemIn], _ItemOut], ) -> Callable[[Iterable[_ItemIn]], _Collection]: def wrapped(items: Iterable[_ItemIn]) -> _Collection: return items_converter(item_converter(item) for item in items) return wrapped
代码说明
_ItemIn和_ItemOut分别标记输入、输出的单个元素类型,让类型检查器能追踪元素的转换关系。_Collection标记最终返回的集合类型(比如tuple[int]),covariant=True确保集合类型和元素类型的协变关系(比如tuple[int]是Iterable[int]的子类型)。items_converter的类型注解明确它接受_ItemOut类型的迭代器,返回目标集合_Collection。- 返回的
wrapped函数类型清晰表示:接受输入元素类型的可迭代对象,返回转换后的目标集合。
测试示例
converter = make_iter_converter(tuple, int) result = converter(["1", "2"]) # 类型检查器会自动推断 result 的类型为 tuple[int] print(result) # 输出: (1, 2)
内容的提问来源于stack exchange,提问作者Kamoo
相关产品推荐
相关产品推荐

