Glom обрабатывает или пропускает PathError для данных с разными ключами?
Я использую пакет 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 ответ
Согласно документации glom
API.
default (object)
- Необязательный параметр по умолчанию для возврата в случае исключения, указанного вskip_exc
, Поднялся.
skip_exc
(Исключение) - необязательное исключение или кортеж исключений для игнорирования и возвратаdefault
(None
если опущено). Еслиskip_exc
и по умолчанию оба не установлены, glom
Так
instance_names = glom(data, ('groups', ['instance.name']), skip_exc=PathAccessError)
вернет значение по умолчанию (None
) когда он встречает PathAccessError
Исключение. Вот соответствующая часть исходного кода, объясняющая это.
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 может быть возвращен из функции или включен через литерал для отмены назначения в выходной объект.