属性初始化为None后使用引发Mypy错误的解决办法
解决Mypy报错"None has no attribute 'produce'"的方案
一、类型提示修复(推荐)
Mypy报错是因为无法确定self.kfp在调用produce()时不为None,可以通过添加类型注解和运行时检查来彻底解决:
明确
build()返回的类型
先定义build()函数返回对象的具体类型(如果之前未定义):from typing import Optional class KFP: def produce(self) -> None: # 对应build()返回对象的produce方法实现 pass def build() -> KFP: return KFP()完善Produce类的类型注解与检查
给kfp属性添加Optional类型注解,并在produce()方法中添加断言或条件判断,明确排除None的情况:class Produce: """Class.""" kfp: Optional[KFP] def __init__(self) -> None: """Init Doct String.""" self.kfp = None def open(self) -> None: """Open Connection to Producer. Use with produce individually.""" self.kfp = build() def produce(self) -> None: """Produce output.""" # 方式1:用断言告知Mypy此时kfp不为None assert self.kfp is not None, "必须先调用open()方法" self.kfp.produce() # 方式2:运行时检查(更安全,能拦截错误调用) # if self.kfp is None: # raise RuntimeError("必须先调用open()方法") # self.kfp.produce()
二、忽略错误的配置方案
如果暂时不想修改代码,可以通过配置让Mypy跳过该错误:
1. 按文件忽略
在pyproject.toml中添加配置,忽略指定文件的attr-defined错误:
[tool.mypy] per-file-ignores = { "你的文件名.py" = ["attr-defined"] }
2. 单行忽略
在报错代码行添加注释,仅忽略该行的错误:
def produce(self) -> None: """Produce output.""" self.kfp.produce() # type: ignore[attr-defined]
注意:忽略错误的方案不推荐长期使用,会掩盖潜在的类型问题,优先选择类型提示修复。
内容的提问来源于stack exchange,提问作者Micah Pearce
相关产品推荐
相关产品推荐

