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

如何为splat/spread函数添加类型注解?

为Splat函数添加类型注解及可行性说明

类型注解实现方案

要给这个splat函数添加准确的类型注解,需要用到Python类型系统中的ParamSpec和TypeVar,它们能帮我们泛型化处理原函数的参数与返回值类型。具体代码如下:

from typing import Callable, TypeVar, ParamSpec, Tuple

# 泛型变量,代表原函数的返回值类型
A = TypeVar('A')
# 捕获原函数的所有位置参数类型集合
P = ParamSpec('P')

def splat(f: Callable[P, A]) -> Callable[[Tuple[P.args, ...]], A]:
    def splatted(args: Tuple[P.args, ...]) -> A:
        return f(*args)
    return splatted

代码说明

  • TypeVar('A'):定义泛型类型变量,保证包装后的函数返回值类型和原函数完全一致。
  • ParamSpec('P'):捕获原函数f的所有位置参数类型,P.args会展开为原函数位置参数对应的类型元组。
  • 注解细节:
    • 参数f的类型Callable[P, A],表示接受P类型参数、返回A类型值的函数;
    • 返回的splatted函数类型Callable[[Tuple[P.args, ...]], A],表示接受一个包含原函数所有位置参数的元组、返回A类型值的函数。

可行性说明

这在Python类型系统中是完全可以实现的:

  • Python 3.10及以上版本的标准库typing模块原生支持ParamSpec;
  • 3.10以下版本可通过第三方库typing_extensions导入ParamSpec来实现相同效果。

示例验证

用一个简单函数测试类型注解的有效性:

def add(a: int, b: int) -> int:
    return a + b

# 类型检查器会自动识别splat_add接受Tuple[int, int]类型参数,返回int
splat_add = splat(add)
print(splat_add((1, 2)))  # 输出3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:09:55