Python泛型工厂函数类型注解优化:消除mypy类型报错
Python 3.10泛型工厂函数的类型注解优化(适配mypy v0.990)
报错根本原因
mypy无法自动关联传入的cls类对象与它构造出的实例类型,若未通过泛型显式绑定两者关系,函数内部return cls(*args, **kwargs)的返回值类型会被推断为最宽泛的object,与你期望的具体实例类型不匹配,从而触发类型不兼容报错。但调用时mypy能通过上下文推断出实例类型,所以外部调用没问题,内部return报错。
解决方案:用泛型绑定类与实例类型
1. 导入泛型类型
from typing import TypeVar, Type
2. 定义绑定类的TypeVar
# T代表任意类的实例类型 T = TypeVar('T')
3. 给工厂函数添加类型注解
def create_instance(cls: Type[T], *args, **kwargs) -> T: return cls(*args, **kwargs)
4. 使用示例
class Bar: def __init__(self, value: int): self.value = value # mypy能正确推断bar的类型为Bar bar = create_instance(Bar, 42) reveal_type(bar) # 执行mypy会输出:Revealed type is "__main__.Bar"
注解说明
Type[T]表示传入的cls是一个可以构造出T类型实例的类对象- 函数返回类型
T与cls的实例类型强绑定,mypy能明确识别cls(*args, **kwargs)的返回值就是T,因此内部return语句不会再触发类型报错,同时外部调用的类型推断也能正常工作。
内容的提问来源于stack exchange,提问作者AdrianoKF
相关产品推荐
相关产品推荐

