如何正确处理transitions动态属性引发的mypy [attr-defined]错误?
正确处理方案
transitions库会动态生成is_<state>()这类状态检查方法,但mypy是静态类型检查工具,没法识别这种动态添加的方法,所以会报错。不建议直接用type: ignore跳过检查,更规范的处理方式有两种:
给类添加类型提示,明确动态方法的存在
可以用typing.cast告诉mypy这个方法确实存在,避免报错:from transitions import Machine from typing import cast, Callable class TradingSystem: def __init__(self): self.machine = Machine(model=self, states=['RUNNING'], initial='RUNNING') def check_running(self) -> None: # 用cast明确is_RUNNING是无参返回bool的方法 is_running = cast(Callable[[], bool], self.is_RUNNING) if is_running(): print("System is running")安装官方类型注解包
很多Python库都有对应的类型注解包(由社区或官方维护),transitions也不例外。安装对应的类型包后,mypy就能自动识别动态生成的方法:pip install types-transitions安装完成后重新运行mypy,不需要修改代码就能通过检查,这是最省心的方案。
总结
优先选安装类型注解包的方案;如果没有官方类型支持,再用cast添加明确的类型提示,尽量别直接用type: ignore,因为它会掩盖真正的属性缺失问题。
内容的提问来源于stack exchange,提问作者James Hirschorn
相关产品推荐
相关产品推荐

