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

带类型标注的Python中,如何为传给高阶函数的异构*args标注类型?

在Python类型标注中为高阶函数的*args列表添加类型标注

要处理异构的*args列表类型,Python 3.10及以上版本可以通过TypeVarTuple和Unpack实现泛型可变参数元组的类型标注,完美适配你示例中的柯里化场景。

改造后的curry_one函数

首先需要导入必要的类型工具,然后通过泛型元组定义异构参数的类型:

from typing import Callable, TypeVar, TypeVarTuple, Unpack

# 定义基础泛型类型
T = TypeVar('T')
R = TypeVar('R')
# 定义用于表示异构参数列表的泛型元组
Args = TypeVarTuple('Args')

def curry_one[T, R, *Args](x: T, f: Callable[[T, Unpack[Args]], R]) -> Callable[[Unpack[Args]], R]:
    def curried(*args: Unpack[Args]) -> R:
        return f(x, *args)
    return curried

关键类型标注说明

  • TypeVarTuple('Args'):声明一个泛型的参数元组类型,用来承载f中除第一个参数外的所有异构参数类型。
  • *Args:在函数的泛型参数列表中声明这个可变类型元组,让函数支持任意数量、任意类型的后续参数。
  • Callable[[T, Unpack[Args]], R]:明确传入的函数f需要接收T类型的第一个参数,再接收Args元组展开后的所有异构参数,最终返回R类型。
  • *args: Unpack[Args]:标注柯里化后的curried函数的可变参数,完全匹配f的剩余参数类型。
  • 返回值Callable[[Unpack[Args]], R]:表示柯里化后的函数仅需接收Args对应的参数,返回值类型与原函数一致。

实际使用示例

# 定义一个带异构参数的测试函数
def format_info(id: int, name: str, is_active: bool) -> str:
    return f"ID: {id}, Name: {name}, Active: {is_active}"

# 柯里化第一个参数
curried_format = curry_one(1001, format_info)
# 此时类型检查工具会提示:curried_format需要接收(str, bool)类型的参数,返回str
result = curried_format("Alice", True)
print(result)  # 输出: ID: 1001, Name: Alice, Active: True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:12:37