mypy报错'type[list[Any]]'无__iter__属性,如何解决?
解决Pydantic WorkerList类的mypy迭代错误与功能修正
你的代码存在两个关键问题,分别导致mypy报错和功能逻辑异常:
1. 错误根源:类属性与Pydantic字段混淆
原代码中WorkerList里的workers = list[Worker]是类属性赋值,你错误地将类型注解写成了赋值语句,导致workers指向的是list这个类型本身,而非实例化的列表对象。因此self.workers是type[list]类型,自然无法迭代,mypy因此抛出"不可迭代"的错误。
2. 逻辑错误:异常抛出时机错误
原方法中raise语句与for循环同缩进,无论是否找到目标worker,循环结束后都会立刻抛出异常,完全不符合"仅未找到时报错"的功能需求。
修正后的代码
from pydantic import BaseModel class Worker(BaseModel): id: int name: str status: bool = True class WorkerList(BaseModel): # 改为Pydantic标准字段定义:冒号做类型注解,赋值默认空列表 workers: list[Worker] = [] def deactivate_worker(self, worker: Worker) -> None: for w in self.workers: if w.id == worker.id: w.status = False break else: # 仅当循环未被break中断(未找到对应worker)时抛出异常 raise ValueError(f"Cannot deactivate worker {worker.id}: Worker doesn't exist")
关键修改说明
- 字段定义修正:
workers: list[Worker] = []是Pydantic定义实例字段的正确方式,每个WorkerList实例会拥有独立的可迭代列表,mypy的迭代错误会直接消失。 - 异常逻辑修正:使用
for-else结构,确保只有在未找到匹配id的worker时才抛出异常,符合功能预期。
内容的提问来源于stack exchange,提问作者Lucas Mucidas
相关产品推荐
相关产品推荐

