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

