TypeError при использовании cerberus для рекурсивной проверки данных - PullRequest
0 голосов
/ 21 октября 2019

Я использую cerberus 1.3.1 для проверки некоторых данных, представляющих список выражений. Каждое выражение в списке может иметь переменную или выражение бинарного оператора. В свою очередь, выражение бинарного оператора может иметь другое выражение в виде левого и / или правого термина, поэтому данные являются рекурсивными. Я использую cerberus.schema_registry.add для обработки рекурсии.

Вот пример кода:

binop = {
    "binop": {
        "type": "dict",
        "schema": {
            "left": {
                "schema": "expr",
                "required": True
            },
            "right": {
                "schema": "expr",
                "required": True
            },
            "operator": {
                "type": "string",
                "required": True
            },
        },
    }
}

var = {
    "variable": {
        "type": "dict",
        "schema": {
            "name": {
                "type": "string"
            }
        }
    }
}

expr = {
    "expr": {
        "type": "dict",
        "schema": {
            "anyof": [
                {"schema": var},
                {"schema": binop}
            ]
        }
    }
}

cerberus.schema_registry.add('expr', expr)
schema = {"expressions": {"type": "list", "schema": "expr"}}

v = cerberus.Validator(schema)

doc = {
    "expressions": [
        {
            "expr": {
                "binop": {
                    "left": {"expr": {"variable": {"name": "var1"}}},
                    "right": {"expr": {"variable": {"name": "var2"}}},
                    "operator": "+"
                }
            }
        },
        {"expr": {"variable": {"name": "var3"}}},
        {"expr": {"variable": {"name": "var4"}}}
    ]
}
print(v.validate(doc))

Когда я запускаю этот код, я получаю следующую ошибку:

Traceback (most recent call last):
  File "test.py", line 71, in <module>
    print(v.validate(doc))
  File ".venv/lib/python3.6/site-packages/cerberus/validator.py", line 990, in validate
    self.__normalize_mapping(self.document, self.schema)
  File ".venv/lib/python3.6/site-packages/cerberus/validator.py", line 671, in __normalize_mapping
    self.__normalize_containers(mapping, schema)
  File ".venv/lib/python3.6/site-packages/cerberus/validator.py", line 757, in __normalize_containers
    self.__normalize_sequence_per_schema(field, mapping, schema)
  File ".venv/lib/python3.6/site-packages/cerberus/validator.py", line 826, in __normalize_sequence_per_schema
    result = validator.normalized(document, always_return_document=True)
  File ".venv/lib/python3.6/site-packages/cerberus/validator.py", line 646, in normalized
    self.__normalize_mapping(self.document, self.schema)
  File ".venv/lib/python3.6/site-packages/cerberus/validator.py", line 660, in __normalize_mapping
    self.__normalize_rename_fields(mapping, schema)
  File ".venv/lib/python3.6/site-packages/cerberus/validator.py", line 864, in __normalize_rename_fields
    self._normalize_rename(mapping, schema, field)
  File ".venv/lib/python3.6/site-packages/cerberus/validator.py", line 877, in _normalize_rename
    if 'rename' in schema[field]:
TypeError: argument of type 'NoneType' is not iterable

Что я делаю не так или это ошибка Цербера?

...