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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:23:07