如何让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
相关产品推荐
相关产品推荐

