You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为仅接受位置参数的可调用对象添加泛型类型提示?

在Python中能否用泛型为仅接受位置参数的可调用对象添加类型提示?

问题背景

我希望为仅接受位置参数的可调用对象添加泛型类型提示,参考Temporalio中execute_activity的现有签名:

@overload
async def execute_activity(
    activity: Callable[..., Awaitable[ReturnType]],
    arg: None,
    *,
    args: Sequence[Any],
    task_queue: Optional[str] = None,
    schedule_to_close_timeout: Optional[timedelta] = None,
    schedule_to_start_timeout: Optional[timedelta] = None,
    start_to_close_timeout: Optional[timedelta] = None,
    heartbeat_timeout: Optional[timedelta] = None,
    retry_policy: Optional[temporalio.common.RetryPolicy] = None,
    cancellation_type: ActivityCancellationType = ActivityCancellationType.TRY_CANCEL,
    activity_id: Optional[str] = None,
    versioning_intent: Optional[VersioningIntent] = None,
) -> ReturnType: ...

该签名中activity是允许任意位置参数的可调用对象,我希望为...对应的输入定义泛型,让args参数的类型提示能与activity的位置参数类型关联起来。

尝试与困惑

我尝试使用ParamSpec,但它同时支持关键字参数,无法在调用activity传入关键字参数时触发类型检查错误。想知道有没有办法在Python中实现activity的位置参数类型与args参数类型的关联,具体该怎么做?

目标伪代码

我期望的签名大致如下:

@overload
async def execute_activity(
    activity: Callable[GenericIterable, Awaitable[ReturnType]],
    arg: None,
    *,
    args: GenericIterable,
    task_queue: Optional[str] = None,
    schedule_to_close_timeout: Optional[timedelta] = None,
    schedule_to_start_timeout: Optional[timedelta] = None,
    start_to_close_timeout: Optional[timedelta] = None,
    heartbeat_timeout: Optional[timedelta] = None,
    retry_policy: Optional[temporalio.common.RetryPolicy] = None,
    cancellation_type: ActivityCancellationType = ActivityCancellationType.TRY_CANCEL,
    activity_id: Optional[str] = None,
    versioning_intent: Optional[VersioningIntent] = None,
) -> ReturnType: ...

# 示例可传入的activity函数
def some_activity(a: int, b: str) -> float:
   # 示例实现
   return 3.14

可行方案

目前可以采用折中方案:不拆分多位置参数,改用单一输入类型配合输出类型,让泛型和类型提示正常生效。

如果希望在Temporal Python SDK中原生支持该功能,可以去对应的特性请求点赞支持。


内容的提问来源于stack exchange,提问作者spacether

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:12:39