def fancyCalc(self, expr, advanced=False): result = self.calc(expr, advanced=advanced) if not result: return "Error [{1}]: `{0}`".format(self.error, self.error.__class__.__name__) else: return result
calc = calculator() for equation in ["2+2","test"]: print "Result for equation `{0}` is: {1}".format(equation, calc.fancyCalc(equation))
Comment
import re, math
class calculator(object):
def __init__(self):
self.error = None
self.intRegex = re.compile(r'\b[\d\.]+\b')
def _return(self, value, error=None):
if error:
self.error = error
return value
def _safeEval(self, expr, symbols={}):
return eval(expr, dict(__builtins__=None), symbols)
def _toFloat(self, match):
group = match.group()
if group.find('.') == -1:
return group + '.0'
return group
def calc(self, expr, advanced=False):
self.error = None
expr = expr.replace('^','**')
expr = self.intRegex.sub(self._toFloat, expr)
try:
if advanced:
return self._return(self._safeEval(expr, vars(math)))
else:
return self._return(self._safeEval(expr))
except Exception, e:
return self._return(None, error=e)
def fancyCalc(self, expr, advanced=False):
result = self.calc(expr, advanced=advanced)
if not result:
return "Error [{1}]: `{0}`".format(self.error, self.error.__class__.__name__)
else:
return result
calc = calculator()
for equation in ["2+2","test"]:
print "Result for equation `{0}` is: {1}".format(equation, calc.fancyCalc(equation))
#That's my little addition :3 - thanks!!