Python中如何为输出类型各异的函数列表添加类型注解
问题
现有一个try_parse方法,它接收类型为T的值,以及一系列输入类型为T的函数。这些函数的输出类型不一定相同(比如可以是int、float、自定义类MyCustomClass等),该如何为这段代码中的函数类型添加恰当的类型注解?
原代码如下:
T = TypeVar("T") U = TypeVar("U") def try_parse(value: T, *parse_functions: Callable[[T], U]) -> U: for parse_function in parse_functions: try: return parse_function(value) except ValueError: pass raise ValueError(f"Cannot parse {value} with any of {parse_functions}")
解答
原代码里的U是单个类型变量,会被推断为所有解析函数返回类型的公共父类,没法体现“不同函数返回不同类型”的需求。要解决这个问题,需要用到可变类型变量(Variadic Type Variables),让每个解析函数的返回类型能被独立追踪。
修改后的代码
from typing import TypeVar, Callable, Union from typing_extensions import TypeVarTuple, Unpack # Python 3.10+可直接从typing导入 T = TypeVar("T") U = TypeVarTuple("U") def try_parse( value: T, *parse_functions: Unpack[tuple[Callable[[T], U_i] for U_i in U]] ) -> Union[Unpack[U]]: for parse_function in parse_functions: try: return parse_function(value) except ValueError: pass raise ValueError(f"Cannot parse {value} with any of {parse_functions}")
关键说明
TypeVarTuple("U")定义了一组可变的类型变量,每个U_i对应一个解析函数的返回类型Unpack[tuple[...]]用来展开这组类型,确保每个传入的parse_function都可以有独立的返回类型- 返回值
Union[Unpack[U]]表示函数的返回值是第一个成功执行的解析函数的返回类型(本质是所有可能返回类型的联合类型)
备选方案(简化版)
如果不需要精确追踪每个函数的返回类型,只是想允许返回任意类型,也可以把解析函数的类型注解改为Callable[[T], object],但这样会丢失类型检查的精度,不推荐在需要强类型提示的场景使用。
内容的提问来源于stack exchange,提问作者Green 绿色
相关产品推荐
相关产品推荐

