Pydantic 类型仅在运行时 + 赋值期间使用已知类型进行验证

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

是否有可能有一个 pydantic 模型,我可以在运行时以某种方式传递其中一个变量的数据类型?我尝试过阅读,但我无法理解 Pydantic 的工作原理。我本质上需要数据类型强制,在分配期间也是如此。我希望有一些东西可以做这样的事情:

class State(BaseModel):
    datatype: type,
    value: self.datatype,
    getter: Callable
    setter: Callable

state1 = State(bool, True, get_state1, set_state1)
state2 = State(int, 0, get_state2, set_state2)

state1.value = 7 # this should throw error, expected datatype of state1 is bool
pydantic
1个回答
0
投票

我认为这里有两个独立的问题:

  • (1) 验证作业
  • (2) 定义运行时类型

要启用验证分配,您可以使用特定的配置选项。请参阅https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.validate_assignment

关于 (2),我认为 Pydantic 并不是真正为了在运行时处理类型定义而设计的。 Pydantic 的重点是预先定义类型,然后 Pydantic 构建一次模型架构,然后在运行时进行验证。但是,如果您有充分的理由这样做,则可以选择实现此目标。

首先,您可以通过定义自定义

field_validator
来模仿该行为。然后,在字段验证器中,您可以使用
TypeValidator
来触发类型验证。然而,重要的是,这仅适用于小型模型,因为
TypeValidator
将在创建时构建模式并在每次调用验证时重建。

validate_assignment=True
选项相结合,您会得到以下内容:

from pydantic import BaseModel, field_validator, TypeAdapter, ConfigDict
from typing import Any


class State(BaseModel):
    model_config  = ConfigDict(validate_assignment=True)
    value_type: type
    value: Any

    @field_validator("value", mode="before")
    @classmethod
    def validate_value(cls, value, info):
        adapter = TypeAdapter(info.data["value_type"])
        return adapter.validate_python(value)


state1 = State(value=True, value_type=bool)
state2 = State(value=7, value_type=int)

state1.value = 7 # this should throw error, exp

这恰恰提高了:

ValidationError: 1 validation error for State
value
  Input should be a valid boolean, unable to interpret input [type=bool_parsing, input_value=7, input_type=int]
    For further information visit https://errors.pydantic.dev/2.5/v/bool_parsing

或者,您可以考虑在运行时创建整个模型。对于此 Pydantic 提供动态模型创建,请参阅示例 https://docs.pydantic.dev/latest/concepts/models/#dynamic-model-creation

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.