簡體   English   中英

Glom 處理或跳過具有不同鍵的數據的 PathError?

[英]Glom handling or skipping a PathError for data with different keys?

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

根據glom API 的文檔。

default (object) – 在引發skip_exc指定的異常時返回的可選默認值。

skip_exc (Exception) – 要忽略並返回default的可選異常或異常元組(如果省略則為None )。 如果skip_exc和 default 都沒有設置,glom

所以

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

遇到PathAccessError異常時會返回默認值( None )。 這是解釋這一點的源代碼的相關部分

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單例可以從函數返回或通過文字包含以取消對輸出對象的分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM