|
- # SPDX-License-Identifier: MIT
-
- """
- Commonly used hooks for on_setattr.
- """
-
- from . import _config
- from .exceptions import FrozenAttributeError
-
-
- def pipe(*setters):
- """
- Run all *setters* and return the return value of the last one.
-
- .. versionadded:: 20.1.0
- """
-
- def wrapped_pipe(instance, attrib, new_value):
- rv = new_value
-
- for setter in setters:
- rv = setter(instance, attrib, rv)
-
- return rv
-
- return wrapped_pipe
-
-
- def frozen(_, __, ___):
- """
- Prevent an attribute to be modified.
-
- .. versionadded:: 20.1.0
- """
- raise FrozenAttributeError
-
-
- def validate(instance, attrib, new_value):
- """
- Run *attrib*'s validator on *new_value* if it has one.
-
- .. versionadded:: 20.1.0
- """
- if _config._run_validators is False:
- return new_value
-
- v = attrib.validator
- if not v:
- return new_value
-
- v(instance, attrib, new_value)
-
- return new_value
-
-
- def convert(instance, attrib, new_value):
- """
- Run *attrib*'s converter -- if it has one -- on *new_value* and return the
- result.
-
- .. versionadded:: 20.1.0
- """
- c = attrib.converter
- if c:
- # This can be removed once we drop 3.8 and use attrs.Converter instead.
- from ._make import Converter
-
- if not isinstance(c, Converter):
- return c(new_value)
-
- return c(new_value, instance, attrib)
-
- return new_value
-
-
- # Sentinel for disabling class-wide *on_setattr* hooks for certain attributes.
- # Sphinx's autodata stopped working, so the docstring is inlined in the API
- # docs.
- NO_OP = object()
|