Nice way for setting render <3

This commit is contained in:
Lafrite 2014-11-21 15:49:43 +01:00
parent 3e9277d86b
commit 3b5583bd61
5 changed files with 36 additions and 25 deletions

View File

@ -34,28 +34,16 @@ On peut ensuite afficher l'expression avec un *print*.
Et si l'on souhaite un rendu plus adapté à la console: Et si l'on souhaite un rendu plus adapté à la console:
>>> from pymath.render import txt >>> from pymath.render import txt
>>> exp.render(render = txt) >>> Expression.set_render(txt)
>>> exp.render()
1 + 2 * 3 1 + 2 * 3
Ou encore
>>> from pymath.renders import txt
>>> Expression.STR_RENDER = txt
>>> print(exp)
1 + 2 * 3
/!\ Il ne faut pas faire
>>> exp.STR_RENDER = txt
car le changement ne se propagera pas à toute la classe. Ce qui posera problème quand on utilisera la méthode *simplify*(les sous expressions auront l'ancien STR_RENDER).
### Simplification des expressions ### Simplification des expressions
Une fois les expressions créées, elles peuvent se réduire en expliquant les étapes et en respectant les règles de priorités. Les exemples suivants seront données avec un rendu texte. Une fois les expressions créées, elles peuvent se réduire en expliquant les étapes et en respectant les règles de priorités. Les exemples suivants seront données avec un rendu texte.
>>> from pymath.expression import Expression >>> from pymath.expression import Expression
>>> from pymath.renders import txt >>> from pymath.renders import txt
>>> Expression.STR_RENDER = txt >>> Expression.set_render(txt)
>>> exp = Expression("1 + 2 * 3") >>> exp = Expression("1 + 2 * 3")
>>> for i in exp.simplify(): >>> for i in exp.simplify():

View File

@ -12,6 +12,15 @@ 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"""
STR_RENDER = tex STR_RENDER = tex
DEFAULT_RENDER = tex
@classmethod
def set_render(cls, render):
cls.STR_RENDER = render
@classmethod
def set_df_render(cls):
cls.set_render(cls.DEFAULT_RENDER)
def __init__(self, exp): def __init__(self, exp):
""" Initiate the expression """ Initiate the expression
@ -47,20 +56,20 @@ class Expression(object):
## --------------------- ## ---------------------
## Mechanism functions ## Mechanism functions
def simplify(self, render=STR_RENDER): def simplify(self):
""" Generator which return steps for computing the expression """ """ Generator which return steps for computing the expression """
if not self.can_go_further(): if not self.can_go_further():
yield render(self.postfix_tokens) yield self.STR_RENDER(self.postfix_tokens)
else: else:
self.compute_exp() self.compute_exp()
old_s = '' old_s = ''
for s in self.steps: for s in self.steps:
new_s = render(s) new_s = self.STR_RENDER(s)
# Astuce pour éviter d'avoir deux fois la même étape (par exemple pour la transfo d'une division en fraction) # Astuce pour éviter d'avoir deux fois la même étape (par exemple pour la transfo d'une division en fraction)
if new_s != old_s: if new_s != old_s:
old_s = new_s old_s = new_s
yield new_s yield new_s
for s in self.child.simplify(render = render): for s in self.child.simplify():
if old_s != s: if old_s != s:
yield s yield s
@ -191,14 +200,20 @@ def test(exp):
print("\n") print("\n")
if __name__ == '__main__': if __name__ == '__main__':
Expression.STR_RENDER = txt Expression.set_render(txt)
exp1 = "2 ^ 3 * 5" exp1 = "2 ^ 3 * 5"
test(exp1) test(exp1)
Expression.set_render(tex)
test(exp1)
from pymath.operator import op from pymath.operator import op
exp = [2, 3, op.pw, 5, op.mul] exp = [2, 3, op.pw, 5, op.mul]
test(exp) test(exp)
Expression.set_render(txt)
test([Expression(exp1), Expression(exp), op.add]) test([Expression(exp1), Expression(exp), op.add])
exp = "1 + 3 * 5" exp = "1 + 3 * 5"

View File

@ -176,7 +176,9 @@ class Polynom(object):
coef_exp = coef coef_exp = coef
# On fait réduire l'expression puis on ajoute dans steps # On fait réduire l'expression puis on ajoute dans steps
coef_steps = list(coef_exp.simplify(render = lambda x:Expression(x))) Expression.set_render(lambda _,x:Expression(x))
coef_steps = list(coef_exp.simplify())
Expression.set_df_render()
# On ajoute toutes ces étapes # On ajoute toutes ces étapes
coefs_steps.append(coef_steps) coefs_steps.append(coef_steps)

View File

@ -26,6 +26,10 @@ class RdExpression(object):
FORM = "exp" FORM = "exp"
@classmethod
def set_form(cls, form):
cls.FORM = form
def __init__(self, form, conditions = []): def __init__(self, form, conditions = []):
"""Initiate the generator """Initiate the generator

View File

@ -11,6 +11,8 @@ from pymath.generic import first_elem
from pymath.render import txt, tex from pymath.render import txt, tex
Expression.set_render(txt)
class TestExpression(unittest.TestCase): class TestExpression(unittest.TestCase):
"""Testing functions from pymath.expression""" """Testing functions from pymath.expression"""
@ -26,16 +28,16 @@ class TestExpression(unittest.TestCase):
self.assertEqual(exp.postfix_tokens, [2, 3, "+"]) self.assertEqual(exp.postfix_tokens, [2, 3, "+"])
def test_simplify_frac(self): def test_simplify_frac(self):
render = lambda x : str(x) render = lambda _,x : str(x)
Expression.set_render(render)
exp = Expression("1/2 - 4") exp = Expression("1/2 - 4")
steps = ["[1, 2, '/', 4, '-']", \ steps = ["[1, 2, '/', 4, '-']", \
"[< Fraction 1 / 2>, 4, '-']", \ "[< Fraction 1 / 2>, 4, '-']", \
"[1, 1, '*', 2, 1, '*', '/', 4, 2, '*', 1, 2, '*', '/', '-']", \ "[1, 1, '*', 2, 1, '*', '/', 4, 2, '*', 1, 2, '*', '/', '-']", \
"[1, 8, '-', 2, '/']", \ "[1, 8, '-', 2, '/']", \
'[< Fraction -7 / 2>]'] '[< Fraction -7 / 2>]']
self.assertEqual(steps, list(exp.simplify(render = render))) self.assertEqual(steps, list(exp.simplify()))
Expression.set_render(txt)
Expression.STR_RENDER = tex
def test_add_exp(self): def test_add_exp(self):
e = Expression("12- 4") e = Expression("12- 4")