Source code for rxn.utilities.attrs

"""Helper functions for handling classes defined with the package attrs."""

from __future__ import annotations  # for ``Type[Any]``

from typing import Any, Iterable, List, Tuple, Type

from attr import Attribute


[docs]def get_class_attributes(cls: Type[Any]) -> Iterable[Attribute[Any]]: """ Return the attributes of a class declared with the attrs library. """ return cls.__attrs_attrs__ # type: ignore
[docs]def get_variables(cls: Type[Any]) -> List[str]: """ Return the names of the variables for a class declared with the attrs library. """ return [attribute.name for attribute in get_class_attributes(cls)]
[docs]def get_variables_and_types(cls: Type[Any]) -> List[Tuple[str, Type[Any]]]: """ Return the names of the variables and corresponding types for a class declared with the attrs library. """ result = [] for attribute in get_class_attributes(cls): t = attribute.type assert t is not None result.append((attribute.name, t)) return result
[docs]def get_variables_and_type_names(cls: Type[Any]) -> List[Tuple[str, str]]: """ Return the names of the variables and corresponding type names for a class declared with the attrs library. """ # If the attribute __name__ exists, take this (human-friendly), else # take the type directly return [ (variable, getattr(t, "__name__", str(t))) for variable, t in get_variables_and_types(cls) ]