Pydantic 的 Iterator 字段无法生成 schema,流式校验可改用 Iterable
Iterator[int] 可能在模型定义或 TypeAdapter 构造时触发 PydanticSchemaGenerationError。根据是否需要惰性消费选择 Iterable 或有限容器,保留元素校验和错误时机。
把字段标为 Iterator[int] 后,模型还没拿到任何数据就报 PydanticSchemaGenerationError: Unable to generate pydantic-core schema for collections.abc.Iterator[int]。同一个类型交给 TypeAdapter 也可能立即失败;带 validate_return=True 的函数则可能在装饰阶段失败。
在可核对的 Pydantic 2.14.1 正式实现中,Iterable、Generator 已有相应的 schema 入口,Iterator 没有同样的注册。不能由 Python 类型之间的继承关系,推断 Pydantic 对这些标注都实现了相同支持。
需要边读边校验,用受支持的 Iterable
如果业务需要消费一个数据流,并逐项验证整数,可以在验证边界使用 Iterable[int]:
from collections.abc import Iterable
from pydantic import BaseModel, ValidationError
class Request(BaseModel):
values: Iterable[int]
request = Request.model_validate({"values": iter(["1", "invalid"])})
stream = iter(request.values)
print(next(stream)) # 按非严格整数规则转换为 1
try:
next(stream)
except ValidationError as exc:
print(exc.errors()[0]["loc"])
这里模型构造完成,不表示所有元素已经通过验证。第二个非法元素要消费到它时才报错;异常处理和资源清理也要覆盖消费过程。若 API 在返回成功响应后才读取剩余数据,惰性验证可能晚于业务想要的失败时刻。
这项修改也扩大了可接受的外层类型:Iterable 可以接收列表等可迭代对象,而不只接收已有迭代器。业务若必须拒绝列表,需另行保留该检查,不能把类型名称替换当成完全等价。
有限输入需要提前拒绝时,选择具体容器
已知输入有界,而且处理前必须验证全部元素时,可以使用 list[int]。它需要消费输入并保存结果,内存与失败时机都和惰性方案不同;无限流或体积没有上限的流不适合这样处理。
报错提示中的 arbitrary_types_allowed=True 也不能代替元素校验。它用于允许任意类型,不会自动建立 Iterator[int] 应有的逐项验证规则;对参数化类型能否直接建 schema,还需核对当前实现。不要为了消除 schema 错误就假定每个元素已是整数。
截至 2026 年 10 月 21 日,不能把有关 Iterator 支持的待审改动写成已发布能力。升级后是否能恢复原标注,需要看实际正式版与验证行为,不能只看问题已有人提交修复。
调整后同时检查正常有限流、中途非法元素、空流和业务允许的提前停止。若输入背后持有文件或数据库游标,应按其自身生命周期关闭;Pydantic 的元素验证不会替应用保证这些外部资源一定及时释放。


