如何为继承functools.cached_property的类添加正确的类型提示?
解决自定义
cached_property子类的类型提示问题 这个问题我之前也碰到过,核心原因是没有正确继承cached_property的泛型类型标注,再加上不必要的__get__方法重写,导致Pylance没法推断出被装饰属性的具体返回类型。下面是修复后的方案:
修复方案
你不需要重写__get__方法——父类cached_property已经提供了完整的实现和类型标注。关键是让你的my_property类继承泛型版本的cached_property,这样类型检查器就能正确传递被装饰方法的返回类型信息:
from functools import cached_property from typing import Generic, TypeVar # 定义泛型类型变量,用于匹配被装饰方法的返回类型 T = TypeVar('T') class my_property(cached_property[T], Generic[T]): pass # 不需要任何额外代码,父类的逻辑完全满足需求 class Example: @my_property def foo(self) -> str: # 此处为计算逻辑 return 'foo' @cached_property def oof(self) -> str: return 'oof' # 现在Pylance会正确识别: # Example().foo 的类型是 str # Example().oof 的类型是 str
为什么之前的实现有问题?
- 不必要的
__get__重写:你重写的__get__方法没有添加类型标注,覆盖了父类自带的正确类型信息,导致类型检查器只能推断返回值为Any。 - 缺少泛型继承:原生
cached_property是一个泛型类,它会根据被装饰方法的返回类型动态调整自身的类型参数。你的子类没有继承这个泛型特性,所以类型检查器无法关联被装饰方法的返回类型和属性的实际类型。
额外说明
如果你的Python版本低于3.9,可能需要从typing_extensions导入Generic和TypeVar,但VS Code搭配Pylance通常对新版本Python的支持更好,建议使用3.9+版本以获得最佳的类型推断体验。
内容的提问来源于stack exchange,提问作者Ciszko
相关产品推荐
相关产品推荐

