#python #python-3.x #validation #schema #cerberus
#python #python-3.x #проверка #схема #cerberus
Вопрос:
У меня есть набор документов и схем, по которым я провожу проверку (shocker).
Эти документы представляют собой сообщения JSON от разных клиентов, которые используют разные форматы, поэтому для каждого документа / сообщения, полученного от этих клиентов, определяется схема.
Я хочу использовать dispatcher
(словарь с вызовами функций в качестве значений), чтобы помочь выполнить сопоставление / форматирование документа после его проверки на соответствие схеме. Как только я узнаю, к какой схеме относится сообщение, я могу создать желаемую полезную нагрузку сообщения для своих различных потребительских служб, вызвав требуемую функцию сопоставления.
Для этого мне нужен ключ в моем диспетчере, который однозначно сопоставляется с соответствующей функцией сопоставления для этой схемы. Ключ также необходимо использовать для идентификации схемы, чтобы можно было вызвать правильную функцию сопоставления.
Мой вопрос заключается в следующем: есть ли способ встроить значение конфигурации, например числовой идентификатор, в схему?
Я хочу взять эту схему:
schema = {
"timestamp": {"type": "number"},
"values": {
"type": "list",
"schema": {
"type": "dict",
"schema": {
"id": {"required": True, "type": "string"},
"v": {"required": True, "type": "number"},
"q": {"type": "boolean"},
"t": {"required": True, "type": "number"},
},
},
},
}
И добавьте schema_id
подобное:
schema = {
"schema_id": 1,
"timestamp": {"type": "number"},
"values": {
"type": "list",
"schema": {
"type": "dict",
"schema": {
"id": {"required": True, "type": "string"},
"v": {"required": True, "type": "number"},
"q": {"type": "boolean"},
"t": {"required": True, "type": "number"},
},
},
},
}
Таким образом, после успешной проверки создается ссылка между message
/ document
, к схеме через schema_id
к результату mapping_function
в диспетчере.
Что-то вроде этого:
mapping_dispatcher = {1: map_function_1, 2: map_function_2...}
if Validator.validate(document, schema) is True:
id = schema["schema_id"]
formatted_message = mapping_dispatcher[id](document)
Последней попыткой может быть простое упорядочивание схем json и использование их в качестве ключей, но я не уверен, что я чувствую по этому поводу (это кажется умным, но неправильным)…
Я также мог ошибаться, и есть более разумный способ сделать это.
Спасибо!
небольшое обновление
Я взломал его, построив схему, преобразовав в байты, затем в шестнадцатеричное число, а затем добавив целочисленные значения вместе следующим образом:
schema_id = 0
bytes_schema = str.encode(schema)
hex_schema = codecs.encode(bytes_schema, "hex")
for char in hex_schema:
schema_id = int(char)
>>>schema_id
36832
Комментарии:
1. Вы могли бы использовать сопоставление с отправленными функциями в качестве ключей и соответствующими схемами в качестве значений. Затем перебирайте его элементы и прерывайте, когда схема проверена.
Ответ №1:
Поэтому вместо хэш-функции я просто встроил схему в другой объект json, который содержал информацию следующим образом:
[
{
"schema_id": "3",
"schema": {
"deviceName": {
"type": "string"
},
"tagName": {
"required": true,
"type": "string"
},
"deviceID": {
"type": "string"
},
"success": {
"type": "boolean"
},
"datatype": {
"type": "string"
},
"timestamp": {
"required": true,
"type": "number"
},
"value": {
"required": true,
"type": "number"
},
"registerId": {
"type": "string"
},
"description": {
"type": "string"
}
}
}
]
Я думаю, я слишком много думал об этом.