Source code for trnsystor.collections.variable

"""VariableCollection module."""
import collections

from pint.quantity import _Quantity

from trnsystor.statement import Constant, Equation
from trnsystor.typevariable import TypeVariable
from trnsystor.utils import _parse_value, standardize_name


[docs]class VariableCollection(collections.UserDict): """A collection of :class:`VariableType` as a dict. Handles getting and setting variable values. """ def __getattr__(self, key): """Get attribute.""" if isinstance(key, int): value = list(self.data.values())[key] else: value = super(VariableCollection, self).__getitem__(key) return value def __getitem__(self, key): """Get item.""" if isinstance(key, int): value = list(self.data.values())[key] elif isinstance(key, slice): value = list(self.data.values()).__getitem__(key) else: value = super(VariableCollection, self).__getitem__(key) return value def __setattr__(self, key, value): """Set attribute.""" if isinstance(value, dict): super(VariableCollection, self).__setattr__(key, value) else: self.__setitem__(key, value) def __setitem__(self, key, value): """Set item.""" if isinstance(value, TypeVariable): """if a TypeVariable is given, simply set it""" super().__setitem__(key, value) elif isinstance(value, (int, float, str)): """a str, float, int, etc. is passed""" value = _parse_value( value, self[key].type, self[key].unit, (self[key].min, self[key].max) ) self[key].__setattr__("value", value) elif isinstance(value, _Quantity): self[key].__setattr__("value", value.to(self[key].value.units)) elif isinstance(value, (Equation, Constant)): self[key].__setattr__("value", value) else: raise TypeError( "Cannot set a value of type {} in this " "VariableCollection".format(type(value)) ) def __str__(self): """Return Deck representation.""" return self._to_deck() def _to_deck(self): """Return deck representation of self.""" pass
[docs] @classmethod def from_dict(cls, dictionary): """Return VariableCollection from dict. Sets also the class attribute using ``named_key``. """ item = cls() for key in dictionary: named_key = standardize_name(dictionary[key].name) item.__setitem__(named_key, dictionary[key]) setattr(item, named_key, dictionary[key]) return item
@property def size(self): """The number of variable in the collection.""" return len(self)