| | |
| |
|
| | """ |
| | 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_ |
| |
|