You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:48:03