Source code for fgen.data_models.method

"""
Data model of a method
"""
from __future__ import annotations

from typing import Union

from attrs import define

from fgen.data_models.multi_return import MultiReturn
from fgen.data_models.value import Value


[docs]@define class Method: """ Data model of a Fortran method This method is assumed to be part of a :class:`~fgen.data_models.fortran_derived_type.FortranDerivedType`. This function can have multiple :attr:`parameters` and a single, optional :attr:`returns` value. """ name: str """Name of the function in Fortran""" description: str """Description of what the function does""" parameters: dict[str, Value] """ Collection of named parameters of the function Currently, only :obj:`ValueDefinition` is supported because we assume that each parameter only refers to one value. If you think this assumption should be relaxed, please raise an issue illustrating your use case. """ returns: Union[Value, MultiReturn] """Return value of the function""" @property def units(self) -> dict[str, Union[str, tuple[str, ...]]]: """ Units used in the method Includes units from of the parameters and the return value. Raises ------ ValueError If different units are supplied for a given parameter name Returns ------- Collection of parameter names and associated units """ res: dict[str, Union[str, tuple[str, ...], None]] = { key: parameter.unit for key, parameter in self.parameters.items() } if self.returns: rn = self.returns.definition.name # rn = return's name if rn in res and res[rn] != self.returns.unit: raise ValueError( # noqa: TRY003 f"Inconsistent units for attribute '{rn}'. " f"In the input parameters it has units '{res[rn]}' " f"whereas in the returns it has units '{self.returns.unit}'" ) res[rn] = self.returns.unit # Drop any None units return {k: v for k, v in res.items() if v is not None}