首页 > 解决方案 > 联合类型的 Python Cerberus 验证

问题描述

我正在使用 Cerberus 构建某种 DSL 的验证逻辑,它指定了不同对象的列表。例如(使用 YAML):

    items:
      - name: shape1
        type: Circle
        radius: 2
      - name: shape2
        type: Rectangle
        length: 2
        width: 1

如何使用 Cerberus 检查不同类型的不同属性?我尝试使用 schema(list) + anyof + rules 但它不起作用。示例架构如下所示:

items:
  type: list
  anyof:
    - schema:
        name:
          type: string
          required: true
        type:
          type: string
          required: true
        radius:
          type: int
          required: true
    - schema:
        name:
          type: string
          required: true
        type:
          type: string
          required: true
        length:
          type: int
          required: true
        width:
          type: int
          required: true

示例错误:

self = <cerberus.validator.Validator object at 0x00000270F16E5040>, domain = 'validate', rule = 'type'

def __get_rule_handler(self, domain, rule):
    methodname = '_{0}_{1}'.format(domain, rule.replace(' ', '_'))
    result = getattr(self, methodname, None)
    if result is None:
      raise RuntimeError(
            "There's no handler for '{}' in the '{}' "
            "domain.".format(rule, domain)
        ) E           RuntimeError: There's no handler for 'type' in the 'validate' domain.

标签: pythonvalidationdslcerberus

解决方案


推荐阅读