Skip to content

pydantic_units #

Support for OpenMM units as pydantic fields

Modules:

  • v1

    OpenMM Quantity type for Pydantic v1.

  • v2

    OpenMM Quantity type for Pydantic v2.

Classes:

  • OpenMMQuantity

    A pydantic safe OpenMM quantity type that validates unit compatibility.

Functions:

OpenMMQuantity #

Bases: Quantity

A pydantic safe OpenMM quantity type that validates unit compatibility.

quantity_serializer #

quantity_serializer(value: Quantity) -> str

Serialize a Quantity to a string

Parameters:

  • value (Quantity) –

    The quantity to serialize

Returns:

  • str

    The serialized string

Source code in pydantic_units/_common.py
def quantity_serializer(value: Quantity) -> str:
    """Serialize a Quantity to a string

    Args:
        value: The quantity to serialize

    Returns:
        The serialized string
    """
    unit = value.unit
    value = value.value_in_unit(unit)

    bases = list(reversed([*unit.iter_base_or_scaled_units()]))

    components = [
        (
            None if i == 0 else "*",
            base.symbol + ("" if exponent == 1 else f"**{int(exponent)}"),
        )
        for i, (base, exponent) in enumerate(bases)
    ]

    if unit == dimensionless:
        components = []

    unit_str = " ".join(
        v for component in components for v in component if v is not None
    )
    return f"{value} {unit_str}" if len(unit_str) > 0 else f"{value}"

quantity_validator #

quantity_validator(
    value: str | Quantity, expected_units: Unit
) -> Quantity

Validate a string or quantity as a quantity with expected units

Parameters:

  • value (str | Quantity) –

    The value to validate

  • expected_units (Unit) –

    The expected units

Raises:

  • ValueError

    If the value is not a valid quantity or has the wrong units

Returns:

  • Quantity

    The validated quantity.

Source code in pydantic_units/_common.py
def quantity_validator(value: str | Quantity, expected_units: Unit) -> Quantity:
    """Validate a string or quantity as a quantity with expected units

    Args:
        value: The value to validate
        expected_units: The expected units

    Raises:
        ValueError: If the value is not a valid quantity or has the wrong units

    Returns:
        The validated quantity.
    """
    if isinstance(value, str):
        value = _openmm_quantity_from_str(value)

    assert isinstance(value, Quantity), f"invalid type - {type(value)}"

    try:
        return value.in_units_of(expected_units)
    except TypeError as e:
        raise ValueError(
            f"invalid units {value.unit} - expected {expected_units}"
        ) from e