Python中如何让mypy识别对象属性校验方法,避免类型报错
解决方案
有两种原生支持的方案可实现需求:
方案1:配合Protocol和TypeGuard实现
该方案遵循Python官方类型标注标准,无需额外安装mypy专属依赖,核心是通过Protocol定义属性校验通过后的实例结构,让mypy通过TypeGuard自动窄化实例类型:
from typing import Optional, TypeGuard, Protocol # 定义Protocol,描述a属性为非空int的实例结构 class AWithValidA(Protocol): a: int class A(object): def __init__(self): self.a: Optional[int] = None def check_a(self) -> TypeGuard[AWithValidA]: return self.a is not None a = A() if a.check_a(): # 此时mypy自动将a窄化为AWithValidA类型,a.a被识别为int print(a.a + 1)
方案2:使用mypy_extensions的asserts装饰器
如果是mypy专属项目,该方案更简洁,不需要额外定义Protocol,直接在方法上标注校验逻辑对应的属性约束即可。
首先安装依赖:pip install mypy-extensions
示例代码:
from typing import Optional from mypy_extensions import asserts class A(object): def __init__(self): self.a: Optional[int] = None # return_type=True表示方法返回True时满足括号内的校验条件 @asserts(lambda self: self.a is not None, return_type=True) def check_a(self) -> bool: return self.a is not None a = A() if a.check_a(): print(a.a + 1)
内容的提问来源于stack exchange,提问作者Lev145
相关产品推荐
相关产品推荐

