Source code for chempy.printing.string

from operator import itemgetter
from .printer import Printer
from ..units import is_quantity


[docs]class StrPrinter(Printer): _default_settings = dict( Printer._default_settings, repr_name='string', Equilibrium_arrow='=', Reaction_arrow='->', ) def _Reaction_parts(self, rxn, **kwargs): str_ = self._str coeff_fmt = self._get('Reaction_coeff_fmt', **kwargs) formula_fmt = self._get('Reaction_formula_fmt', **kwargs) substances = self._get('substances', **kwargs) or {} nullstr, space = str_(''), str_(self._get('Reaction_coeff_space')) reac, prod, i_reac, i_prod = [[ ( ((coeff_fmt(v)+space) if v != 1 else nullstr) + formula_fmt(self._print(substances.get(k, k))) ) for k, v in filter(itemgetter(1), d.items()) ] for d in (rxn.reac, rxn.prod, rxn.inact_reac, rxn.inact_prod)] r_str = str_(" + ").join(reac) ir_str = (str_(' + ( ') + str_(" + ").join(i_reac) + str_(')') if len(i_reac) > 0 else nullstr) arrow_str = self._get('%s_arrow' % rxn.__class__.__name__, **kwargs) p_str = str_(" + ").join(prod) ip_str = (str_(' + ( ') + str_(" + ").join(i_prod) + str_(')') if len(i_prod) > 0 else nullstr) return r_str, ir_str, arrow_str, p_str, ip_str def _Reaction_str(self, rxn, **kwargs): fmtstr = self._str("{}{}%s{}%s{}{}") % self._get('Reaction_around_arrow', **kwargs) return fmtstr.format(*self._Reaction_parts(rxn, **kwargs)) def _Reaction_param_str(self, rxn, **kwargs): mag_fmt = self._get('magnitude_fmt', **kwargs) unit_fmt = self._get('unit_fmt', **kwargs) try: magnitude_str = mag_fmt(rxn.param.magnitude) unit_str = unit_fmt(rxn.param.dimensionality) except AttributeError: if is_quantity(rxn.param) or isinstance(rxn.param, (float,)): return mag_fmt(rxn.param) else: return str(rxn.param) else: return magnitude_str + self._str(' ') + unit_str def _print_Reaction(self, rxn, **kwargs): res = self._Reaction_str(rxn, **kwargs) if self._get('with_param', **kwargs) and rxn.param is not None: res += self._get('Reaction_param_separator', **kwargs) try: res += getattr(rxn.param, self._get('repr_name', **kwargs))( self._get('magnitude_fmt', **kwargs)) except AttributeError: res += self._Reaction_param_str(rxn, **kwargs) if self._get('with_name', **kwargs) and rxn.name is not None: res += self._get('Reaction_param_separator', **kwargs) res += rxn.name return res def _print_ReactionSystem(self, rsys, **kwargs): header = (rsys.name + '\n') if rsys.name else '' return header + '\n'.join(map(self._print, rsys.rxns)) + '\n'
[docs]def str_(obj, **settings): # Python keyword, hence the trailing '_' return StrPrinter(settings).doprint(obj)