Python Cerberus:单个文件的多模式?

Fan*_*ang 3 python validation cerberus

我正在尝试使用 Cerberus 来验证一些数据,但我遇到了一个问题。

我定义了几个较小的架构,例如:

A = {"type": "dict", "required": False, "schema": {"name": {"type": "string"}}}

B = {"type": "dict", "required": False, "schema": {"age": {"type": "integer"}}}

C = {"type": "dict", "required": False, "schema": {"gender": {"type": "string"}}}
Run Code Online (Sandbox Code Playgroud)

更高级别的架构是这样的:

{"something": {"type": "list", "schema": "type": [A, B, C]}}
Run Code Online (Sandbox Code Playgroud)

这显然行不通。

我想验证一个列表,其中的元素只需要通过(A, B, C). 我不知道如何用 Cerberus 做到这一点,我正在寻求帮助。

谢谢。

Nic*_*cci 5

尝试这个:

A = {"type": "dict", "schema": {"name": {"type": "string"}}}
B = {"type": "dict", "schema": {"age": {"type": "integer"}}}
C = {"type": "dict", "schema": {"gender": {"type": "string"}}}

schema = {'field':{'type':'list','anyof_schema':[A,B,C]}}

v = Validator(schema)

challenge = {'field':[{'name':'a name'}]}

v.validate(challenge)
True
Run Code Online (Sandbox Code Playgroud)

这要归功于anyof_*,这是所谓的of-rules提供的几个选项之一。这些规则允许您定义不同的规则集以进行验证。如果该字段根据前缀逻辑allanyonenone对列表中的集合进行验证,则该字段将被视为有效。有关详细信息,请参阅相关文档