+from N_info import message, SUPERV
+
+class FONCTION(ASSD):
+ pass
+
+class formule(ASSD):
+ def __init__(self, *args, **kwargs):
+ ASSD.__init__(self, *args, **kwargs)
+ self.nompar = None
+ self.expression = None
+ ctxt = {}
+ ctxt.update(getattr(self.parent, 'const_context', {}))
+ ctxt.update(getattr(self.parent, 'macro_const_context', {}))
+ self.parent_context = self.filter_context(ctxt)
+ #message.debug(SUPERV, "add parent_context %s %s", self.nom, self.parent_context)
+
+ def __call__(self, *val):
+ """Evaluation de la formule"""
+ # en POURSUITE, self.parent_context is None, on essaie de reprendre const_context
+ context = getattr(self, 'parent_context') or getattr(self.parent, 'const_context', {})
+ for param, value in zip(self.nompar, val):
+ context[param] = value
+ try:
+ # globals() pour math.*
+ res = eval(self.code, context, globals())
+ except Exception, exc:
+ message.error(SUPERV, "ERREUR LORS DE L'ÉVALUATION DE LA FORMULE '%s' " \
+ ":\n>> %s",self.nom, str(exc))
+ raise
+ return res
+
+ def setFormule(self, nom_para, texte):
+ """Cette methode sert a initialiser les attributs
+ nompar, expression et code qui sont utilisés
+ dans l'évaluation de la formule."""
+ self.nompar = nom_para
+ self.expression = texte
+ try :
+ self.code = compile(texte, texte, 'eval')
+ except SyntaxError, exc:
+ message.error(SUPERV, "ERREUR LORS DE LA CREATION DE LA FORMULE '%s' " \
+ ":\n>> %s", self.nom, str(exc))
+ raise
+
+ def __setstate__(self,state):
+ """Cette methode sert a restaurer l'attribut code lors d'un unpickle."""
+ self.__dict__.update(state) # update attributes
+ self.setFormule(self.nompar, self.expression) # restore code attribute