在运行时生成文字

Generate Literal in Runtime

我想创建一个带有 Literal 字段的 pydantic 模型,但选项应该来自列表。像这样:

from pydantic import BaseModel
from typing import Literal

opts=['foo','bar']

class MyModel(BaseModel):
    select_one : Literal[opts]

有什么方法可以通过枚举来解决这个问题吗?

是的,有。如果将 strenum.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(另请参阅 here)。

根据您的情况有多种选择:

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)]