如何在Python中实现TypeScript的Parameters类型功能?
在Python中实现类似TypeScript Parameters的类型获取功能
基础场景:提取函数参数类型
Python 3.10及以上版本,可借助typing.ParamSpec和TypeVar实现类似TypeScript Parameters的类型提取能力,用于获取函数的参数类型:
from typing import ParamSpec, TypeVar, Callable # 定义参数规范和返回值类型变量 P = ParamSpec("P") R = TypeVar("R") # 仅用于类型标注,运行时无实际逻辑 def first_param_type(func: Callable[P, R]) -> type[P.args[0]]: pass # 示例函数 def append_bar(b: str) -> str: return b + "Bar" # 获取append_bar的第一个参数类型,标注给变量c c: first_param_type(append_bar) = "Foo"
第三方库无法运行时导入的处理方案
如果第三方库无法在运行时导入(比如导入会触发副作用,或仅需类型检查时使用),可以利用typing.TYPE_CHECKING常量——它在运行时为False,仅类型检查工具(如pyright、mypy)运行时为True,以此安全实现类型标注:
方法1:利用函数注解提取类型
from typing import TYPE_CHECKING # 仅类型检查时导入第三方库 if TYPE_CHECKING: from somelib import func # 提取func的目标参数类型 XYZ = func.__annotations__["arg"] def myfunc(arg: "XYZ"): # 运行时直接调用func(假设环境已加载该函数) func(arg)
方法2:用ParamSpec规范约束
from typing import TYPE_CHECKING, ParamSpec, TypeVar, Callable if TYPE_CHECKING: from somelib import func P = ParamSpec("P") R = TypeVar("R") # 提取func的第一个参数类型 FuncFirstParam = P.args[0] def myfunc(arg: "FuncFirstParam"): func(arg)
方法3:pyright支持的简化写法
如果你使用pyright作为类型检查工具,可直接用类似TypeScript的语法:
from typing import TYPE_CHECKING if TYPE_CHECKING: from somelib import func def myfunc(arg: "Parameters[typeof(func)][0]"): func(arg)
不同类型检查工具对语法的支持略有差异,可根据使用的工具选择适配方案。
内容的提问来源于stack exchange,提问作者Otto
相关产品推荐
相关产品推荐

