在运行时生成文字

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

我想创建一个带有

pydantic
字段的
Literal
模型,但选项应该从列表中派生。像这样的东西:

from pydantic import BaseModel
from typing import Literal

opts=['foo','bar']

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

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

python enums python-typing pydantic
2个回答
3
投票

是的,有。 如果将

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

-3
投票

为了使其发挥作用,

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)]
© www.soinside.com 2019 - 2024. All rights reserved.