如何在Python包装器函数中对**kwargs进行类型注解?
如何实现类型安全的关键字参数传递包装器(无需TypedDict)
你的写法问题出在泛型参数的声明方式上,**T_kwargs 这种语法是不合法的,Pyright 报错正是因为这个原因。不需要用 TypedDict,用 ParamSpec 就能实现类型安全的关键字参数传递。
正确的实现方式如下:
from typing import Callable, ParamSpec, TypeVar # 定义参数规格和返回值类型变量 P = ParamSpec('P') R = TypeVar('R') def wrapper(fn: Callable[P, R], **kwargs: P.kwargs) -> R: return fn(**kwargs)
关键说明:
ParamSpec('P')用于捕获被包装函数的完整参数类型信息(包括位置参数和关键字参数)P.kwargs提取出被包装函数的关键字参数类型,让包装器的**kwargs与原函数的关键字参数类型严格匹配TypeVar('R')捕获被包装函数的返回值类型,保证包装器返回值类型与原函数一致
使用示例:
def calculate_area(length: float, width: float) -> float: return length * width # 类型检查通过 wrapper(calculate_area, length=3.5, width=2.0) # 类型检查会报错(传入了错误类型的参数) wrapper(calculate_area, length='3.5', width=2.0)
这样实现的包装器既能正确传递关键字参数,又能保持类型安全,完全不需要依赖 TypedDict。
内容的提问来源于stack exchange,提问作者user16776498
相关产品推荐
相关产品推荐

