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

如何在Python中为可调用对象转发泛型参数类型?

Python泛型转发函数的类型注解方案

要实现你想要的类型检查效果,需要用到Python标准库typing模块(Python 3.10+直接支持,低版本需使用typing_extensions)中的ParamSpec和TypeVar,用来捕获目标函数的参数类型与返回值类型,具体实现如下:

1. 导入必要的类型工具

from typing import Callable, ParamSpec, TypeVar

# 捕获目标函数的参数类型集合
P = ParamSpec("P")
# 捕获目标函数的返回值类型
R = TypeVar("R")

2. 为forward添加类型注解

def forward(func: Callable[P, R], **kwargs: P.kwargs) -> R:
    return func(**kwargs)

3. 验证类型检查效果

定义目标函数后,传入不符合类型要求的参数时,类型检查器(如Pyright、Mypy)会直接报错提示:

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

# 正确调用,无类型错误
forward(sum_int, a=1, b=2)

# 错误调用,类型检查器会提示a、b应为int而非float
forward(sum_int, a=1.5, b=2.6)

关键说明

  • ParamSpec("P")会完整捕获目标函数func的参数类型信息,P.kwargs专门提取其中的关键字参数类型,确保forward接收的**kwargs与func的关键字参数类型完全匹配。
  • TypeVar("R")捕获func的返回值类型,保证forward的返回值类型与func一致。
  • 如果需要让forward同时支持位置参数,可将定义调整为:
    def forward(func: Callable[P, R], *args: P.args, **kwargs: P.kwargs) -> R:
        return func(*args, **kwargs)
    

内容的提问来源于stack exchange,提问作者Open AI - Opting Out

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:13:22