pydantic 很好地支持常规枚举,并且可以使用枚举实例和枚举值来初始化枚举类型字段:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
现在我想将枚举和文字结合起来,即强制字段值等于一个特定的枚举实例。但是,我仍然希望能够传递正确的枚举值(即不仅仅是正确的枚举实例),但这似乎不起作用:
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
Run Code Online (Sandbox Code Playgroud)
ale*_*ame 19
尝试使用基于字符串的 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8859 次 |
| 最近记录: |