带类型标注的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
相关产品推荐
相关产品推荐

