使用 Pydantic 进行打字。协议

问题描述 投票:0回答:1

我正在尝试同时使用打字协议和 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__
以完全支持它。

我一直在试图找出为什么会发生这种情况以及如何解决它,但需要一些帮助。

python python-typing pydantic
1个回答
0
投票

我想通了。文档说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]
© www.soinside.com 2019 - 2024. All rights reserved.