Python Cerberus встраивает числовые данные конфигурации в схему

#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"
            }
        }
    }
]
  

Я думаю, я слишком много думал об этом.