继承cached_property后mypy类型检查结果异常的原因咨询
为什么自定义cached_property子类会绕过mypy类型检查?
这是因为mypy对标准库functools.cached_property有专门的类型处理逻辑,而你写的result_property子类没正确继承这种类型支持,导致mypy没法识别属性的实际类型,直接跳过了检查。
具体原因
- 标准库的
cached_property在mypy的官方类型定义(typeshed)里是泛型类型,能精准关联被装饰方法的返回类型。用它装饰返回int的方法时,mypy能明确知道foo.prop是int类型,自然会检测到和func要求的str不匹配。 - 你自定义的
result_property只是单纯继承了cached_property,但mypy不会自动给子类继承泛型参数的类型信息。这时候mypy会把foo.prop当成Any类型——Any可以和任意类型兼容,所以不会报错。
修复方法
给自定义子类加上泛型类型注解,让它正确继承cached_property的类型信息:
from functools import cached_property from typing import TypeVar, Generic T = TypeVar('T') class result_property(cached_property[T], Generic[T]): pass
修改后再跑mypy,就会和第一个场景一样,触发int与str类型不兼容的错误。
内容的提问来源于stack exchange,提问作者StuffHappens
相关产品推荐
相关产品推荐

