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

如何让mypy从包装类中正确推断返回值的类型注解

解决方案

你当前的无参调用场景不需要用到ParamSpec即可实现类型推导,核心是调整泛型参数的绑定逻辑,直接将泛型T指向最终返回值的类型,同时明确标注Wrapper构造参数的类型约束即可:

from typing import Generic, TypeVar, Callable

T = TypeVar('T')

class A:
    def __call__(self) -> int:
        ...

class Wrapper(Generic[T]):
    def __init__(self, typ: Callable[[], Callable[[], T]]) -> None:
        self._typ = typ

    def __call__(self) -> T:
        return self._typ()()

# 此时mypy可以正确推断x的类型为int
x = Wrapper(A)()

方案说明

  • 标注typ: Callable[[], Callable[[], T]]的含义是:传入的typ是一个无参可调用对象(对应你场景中的类A,调用后生成A的实例),它的返回值是另一个无参可调用对象(对应A实例的__call__方法),第二个可调用对象的返回值类型就是泛型参数T。
  • mypy扫描到Wrapper(A)时,会自动推导A满足Callable[[], Callable[[], int]]的约束,因此泛型T会被绑定为int,最终Wrapper(A)()的返回值类型就会被识别为int。
  • 如果你的实际使用中A.__call__带固定参数,也可以调整Callable的参数列表来适配,只要不需要动态处理任意参数数量/类型的场景,都不需要用到ParamSpec。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:36:03