如何为仅接受位置参数的可调用对象添加泛型类型提示?
在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
相关产品推荐
相关产品推荐

