Mypy为何禁止重复定义属性?如何修正对应代码?
问题解答
为什么Mypy会报错?
Python运行时允许在不同分支给同一个实例属性重复赋值并添加类型注解,但Mypy的类型检查逻辑会将同一个方法内多次给同一实例属性添加类型注解判定为重复定义。从类型系统的角度,实例属性的类型应保持统一,无需在每个赋值分支重复标注,多次标注会让Mypy认为你试图重新定义该属性的类型,从而触发错误。
另外你代码里还存在一个隐藏问题:else分支给_bpdata赋值了字典{},但注解标注的是list[dict],这属于类型不匹配——Python运行时不会校验,但严格的类型检查需要修正这个问题。
正确的写法
有两种常见的规范写法:
方式1:类级别声明属性类型
直接在类中定义_bpdata的类型,方法内仅做赋值操作:
import pathlib import json class BPDataStore(): _bpdata: list[dict] # 类级别统一声明类型 def __init__(self, path: pathlib.Path): self.path: pathlib.Path = path if self.path.exists(): with self.path.open("r") as F: self._bpdata = json.loads(F.read()) else: self._bpdata = [] # 改为空列表,匹配list[dict]类型
方式2:仅在首次赋值时标注类型
如果不想在类级别声明类型,只需在第一次给_bpdata赋值时添加类型注解,后续分支直接赋值即可:
import pathlib import json class BPDataStore(): def __init__(self, path: pathlib.Path): self.path: pathlib.Path = path if self.path.exists(): with self.path.open("r") as F: self._bpdata: list[dict] = json.loads(F.read()) else: self._bpdata = [] # 移除注解,直接赋值匹配类型的空列表
内容的提问来源于stack exchange,提问作者Enrico Tuvera Jr
相关产品推荐
相关产品推荐

