# SPDX-License-Identifier: MIT """ Commonly useful filters for `attrs.asdict` and `attrs.astuple`. """ from ._make import Attribute def _split_what(what): """ Returns a tuple of `frozenset`s of classes and attributes. """ return ( frozenset(cls for cls in what if isinstance(cls, type)), frozenset(cls for cls in what if isinstance(cls, str)), frozenset(cls for cls in what if isinstance(cls, Attribute)), ) def include(*what): """ Create a filter that only allows *what*. Args: what (list[type, str, attrs.Attribute]): What to include. Can be a type, a name, or an attribute. Returns: Callable: A callable that can be passed to `attrs.asdict`'s and `attrs.astuple`'s *filter* argument. .. versionchanged:: 23.1.0 Accept strings with field names. """ cls, names, attrs = _split_what(what) def include_(attribute, value): return ( value.__class__ in cls or attribute.name in names or attribute in attrs ) return include_ def exclude(*what): """ Create a filter that does **not** allow *what*. Args: what (list[type, str, attrs.Attribute]): What to exclude. Can be a type, a name, or an attribute. Returns: Callable: A callable that can be passed to `attrs.asdict`'s and `attrs.astuple`'s *filter* argument. .. versionchanged:: 23.3.0 Accept field name string as input argument """ cls, names, attrs = _split_what(what) def exclude_(attribute, value): return not ( value.__class__ in cls or attribute.name in names or attribute in attrs ) return exclude_