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

如何为字典转置函数定义可互换的泛型类型标注?

字典转置函数的类型标注优化方案

现有一个对值为集合的字典进行转置的函数,原代码及类型标注如下:

from collections import defaultdict

def transpose_dict(dct: dict[int, set[int]]) -> dict[int, set[int]]:
    transposed = defaultdict(set)
    for key, value_set in dct.items():
        for inv_key in value_set:
            transposed[inv_key].add(key)
    return dict(transposed)

原类型标注将函数限制为仅接受int类型键、值为int类型集合的字典,但函数实现本身和int无关,对str、tuple等可哈希类型(或其组合)同样适用。若用dict[Any, set[Any]]又过于宽泛,无法体现输入输出的类型互换关系——即输入dict[A, set[B]]时,输出应为dict[B, set[A]]。

解决方案:使用泛型类型标注

通过typing.TypeVar定义泛型类型变量,就能精准表达这种类型对应关系:

  1. 导入TypeVar与Hashable,定义两个代表任意可哈希类型的变量A和B
  2. 修改函数的类型标注,明确输入为dict[A, set[B]],输出为dict[B, set[A]]

修改后的完整代码:

from collections import defaultdict
from typing import TypeVar, Dict, Set, Hashable

# 定义泛型类型变量,约束为可哈希类型(符合字典键和集合元素的要求)
A = TypeVar('A', bound=Hashable)
B = TypeVar('B', bound=Hashable)

def transpose_dict(dct: Dict[A, Set[B]]) -> Dict[B, Set[A]]:
    transposed = defaultdict(set)
    for key, value_set in dct.items():
        for inv_key in value_set:
            transposed[inv_key].add(key)
    return dict(transposed)

说明

  • bound=Hashable约束确保类型变量只能是可哈希类型,符合字典键和集合元素的要求(避免传入不可哈希的类型如列表)
  • 这样的标注既保留了函数的灵活性,支持多种合法类型组合,又清晰体现了输入输出的类型映射关系,比Any更严谨

内容的提问来源于stack exchange,提问作者Wolf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:01:10