【问题标题】:no error after forgetting Schema() in voluptuous在 voluptuous 中忘记 Schema() 后没有错误
【发布时间】:2019-11-17 07:16:48
【问题描述】:

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

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))

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

我不知道我是不是弄错了。有人可以明确说明省略Schema(...) 是否错误?为什么没有Schema(...) 的情况下它运行得这么好,以至于我没有发现任何问题?

【问题讨论】:

    标签: python voluptuous


    【解决方案1】:

    每个验证器都有一个在validators 中定义的__call__。您可以在下面查看源代码

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

    所以即使你有

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

    这也可以。正如您所说,PORT1PORT2 是不同的对象,但 __call__ 方法定义在所有 validators 以及派生自 _WithSubValidators 的对象上

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

    Schema 对象封装了这些验证器,以检查对象本身。

    在您的情况下,由于您只是验证单个字段或将它们与其他验证器组合在一起,因此它们可以正常工作

    【讨论】:

    • 感谢您的解释。你也可以回答第一个问题吗?在基于基本数据类型(dictlist 等)构建验证器时,显然需要Schema()。但是为什么来自性感的 README.md 文件中的示例显示例如s=Schema(All(..))s=All(..) 完成工作时,因为All 是验证器?
    • 因为你想测试一个 Schema 而不仅仅是一个特定的值。它是允许您在没有Schema 的情况下执行此操作的实现。这是作者的故意行为,还是只是事物实施方式的副作用,我不能说。但我推荐的一件事是始终使用Schema,这样您也可以与未来的升级兼容
    • 我希望性感的作者/维护者在这里倾听并为这个标签提供权威的答案。我仍然很困惑。当然,使用Schema 是一个安全的选择,但我的直觉是强制使用Schema 意味着这样的废话:Schema(Any(Schema(All(Schema(a1), Schema(a2)), Schema(b))))
    • Any and All 不需要有 Schema 包装器。将其视为乐高积木,您可以将多个积木连接起来并使用您喜欢的方式
    猜你喜欢
    • 2018-02-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多