Glom обрабатывает или пропускает PathError для данных с разными ключами? - PullRequest
0 голосов
/ 21 января 2020

Я использую пакет glom, чтобы помочь с обходом большого словаря.

Учитывая эти данные:

data = {
    'groups': [
        {'instance': {'name': 'football'}},
        {'instance': {'name': 'rugby'}},
        {'id': 145, 'type': 'unknown'},
    ]
}

И используя glom, я пытаюсь получить имена экземпляров:

import glom
instance_names = glom(data, ('groups', ['instance.name']))

Я получаю сообщение об ошибке:

glom.core.PathAccessError: could not access 'instance', part 0 of Path('instance', 'name'), got error: KeyError('instance')

Как пропустить объекты, в которых не существует клавиши instance?

Обновление

Я попытался пропустить исключение, но затем получил пустые результаты:

instance_names = glom(data, ('groups', ['instance.name']), skip_exc=PathAccessError)

1 Ответ

0 голосов
/ 21 января 2020

Согласно документации glom API.

default (object) - Необязательное значение по умолчанию для возврата в случае исключения, указанного skip_exc, повышено.

skip_exc (Исключение) - необязательное исключение или кортеж исключений, которые следует игнорировать и возвращать default (None, если опущено). Если skip_exc и default не заданы, glom

Так

instance_names = glom(data, ('groups', ['instance.name']), skip_exc=PathAccessError)

вернет значение по умолчанию (None), когда возникнет PathAccessError Exception. Вот соответствующая часть исходного кода, которая объясняет это.

default = kwargs.pop('default', None if 'skip_exc' in kwargs else _MISSING)
skip_exc = kwargs.pop('skip_exc', () if default is _MISSING else GlomError)
...
...
try:
    ret = _glom(target, spec, scope)
except skip_exc:
    if default is _MISSING:
        raise
    ret = default

Вот один из способов решения этой проблемы.

Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:21:23) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from glom import glom, SKIP
>>>
>>> data = {
...     'groups': [
...         {'instance': {'name': 'football'}},
...         {'instance': {'name': 'rugby'}},
...         {'id': 145, 'type': 'unknown'},
...     ]
... }
>>>
>>> instance_names = glom(data, ('groups', [lambda x: glom(x, 'instance.name', default=SKIP)]))
>>> print(instance_names)
['football', 'rugby']

* SKIP singleton может быть возвращено из функции или включено через литерал для отмены назначения в выходной объект.

...