Вы были очень близки! Хорошая особенность цепочки glom (которую вы делаете с этим кортежем) заключается в том, что вам по сути никогда не нужно вызывать glom дважды. Вы можете просто соединиться прямо:
>>> glom(data, ('props.items', [lambda i: i if i['name']=='b' else SKIP], '0.content.id'))
'x'
Все, что я сделал, это добавил третий элемент '0.content.id'
, который получает первый элемент, затем ключ содержимого, затем ключ id.
Для немного более привлекательного способа вы можете переписать эту лямбду следующим образом:
>>> glom(data, ('props.items', [Check('name', equal_to='b', default=SKIP)], '0.content.id'))
'x'
Он делает то же самое и на самом деле немного длиннее, но может читать немного лучше. Объедините это с другой проверкой для проверки, и вы даже можете предотвратить последний шаг поиска, если не найден объект с именем:
>>> glom(data, ('props.items', [Check('name', equal_to='z', default=SKIP)], Check(default=STOP), '0.content.id'))
[]
Не забудьте импортировать Check
и STOP
, если вы пойдете по этому пути. Кроме того, если спецификация становится длинной, вы можете дать ей хорошее описательное имя переменной :) Спасибо за отличный вопрос!