from collections.abc import Iterable, Mapping, Sequence from typing import Any, overload @overload def exclude[K, V]( data: Mapping[K, V], keys: Iterable[K], *, recursive: bool = False ) -> dict[K, V]: ... @overload def exclude[K, V]( data: Sequence[Mapping[K, V]], keys: Iterable[K], *, recursive: bool = False ) -> list[dict[K, V]]: ... def exclude(data: Any, keys: Iterable[Any], *, recursive: bool = False) -> Any: drop = set(keys) if isinstance(data, Mapping): if recursive: return _drop_deep(data, drop) return {key: value for key, value in data.items() if key not in drop} return [exclude(item, drop, recursive=recursive) for item in data] def _drop_deep(value: Any, drop: set[Any]) -> Any: if isinstance(value, Mapping): return {k: _drop_deep(v, drop) for k, v in value.items() if k not in drop} if isinstance(value, list): return [_drop_deep(item, drop) for item in value] return value