Source code for httk.atomistic.models.formula.formula
"""The canonical reduced chemical-formula value class."""
from fractions import Fraction
from typing import Self
from httk.atomistic.models.formula.backend import ChemicalFormulaBackend
from httk.atomistic.models.formula.notation import parse_reduced_formula
[docs]
class ChemicalFormula(ChemicalFormulaBackend, str):
"""Store a strictly canonical reduced chemical formula.
:param formula: The alphabetical formula text with greatest common divisor one.
"""
_coefficients: tuple[tuple[str, int], ...]
def __new__(cls, formula: str) -> Self:
if isinstance(formula, cls):
return formula
coefficients = parse_reduced_formula(formula)
instance = super().__new__(cls, formula)
instance._coefficients = coefficients
return instance
def __repr__(self) -> str:
return f"{type(self).__name__}({str.__repr__(self)})"
@property
[docs]
def amounts(self) -> tuple[tuple[str, Fraction], ...]:
"""Return the formula coefficients as exact amounts."""
return tuple((element, Fraction(count)) for element, count in self._coefficients)