Я использую 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
Что я делаю не так или это ошибка Цербера?