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

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 绿色

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:42:09