from typing import Any, List
def select_attributes(obj: Any, attributes: List[str]) -> Any:
"""Select a subset of attributes from the given dict (returns a copy)"""
attributes = attributes if isinstance(attributes, (list, tuple)) else [attributes] # type: ignore
return {k: v for k, v in obj.items() if k in attributes}
def select_from_typed_dict(typed_dict: Any, obj: Any, filter: bool = False) -> Any:
"""
Select a subset of attributes from a dictionary based on the keys of a given `TypedDict`.
:param typed_dict: the `TypedDict` blueprint
:param obj: the object to filter
:param filter: if True, remove all keys with an empty (e.g., empty string or dictionary) or `None` value
:return: the resulting dictionary (it returns a copy)
"""
selection = select_attributes(
obj, [*typed_dict.__required_keys__, *typed_dict.__optional_keys__]
)
if filter:
selection = {k: v for k, v in selection.items() if v}
return selection