Я использую objectpath
с большим набором данных, "Dungeons & Dragons Monster Manual"
, однако мой вопрос по-прежнему применим к любому набору данных.
При попытке запросить вышеупомянутый большой неорганизованный набор данных я заметил, что списки (ошибочно) автоматически усекаются. Я проиллюстрирую свою точку зрения:
import objectpath
data = [
{
"name": "Aboleth",
"actions": [
{
"name": "Multiattack",
"desc": "The aboleth makes three tentacle attacks.",
"attack_bonus": 0
},
{
"name": "Tentacle",
"desc": "Melee Weapon Attack: +9 to hit, reach 10 ft.",
"attack_bonus": 9,
"damage_dice": "2d6",
"damage_bonus": 5
},
{
"name": "Tail",
"desc": "Melee Weapon Attack: +9 to hit, reach 10 ft. one target. Hit: 15 (3d6 + 5) bludgeoning damage.",
"attack_bonus": 9,
"damage_dice": "3d6",
"damage_bonus": 5
},
{
"name": "Enslave (3/day)",
"desc": "The aboleth targets one creature it can see within 30 ft. of it",
"attack_bonus": 0
},
{
"name": "Detect",
"desc": "The aboleth makes a Wisdom (Perception) check.",
"attack_bonus": 0
},
{
"name": "Tail Swipe",
"desc": "The aboleth makes one tail attack.",
"attack_bonus": 0
},
{
"name": "Psychic Drain (Costs 2 Actions)",
"desc": "One creature charmed by the aboleth takes 10 (3d6) psychic damage",
"attack_bonus": 0
}
]
}
]
test = objectpath.Tree(data)
print(list(test.execute('$..actions.name')))
print(list(test.execute('$..actions.attack_bonus or 0')))
print(list(test.execute('$..actions.damage_bonus or 0')))
Обратите внимание, что $..actions.name
и $..actions.attack_bonus or 0
создают массивы длиной 7 элементов с 0
для элементов, которые отсутствуют, однако $..actions.damage_bonus or 0
создает только массив длиной 2 элемента без 0
в качестве заполнителя для отсутствующей информации:
#$..actions.name:
['Multiattack', 'Tentacle', 'Tail', 'Enslave (3/day)', 'Detect', 'Tail Swipe', 'Psychic Drain (Costs 2 Actions)']
#$..actions.attack_bonus or 0:
[0, 9, 9, 0, 0, 0, 0]
#$..actions.damage_bonus or 0:
[5, 5]
Есть ли способ предотвратить это? Как убедиться, что запрос $..actions.damage_bonus or 0
создает следующий массив: [0, 5, 5, 0, 0, 0, 0]
?