add_parenthesis to l_parenthesis and r_parenthesis

This commit is contained in:
Lafrite 2015-03-07 19:26:26 +01:00
parent 4841aef478
commit c00c0a86cc

View File

@ -49,9 +49,15 @@ class Operator(str):
:returns: the string with operator and operands :returns: the string with operator and operands
""" """
replacement = {"op"+str(i+1): ' '.join(self.add_parenthesis(op)) for (i,op) in enumerate(args)} if self.arity == 1:
op1 = self.l_parenthesis(args[0], True)
ans = link.format(op1 = op1)
elif self.arity == 2:
op1 = self.r_parenthesis(args[0], True)
op2 = self.l_parenthesis(args[1], True)
ans = link.format(op1 = op1, op2 = op2)
ans = link.format(**replacement)
ans = save_mainOp(ans, self) ans = save_mainOp(ans, self)
return ans return ans
@ -127,24 +133,19 @@ class Operator(str):
# TODO: Attention à gestion des fractions qui se comportent chelou avec les parenthèses |dim. nov. 9 09:21:52 CET 2014 # TODO: Attention à gestion des fractions qui se comportent chelou avec les parenthèses |dim. nov. 9 09:21:52 CET 2014
if self.arity == 1: if self.arity == 1:
# TODO: Marche juste avec -, il faudra voir quand il y aura d'autres operateurs unitaires |dim. nov. 9 09:24:53 CET 2014 # TODO: Marche juste avec -, il faudra voir quand il y aura d'autres operateurs unitaires |dim. nov. 9 09:24:53 CET 2014
op1 = self.add_parenthesis(args[0]) op1 = self.l_parenthesis(args[0])
ans = flatten_list([self, op1]) ans = flatten_list([self, op1])
elif self.arity == 2: elif self.arity == 2:
op1 = self.add_parenthesis(args[0]) op1 = self.l_parenthesis(args[0])
op2 = self.add_parenthesis(args[1]) op2 = self.r_parenthesis(args[1])
ans = flatten_list([op1, self, op2]) ans = flatten_list([op1, self, op2])
ans = save_mainOp(ans, self) ans = save_mainOp(ans, self)
return ans return ans
def add_parenthesis(self, op): def l_parenthesis(self, op, str_join=False):
""" Add parenthesis if necessary """ Add parenthesis for left operand if necessary """
>>> from pymath.polynom import Polynom
>>> P = Polynom([1,2,3])
"""
try: try:
if op.mainOp.priority < self.priority: if op.mainOp.priority < self.priority:
op = flatten_list(["(", op, ")"]) op = flatten_list(["(", op, ")"])
@ -155,7 +156,14 @@ class Operator(str):
op = ['(', op, ')'] op = ['(', op, ')']
except ValueError: except ValueError:
pass pass
return flatten_list([op]) ans = flatten_list([op])
if str_join:
ans = ' '.join([str(i) for i in ans])
return ans
def r_parenthesis(self, op, str_join=False):
""" Add parenthesis for left operand if necessary """
return self.l_parenthesis(op, str_join)
def save_mainOp(obj, mainOp): def save_mainOp(obj, mainOp):
"""Create a temporary class build over built-in type to stock the main operation of a calculus """Create a temporary class build over built-in type to stock the main operation of a calculus
@ -188,7 +196,8 @@ def operatorize(fun):
* "_render": action use in __txt__ and __tex__ * "_render": action use in __txt__ and __tex__
* "__txt__": txt rendering * "__txt__": txt rendering
* "__tex__": tex rendering * "__tex__": tex rendering
* "add_parenthesis": mechanism to add parenthesis * "l_parenthesis": mechanism to add parenthesis for left operande
* "r_parenthesis": mechanism to add parenthesis for rigth operande
""" """
def mod_fun(self, *args): def mod_fun(self, *args):
ans = fun(self, *args) ans = fun(self, *args)
@ -324,7 +333,7 @@ class op(object):
>>> sub1.__tex__('-1') >>> sub1.__tex__('-1')
'- (-1)' '- (-1)'
""" """
def add_parenthesis(self, op): def l_parenthesis(self, op, str_join=False):
""" Add parenthesis if necessary """ """ Add parenthesis if necessary """
try: try:
if op.mainOp.priority <= self.priority: if op.mainOp.priority <= self.priority:
@ -336,7 +345,11 @@ class op(object):
op = ['(', op, ')'] op = ['(', op, ')']
except ValueError: except ValueError:
pass pass
return flatten_list([op])
ans = flatten_list([op])
if str_join:
ans = ' '.join([str(i) for i in ans])
return ans
caract = { caract = {
"operator" : "-", \ "operator" : "-", \
@ -346,7 +359,7 @@ class op(object):
"actions" : "__neg__",\ "actions" : "__neg__",\
"txt" : "- {op1}",\ "txt" : "- {op1}",\
"tex" : "- {op1}",\ "tex" : "- {op1}",\
"add_parenthesis": add_parenthesis,\ "l_parenthesis": l_parenthesis,\
} }
return caract return caract
@ -371,15 +384,17 @@ class op(object):
# * can not be display in some cases # * can not be display in some cases
def _render(self, link, *args): def _render(self, link, *args):
replacement = {"op"+str(i+1): ' '.join(self.add_parenthesis(op)) for (i,op) in enumerate(args)} op1 = self.r_parenthesis(args[0], True)
op2 = self.l_parenthesis(args[1], True)
ans = link.format(op1 = op1, op2 = op2)
if not self.visibility or args[1][0] == "(" or \ if not self.visibility or op2[0] == "(" or \
(type(args[1][0]) == str and args[1][0].isalpha()): (type(op2[0]) == str and op2[0].isalpha()):
ans = "{op1} {op2}".format(**replacement) ans = "{op1} {op2}".format(op1 = op1, op2 = op2)
ans = save_mainOp(ans, self) ans = save_mainOp(ans, self)
return ans return ans
else: else:
ans = link.format(**replacement) ans = link.format(op1 = op1, op2 = op2)
ans = save_mainOp(ans, self) ans = save_mainOp(ans, self)
return ans return ans