Change to unify renders between Expression and random_expression

This commit is contained in:
Lafrite 2014-08-29 16:35:38 +02:00
parent 8eeaa80abe
commit 71b4c987ec
2 changed files with 34 additions and 11 deletions

View File

@ -11,6 +11,7 @@ class Expression(object):
"""A calculus expression. Today it can andle only expression with numbers later it will be able to manipulate unknown""" """A calculus expression. Today it can andle only expression with numbers later it will be able to manipulate unknown"""
PRIORITY = {"^": 5, "*" : 3, "/": 4, ":": 3, "+": 2, "-":2, "(": 1} PRIORITY = {"^": 5, "*" : 3, "/": 4, ":": 3, "+": 2, "-":2, "(": 1}
STR_RENDER = tex
def __init__(self, exp): def __init__(self, exp):
""" Initiate the expression """ Initiate the expression
@ -29,8 +30,11 @@ class Expression(object):
self.feed_fix() # Determine le fix et range la liste dans self.[fix]_tokens self.feed_fix() # Determine le fix et range la liste dans self.[fix]_tokens
def __str__(self): def __str__(self):
"""Overload str as it aim to be use in console the render is txt""" """
return txt(self.postfix_tokens) Overload str
If you want to changer render set Expression.RENDER
"""
return self.STR_RENDER(self.postfix_tokens)
def render(self, render = lambda x:str(x)): def render(self, render = lambda x:str(x)):
""" Same as __str__ but accept render as argument """ Same as __str__ but accept render as argument

View File

@ -9,19 +9,33 @@ import re
from .arithmetic import gcd from .arithmetic import gcd
class RdExpression(object): class RdExpression(object):
"""A generator of random expression builder""" """
A generator of random expression builder
def __init__(self, form, conditions = [], with_Exp = True): Two forms are available:
- exp: return the expression through Expression class (default)
- raw: return the expression as a raw string
This can be set globally with
RdExpression.FORM
or temporary with
- "raw_exp" or "raw_str" methods
"""
FORM = "exp"
def __init__(self, form, conditions = []):
"""Initiate the generator """Initiate the generator
:param form: the form of the expression (/!\ variables need to be in brackets {}) :param form: the form of the expression (/!\ variables need to be in brackets {})
:param conditions: condition on variables (/!\ variables need to be in brackets {}) :param conditions: condition on variables (/!\ variables need to be in brackets {})
:param with_Exp: If True, __call__ return an expression rendered through Expression class. If False, keep form and replace inside.
""" """
self._form = form self._form = form
self._conditions = conditions self._conditions = conditions
self._with_Exp = with_Exp
self._letters = self.get_letters() self._letters = self.get_letters()
self._gene_varia = {} self._gene_varia = {}
self._gene_2replaced= {} self._gene_2replaced= {}
@ -60,7 +74,7 @@ class RdExpression(object):
return varia return varia
def __call__(self, val_min = -10, val_max = 10, render = tex): def __call__(self, val_min = -10, val_max = 10):
"""RdExpression once it is initiate act like a function which create random expressions. """RdExpression once it is initiate act like a function which create random expressions.
:param val_min: minimum value random generation :param val_min: minimum value random generation
@ -69,10 +83,12 @@ class RdExpression(object):
:returns: an formated random expression :returns: an formated random expression
""" """
if self._with_Exp: if self.FORM == "exp":
return render(self.raw_exp(val_min, val_max).postfix_tokens) return self.raw_exp(val_min, val_max)
else: elif self.FORM == "raw":
return self.raw_str(val_min, val_max) return self.raw_str(val_min, val_max)
else:
raise ValueError(self.FORM , " is an undefined form for self.FORM")
def raw_str(self, val_min = -10, val_max = 10): def raw_str(self, val_min = -10, val_max = 10):
"""Return raw string (don't use Expression for rendering or parsing) """Return raw string (don't use Expression for rendering or parsing)
@ -134,13 +150,16 @@ def desc_rdExp(rdExp):
print("Conditions: ",rdExp._conditions) print("Conditions: ",rdExp._conditions)
print("Letters: ", rdExp._letters) print("Letters: ", rdExp._letters)
print("2replaced: ", rdExp._2replaced) print("2replaced: ", rdExp._2replaced)
print("Call : ", rdExp(render = tex)) print("Call : ", rdExp())
print("Gene varia: ", rdExp._gene_varia) print("Gene varia: ", rdExp._gene_varia)
print("Gene 2replaced: ", rdExp._gene_2replaced) print("Gene 2replaced: ", rdExp._gene_2replaced)
print('') print('')
if __name__ == '__main__': if __name__ == '__main__':
# Adapt render to consol display
Expression.STR_RENDER = txt
form = "{a}*-14 / (2*{b}) : -23 / 4" form = "{a}*-14 / (2*{b}) : -23 / 4"
cond = ["{a} + {b} in [1, 2, 3, 4, 5]", "{a} not in [1]", "{b} not in [1]"] cond = ["{a} + {b} in [1, 2, 3, 4, 5]", "{a} not in [1]", "{b} not in [1]"]
rdExp1 = RdExpression(form, cond) rdExp1 = RdExpression(form, cond)