Python能否为获取任意参数首元素的函数添加精确类型标注?
实现
get_first函数的精确类型标注 完全可以实现你想要的精确类型标注,利用PEP 646的TypeVarTuple配合Unpack就能做到,核心是让类型检查器捕获每个输入参数的第一个元素类型,并映射到返回元组的对应位置。
完整标注后的代码
from typing import TypeVar, TypeVarTuple, Unpack, Sequence, Tuple # 定义单个序列的第一个元素类型变量 Elem = TypeVar('Elem') # 定义类型变量元组,用于捕获所有参数的第一个元素类型集合 Elems = TypeVarTuple('Elems') def get_first(*args: Unpack[Tuple[Sequence[Elem], ...]]) -> Tuple[Unpack[Elems]]: return tuple(a[0] for a in args)
调用验证
当你像这样调用时:
b = (1, 2, 3) c = ("a", "b", "c", "d") x = get_first(b, c)
类型检查器(如mypy、pyright)会正确推断出x的类型为Tuple[int, str],完全符合你的预期。
关键说明
TypeVarTuple('Elems')用于将每个输入参数的第一个元素类型打包成一个类型元组Unpack[Tuple[Sequence[Elem], ...]]声明接受任意数量的、至少包含一个元素的序列类型参数- 返回值
Tuple[Unpack[Elems]]则是将捕获到的类型元组展开,生成对应长度和类型的返回元组
需要注意的是,你需要使用支持PEP 646的类型检查器版本,比如mypy 0.910及以上,或者pyright的最新稳定版。
内容的提问来源于stack exchange,提问作者Huub Hoofs
相关产品推荐
相关产品推荐

