我想创建一个带有
pydantic
字段的 Literal
模型,但选项应该从列表中派生。像这样的东西:
from pydantic import BaseModel
from typing import Literal
opts=['foo','bar']
class MyModel(BaseModel):
select_one : Literal[opts]
有什么方法可以通过枚举来解决这个问题吗?
是的,有。 如果将
str
与 enum.Enum
混合使用,您将获得一个枚举,其成员与字符串完全向后兼容(可以在需要 str
类型的任何地方使用)并且类型检查器友好。
from enum import Enum
from pydantic import BaseModel
class Options(str, Enum):
FOO = 'foo'
BAR = 'bar'
class MyModel(BaseModel):
select_one : Options
为了使其发挥作用,
Literal
需要位于 tuple
之上(另请参阅此处)。
有多种选择,具体取决于您的情况:
from pydantic import BaseModel
from typing import Literal
# First option:
class MyModel(BaseModel):
select_one: Literal['foo', 'bar']
# Second option:
opts_tuple = ('foo', 'bar')
class MyModel(BaseModel):
select_one: Literal[opts_tuple]
# Third option:
opts_list = ['foo', 'bar']
class MyModel(BaseModel):
select_one: Literal[tuple(opts_list)]