【问题标题】:Initialize a Literal enum in a pydantic model在 pydantic 模型中初始化 Literal 枚举
【发布时间】:2021-03-11 09:29:07
【问题描述】:

pydantic 很好地支持常规枚举,并且可以使用枚举 instance 和枚举 value 来初始化枚举类型字段:

from enum import Enum
from pydantic import BaseModel

class MyEnum(Enum):
    FOO = 'foo'
    BAR = 'bar'

class MyModel(BaseModel):
    x: MyEnum

MyModel(x=MyEnum.BAR)  # Enum instance, works
MyModel(x='foo')       # Enum value, works
MyModel(x='?')         # Fails, as expected

pydantic 也支持typing.Literal:

from typing import Literal
from pydantic import BaseModel

class MyModel(BaseModel):
    x: Literal['foo']

MyModel(x='foo')  # Works
MyModel(x='bar')  # Fails, as expected

现在我想结合枚举和文字,即强制字段值等于一个特定的枚举实例。但是,我仍然希望能够传递正确的枚举 value(即不仅是正确的枚举 instance),这似乎不起作用:

from enum import Enum
from typing import Literal
from pydantic import BaseModel

class MyEnum(Enum):
    FOO = 'foo'
    BAR = 'bar'

class MyModel(BaseModel):
    x: Literal[MyEnum.FOO]

MyModel(x=MyEnum.FOO)  # Enum instance, works
MyModel(x=MyEnum.BAR)  # Fails, as expected
MyModel(x='foo')       # Enum value, fails but I'd like it to work

【问题讨论】:

标签: python pydantic


【解决方案1】:

尝试使用 基于字符串的 Enum。像这样:

from enum import Enum
from typing import Literal
from pydantic import BaseModel


class MyEnum(str, Enum):
    FOO = 'foo'
    BAR = 'bar'


class MyModel(BaseModel):
    x: Literal[MyEnum.FOO]


MyModel(x=MyEnum.FOO)  # Enum instance, works
# MyModel(x=MyEnum.BAR)  # Fails, as expected
MyModel(x='foo')       # String value, works

【讨论】:

  • 这很聪明,谢谢!我不确定子类化 str 是否适用于所有用例,但它应该适用于我。
猜你喜欢
  • 2021-04-16
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多