如何创建没有关键字参数的 Pydantic 类型?

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

我正在使用多种数据类型,并且经常将

data_type
作为参数传递给我的函数/方法/类。对于类型提示,我考虑过这样做

from typing import Literal

data_type: Literal["type1", "type2", "type3", "type4"]

但这似乎很脆弱。如果我需要添加新的数据类型,我需要更新类型提示无处不在,这不是 DRY。这还有问题吗?

所以,我以一种非常hacky的方式创建了一个

DataType
类型:

VALID_DATA_TYPES = {"type1", "type2", "type3", "type4"}
DataType = Literal[tuple(VALID_DATA_TYPES)]

我正在考虑切换到 Pydantic 来进行参数验证并且正在正确执行。

但我不喜欢在 Pydantic 中传递参数名称(在本例中为

value
)的方式

from pydantic import BaseModel

class DataType(BaseModel):
    value: Literal["type1", "type2", "type3", "type4"]
    
DataType(value="type1") # all good
DataType(value="error") # ValidationError

是否可以像这样使用 Pydantic 模型?

DataType("type1") # all good
DataType("error") # ValidationError

我觉得很奇怪,这个功能并不是开箱即用的……也许我只是在做一些不常见/不必要的事情?

python pydantic
1个回答
0
投票

这是您需要的吗?

from pydantic import BaseModel, RootModel, model_validator
from pydantic.json_schema import SkipJsonSchema

class DataType(BaseModel):
    value: Literal["type1", "type2", "type3", "type4"]

    def __init__(self, *args):
        field_names = self.model_fields.keys()
        kwargs = dict(zip(field_names, args))
        super().__init__(**kwargs)
 
DataType("type1") # all good
DataType("error") # ValidationError

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