Python中如何为首个参数为str的可变参数子函数添加类型注解
实现该类型约束的两种可行方案
方案1:使用ParamSpec + Concatenate(Python 3.10+ 推荐)
这是最贴合需求的标准写法,可以完美保留首个参数为str的约束,同时支持后续任意参数的类型传递:
from typing import Callable, Any, ParamSpec, Concatenate # 定义参数规格变量 P = ParamSpec("P") # 高阶函数注解写法 def parent(child: Callable[Concatenate[str, P], Any]) -> Callable[P, Any]: # 示例逻辑:固定传入第一个字符串参数,返回封装后的函数 def wrapper(*args: P.args, **kwargs: P.kwargs) -> Any: return child("预设的首个字符串参数", *args, **kwargs) return wrapper
- 如果使用Python 3.10以下版本,可以从
typing_extensions库导入ParamSpec和Concatenate,用法完全一致。 - 该写法不仅能校验
child的首个参数类型,还能自动推导parent返回的封装函数的参数类型,类型校验精度最高。
方案2:使用Protocol自定义可调用类型约束
如果不需要做后续参数的类型传递,仅需要约束首个参数类型,可以用协议实现:
from typing import Protocol, Any class ChildCallable(Protocol): def __call__(self, __first: str, /, *args: Any, **kwargs: Any) -> Any: ... # 高阶函数注解写法 def parent(child: ChildCallable) -> Any: # 你的业务逻辑 pass
该写法可以直接约束传入的child函数必须满足「首个参数为str,后续可传入任意参数」的要求,静态类型检查器可以正常识别校验。
内容的提问来源于stack exchange,提问作者EnzoMolion
相关产品推荐
相关产品推荐

