Glom: Как включить значения по умолчанию для конкретных полей

Как можно включить в вывод glom значения по умолчанию для конкретных полей?

Например, я могу включить такие "константы":

from glom import Spec, Literal
extract = Spec({'A': 'a', 'B': Literal(42)}).glom
assert extract({'a': 'life'}) == {'A': 'life', 'B': 42}

Но как мне указать, что "B" должен указывать на 42, только если "B" не присутствует на входе? Выйдя из glom, я могу сделать следующее:

from glom import Spec
extract = lambda d: dict(Spec({'A': 'a'}).glom(d), B=d.get('B', 42))
assert extract({'a': 'life'}) == {'A': 'life', 'B': 42}
assert extract({'a': 'life', 'B': 'is short'}) == {'A': 'life', 'B': 'is short'}

Конечно, есть более красивый способ сделать это.

1 ответ

Решение

(Думаю, я получу славу (и позор за то, что не знал этого раньше).)

Ответ: используйтеglom.Coalesce с defaultаргумент в нем.

Glom-эквивалент моего лямбда-кода выше:

from glom import Spec, Coalesce
extract = Spec({'A': 'a', 'B': Coalesce('B', default=42)}).glom  # the solution
assert extract({'a': 'life'}) == {'A': 'life', 'B': 42}
assert extract({'a': 'life', 'B': 'is short'}) == {'A': 'life', 'B': 'is short'}
Другие вопросы по тегам