У меня есть вложенная структура, считанная из строки json, которая выглядит примерно так:
[
{
"id": 1,
"type": "test",
"sub_types": [
{
"id": "a",
"type": "sub-test",
"name": "test1"
},
{
"id": "b",
"name": "test2",
"key_value_pairs": [
{
"key": 0,
"value": "Zero"
},
{
"key": 1,
"value": "One"
}
]
}
]
}
]
Мне нужно извлечь и развернуть данные, готовые для вставки в базу данных...
[
(1, "b", 0, "Zero"),
(1, "b", 1, "One")
]
Я делаю следующее ...
data_list = [
(
type['id'],
sub_type['id'],
key_value_pair['key'],
key_value_pair['value']
)
for type in my_parsed_json_array
if 'sub_types' in type
for sub_type in type['sub_types']
if 'key_value_pairs' in sub_type
for key_value_pair in sub_type['key_value_pairs']
]
Пока все хорошо.
Что мне нужно сделать дальше, однако,навязать некоторые ограничения.Например ...
if type['type'] == 'test': raise ValueError('[test] types can not contain key_value_pairs.')
Но я не могу выразить это в понимании.И я не хочу прибегать к петлям.Моя лучшая мысль на данный момент - это ...
def make_row(type, sub_type, key_value_pair):
if type['type'] == 'test': raise ValueError('sub-types of a [test] type can not contain key_value_pairs.')
return (
type['id'],
sub_type['id'],
key_value_pair['key'],
key_value_pair['value']
)
data_list = [
make_row(
type,
sub_type,
key_value_pair
)
for type in my_parsed_json_array
if 'sub_types' in type
for sub_type in type['sub_types']
if 'key_value_pairs' in sub_type
for key_value_pair in sub_type['key_value_pairs']
]
Это работает, но оно выполнит проверку для каждой пары key_value_pair, которая кажется избыточной. (Каждый набор пар ключ-значение может иметь тысячи пар, и проверку нужно выполнить только один раз, чтобы убедиться, что все в порядке.)
Кроме того, будут другиеправила, подобные этому, которые применяются на разных уровнях иерархии.Такие, как «тестовые» типы, могут содержать только «sub_test» sub_types.
Какие есть варианты, кроме указанных выше?
- Более элегантно?
- Более расширяемо?
- Больше производительности?
- Больше "Pythonic"?