def __init__(self, formulas=None): super(Formulas, self).__init__(formulas) #: dictionary of formula sources added to the Formula layer self.formula_sources = {} #: formula source objects self.formula_obj = {} #: formulas self.formulas = FormulaRegistry()
class Formulas(Layer): """ Layer containing formulas. """ def __init__(self, formulas=None): super(Formulas, self).__init__(formulas) #: dictionary of formula sources added to the Formula layer self.formula_sources = {} #: formula source objects self.formula_obj = {} #: formulas self.formulas = FormulaRegistry() # layers are initialized by the model def add(self, formula_source, module, package=None): """ Import module (from package) with formulas, import formulas and add them to formula registry. :param formula_source: Name of the formula source to add/open. :param module: Module containing formula source. :param package: [Optional] Package of formula source module. .. seealso:: :func:`importlib.import_module` """ # import module mod = importlib.import_module(module, package) # get formula source class definition from module if formula_source.startswith('_'): err_msg = 'No "%s" attribute in "%s".' % (formula_source, mod) raise AttributeError(err_msg) self.formula_sources[formula_source] = getattr(mod, formula_source) # only update layer info if it is missing! if formula_source not in self.layer: # copy formula source parameters to :attr:`Layer.layer` self.layer[formula_source] = {'module': module, 'package': package} self.formula_obj[formula_source] = \ self.formula_sources[formula_source]() # register formula and linearity in registry formula_src_obj = self.formula_obj[formula_source] self.formulas.register(formula_src_obj.formulas, formula_src_obj.islinear) def open(self, formula_source, module, package=None): self.add(formula_source, module, package=None) def load(self): """ Add formula_source to layer. """ for k, v in self.layer.iteritems(): self.add(k, v['module'], v.get('package'))