如何在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
相关产品推荐
相关产品推荐

