【问题标题】:Python Cerberus - One is required if another one does not existPython Cerberus - 如果另一个不存在则需要一个
【发布时间】:2021-08-20 06:43:42
【问题描述】:

我想要达到的目标:

>>> from cerberus import Validator
>>> schema = {"x": {"type": "integer", "required": False}, "y": {"type": "integer", "required": False}}
>>> v = Validator(schema)
>>> v.validate({"x": 5})
True
>>> v.validate({"y": 6})
True
>>> v.validate({"x": 5, "y": 6})
True
>>> v.validate({})
False

我已经检查了所有文档,但仍然不知道如何实现此结果。我应该如何定义架构?

【问题讨论】:

    标签: python python-3.x cerberus


    【解决方案1】:

    唯一可行的解​​决方案是多次使用Validator()

    from cerberus import Validator
    
    def composite_validator(document):
        REQUIRED_INTEGER = {"type": 'integer', "required": True}
        OPTIONAL_INTEGER = {"type": 'integer', "required": False}
    
        schemas = [
            {"x": REQUIRED_INTEGER, "y": OPTIONAL_INTEGER},
            {"x": OPTIONAL_INTEGER, "y": REQUIRED_INTEGER},
        ]
        common_schema = {"z1": REQUIRED_INTEGER, "z2": OPTIONAL_INTEGER, "z3": REQUIRED_INTEGER}
        for s in schemas:
            s.update(common_schema)
    
        validator = Validator()
        return any(validator(document, s) for s in schemas)
    

    测试结果:

    for case in [
            {"x": 5, "z1": 0, "z3": -1},
            {"y": 6, "z1": 0, "z3": -1},
            {"x": 5, "y": 6, "z1": 0, "z3": -1},
            {"z1": 0, "z3": -1}]:
        print(case)
        print(composite_validator(case))
    #{'x': 5, 'z1': 0, 'z3': -1}
    #True
    #{'y': 6, 'z1': 0, 'z3': -1}
    #True
    #{'x': 5, 'y': 6, 'z1': 0, 'z3': -1}
    #True
    #{'z1': 0, 'z3': -1}
    #False
    

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多