from typing import Any, Callable, Tuple from server.constants.common import ABSENT, EMPTY_DICT from server.utils.glom import glom DEFAULT_NONE_VALUES = (ABSENT, EMPTY_DICT, None, "null", "", "unknown") def getter( item: dict, key: str, f: Callable = None, none_values: Tuple[Any] = DEFAULT_NONE_VALUES, none_result: Any = None, default_result: Any = ABSENT, ) -> Any: value = glom(item, key, default=ABSENT) if (value in none_values) or ((EMPTY_DICT in none_values) and isinstance(value, dict) and not value): if none_result is not ABSENT: return none_result if default_result is not ABSENT: value = default_result return f(value) if f is not None else value