Source code for pinttr.validators
from ._metadata import MetadataKey
from .exceptions import UnitsError
from .util import units_compatible
[docs]def has_compatible_units(instance, attribute, value):
"""
Validate if ``value`` has units compatible (in the sense of
:func:`~pinttr.units_compatible`) with ``attribute``.
Only works with unit-enabled fields created with :func:`pinttr.ib`.
"""
compatible_units = attribute.metadata[MetadataKey.UNITS]()
try:
if not units_compatible(value.units, compatible_units):
raise UnitsError(
units1=value.units,
units2=compatible_units,
extra_msg=f": incompatible units '{value.units}' "
f"used to set field '{attribute.name}' "
f"(allowed: '{compatible_units}').",
)
except AttributeError: # value.units doesn't exist
raise UnitsError(
units1=None,
units2=compatible_units,
extra_msg=f": unitless value '{value}' "
f"used to set field '{attribute.name}' "
f"(requires units '{compatible_units}').",
)