3

根据示例,这是创建验证模式的正确方法:

import voluptuous as vol
PORT1 = vol.Schema(vol.All(int, vol.Range(min=0, max=65535)))

但是,我注意到,我Schema的一些验证器中缺少该调用,例如:

PORT2 = vol.All(int, vol.Range(min=0, max=65535))

我检查了一下,PORT1不是PORT2同一类型。问题是PORT2对我来说效果很好,并且给出了与正确的结果相同的结果PORT1

我不知道我是不是弄错了。有人可以明确说明省略Schema(...)? 为什么它在没有Schema(...)我没有注意到任何问题的情况下运行良好?

4

1 回答 1

2

每个验证器__call__validators. 您可以在下面查看源代码

https://github.com/alectomas/voluptuous/blob/master/voluptuous/validators.py#L279

所以即使你有

PORT3 = vol.Range(min=0, max=65535)
PORT3(100)

这也将起作用。正如您所说,PORT1并且PORT2是不同的对象,但是该__call__方法是在所有对象上定义的validators以及从其派生的对象_WithSubValidators

https://github.com/alectomas/voluptuous/blob/2e557f71db6260e3ab40a6848a6bf4705d434f2d/voluptuous/validators.py#L184

Schema对象是这些验证器的包装器,以检查对象本身。

在您的情况下,由于您只验证单个字段或将它们与其他验证器组合在一起,它们将完美地工作

在职的

于 2019-07-10T17:47:57.807 回答