我正试图使用Literal
与Pydantic创建一个有区别的联盟。
有一些关于作业资源的事件,我想通过event_name
来区分它们。对于JobPublishedEvents
,我想确保存在一些extra_field
class GenericJobEvent(BaseModel):
event_name: str
id: int
class JobPublishedEvent(GenericJobEvent):
event_name: Literal['job.published']
extra_field: str
class Wrapper(BaseModel):
wrapped: Union[JobPublishedEvent, GenericJobEvent]
print(type(Wrapper(wrapped={'event_name': 'some.event', 'id': 1}).wrapped)) # GenericJobEvent
print(type(Wrapper(wrapped={'event_name': 'job.published', 'id': 1, 'extra_field': 'extra'}).wrapped)) # JobPublishedEvent
print(type(Wrapper(wrapped={'event_name': 'job.published', 'id': 1}).wrapped)) # GenericJobEvent
前两种情况的行为与预期的一样,第三种情况我希望出现验证错误,因为文字匹配,但模式没有实现。不过,我明白了为什么对GenericJobEvent的回退是有效的
有人对如何实现这一目标有想法吗
这个问题是因为
JobPublishedEvent
失败了,而GenericJobEvent
没有。想想看,event_name
属性是一个字符串,id
是一个int。所有内容都匹配因此,您可以做的是验证
GenericJobEvent
中的event_name
并拒绝事件名称job.published
您可以按照docs中的说明对其进行验证
相关问题 更多 >
编程相关推荐