是否有可能有一个 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
我认为这里有两个独立的问题:
要启用验证分配,您可以使用特定的配置选项。请参阅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
我希望这有帮助!