在运行时生成文字
Generate Literal in Runtime
我想创建一个带有 Literal
字段的 pydantic
模型,但选项应该来自列表。像这样:
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
(另请参阅 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)]
我想创建一个带有 Literal
字段的 pydantic
模型,但选项应该来自列表。像这样:
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
(另请参阅 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)]