путь объекта не использует значения по умолчанию? - PullRequest
0 голосов
/ 29 марта 2020

Я использую 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]?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...