зефир — выберите вложенную схему на основе значения поля и обработайте поля «начиная с»

#python #marshmallow

Вопрос:

Я анализирую файл и в итоге получаю такой словарь:

 user_data = {
  "title": "TestA",
  "sects": [
    {
        "type": "cmd",
        "cmd0": {
          "moveX": 12,
          "moveY": 34,
          "action": "fire"
        },
        "session": 9999,
        "cmd1": {
          "moveX": 56,
          "moveY": 78,
          "action": "stop"
        },
        "endType": 0,
      },
      {
        "type": "addUsers",
        "user1": {
          "name": "John",
          "city": "London"
        },
        "user2": {
          "name": "Mary",
          "city": "New York"
        },
        post = "yes"
      }
    ]
}
 

Я пытаюсь проверить это с помощью зефира, но не уверен, как справиться с этими двумя вещами:

  1. С sects содержимым каждого вложенного дикта зависит от type (cmd, addUser и т. Д.). Есть ли способ выбрать схему на основе значения поля?
  2. Существует ли такая вещь, как поле «Начало», чтобы справиться с тем фактом, что я, возможно cmd0 , cmd1 cmdN ?

Итак, что-то вроде следующего:

 class CmdSchema(schema):
    type = fields.Str()
    cmdN = fields.Dict(...) # Allow cmd1, cmd2, etc
    session = fields.Int()
    endType = fields.Int()

class AddUsersSchema(schema):
    type = fields.Str()
    userN = fields.Dict(...) # Allow user1, user2, etc
    post = fields.Str()

class ParsedFileSchema(schema):
   title = fields.Str()
   sects = fields.Nested(...)   # Choose nested schema based on sects[i]['type']?

 

Примечание: Я не могу изменить формат/содержимое файла, который я анализирую, и порядок имеет значение (поэтому мне нужно сохранить порядок cmd1, cmd2 и т. Д., Чтобы они могли обрабатываться в правильном порядке).

Ответ №1:

1/ То, чего вы хотите достичь, — это полиморфизм. Возможно, вы захотите проверить marshmallow-oneofschema.

2/ Насколько мне известно, этого не существует. Однако это не должно быть слишком сложно создать в качестве пользовательского валидатора. Это может даже дойти до сути.