我正在尝试同时使用打字协议和 pydantic,但遇到了一些问题。我想我可能缺乏对如何正确使用它们两者的理解。
此 pydantic 代码产生错误:
from typing import TypeVar, Protocol, Generic, runtime_checkable
from pydantic import BaseModel
D = TypeVar('D')
@runtime_checkable
class SupportsDimensionality(Protocol[D]):
dimensionality: D
class ValueModel(BaseModel, Generic[D]):
value: SupportsDimensionality[D]
错误文字:
pydantic.errors.PydanticSchemaGenerationError:无法为 main.SupportsDimensionality[~D] 生成 pydantic-core 架构。在 model_config 中设置
以忽略此错误,或在您的类型上实现arbitrary_types_allowed=True
以完全支持它。__get_pydantic_core_schema__
我一直在试图找出为什么会发生这种情况以及如何解决它,但需要一些帮助。
我想通了。文档说here在这种情况下您可以使用
arbitrary_types_allowed=True
配置选项。问题似乎是 pydantic 不支持任意 Protocol
的验证。
这样做的目的是避免对字段进行详细/彻底的模型检查,以防它们只是 pydantic 不直接支持的任意类型。
这是我进行的修复:
"""Implementation of the NBC 2020 building code, for flushmount solar."""
from typing import TypeVar, Protocol, Generic, runtime_checkable
from pydantic import BaseModel, ConfigDict
D = TypeVar('D')
@runtime_checkable
class SupportsDimensionality(Protocol[D]):
dimensionality: D
class Model(BaseModel):
"""A base model that allows protocols to be used for fields."""
model_config = ConfigDict(arbitrary_types_allowed=True)
class ValueModel(Model, Generic[D]):
value: SupportsDimensionality[D]