2

我正在使用 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)
4

1 回答 1

0

根据glomAPI 的文档。

default (object)– 在引发由 指定的异常时返回的可选默认值skip_exc

skip_exc(Exception) – 要忽略并返回的可选异常或异常元组defaultNone如果省略)。如果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可以从函数返回或通过字面量包含以取消分配到输出对象中。

于 2020-01-21T10:20:20.147 回答