如何处理Python类方法重写中的类型提示重复问题?
解决泛型子类方法重复写类型提示的问题
你遇到的重复编写类型提示的问题,目前可以通过以下方式解决:
方法:使用override装饰器(推荐)
从Python 3.12开始,标准库typing模块自带override装饰器;如果是Python 3.11及以下版本,需要先安装mypy_extensions库(执行pip install mypy_extensions),再导入该装饰器。
给子类的重写方法加上这个装饰器后,mypy会自动从父类的泛型参数中推断方法的类型提示,无需手动重复编写:
from typing import TypeVar, Generic, override T = TypeVar("T") V = TypeVar("V") class Mother(Generic[T, V]): def process(self, x: T) -> V: ... class Child(Mother[int, str]): @override def process(self, x): # mypy会自动推断x的类型为int,返回值类型为str return str(x)
这样既保留了完整的类型检查能力,又避免了重复写类型提示。如果方法逻辑需要调整(只要符合父类的泛型约束),mypy也会自动适配推断结果。
补充说明
移除类型提示后mypy不自动推断的原因是:mypy默认将无类型提示的方法视为动态类型,但会检查子类方法的签名是否与父类兼容(比如给Child的process传字符串,mypy会报错),但不会主动填充类型信息。而override装饰器明确告知mypy“该方法是重写父类的”,触发它从父类继承类型提示的逻辑。
内容的提问来源于stack exchange,提问作者p9f
相关产品推荐
相关产品推荐

