我正在使用多种数据类型,并且经常将
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
我觉得很奇怪,这个功能并不是开箱即用的……也许我只是在做一些不常见/不必要的事情?
这是您需要的吗?
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