如何为字典转置函数定义可互换的泛型类型标注?
字典转置函数的类型标注优化方案
现有一个对值为集合的字典进行转置的函数,原代码及类型标注如下:
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定义泛型类型变量,就能精准表达这种类型对应关系:
- 导入
TypeVar与Hashable,定义两个代表任意可哈希类型的变量A和B - 修改函数的类型标注,明确输入为
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
相关产品推荐
相关产品推荐

