#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"
}
]
}
Я пытаюсь проверить это с помощью зефира, но не уверен, как справиться с этими двумя вещами:
- С
sects
содержимым каждого вложенного дикта зависит отtype
(cmd, addUser и т. Д.). Есть ли способ выбрать схему на основе значения поля? - Существует ли такая вещь, как поле «Начало», чтобы справиться с тем фактом, что я, возможно
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/ Насколько мне известно, этого не существует. Однако это не должно быть слишком сложно создать в качестве пользовательского валидатора. Это может даже дойти до сути.