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