def operate(self, operator, t1, t2): """returns the result of an operation performed on two terms""" #casts strings to the appropriate type if type(t1) == type(''): try: t1 = float(t1) except ValueError: try: t1 = complex(eval(t1)) #I wrote my own method for complex casting because Python's #native type cast relies on very specific pre-formatting except ValueError: t1 = eqn_helper.make_complex(t1) if type(t2) == type(''): try: t2 = float(t2) except ValueError: try: t2 = complex(eval(t2)) except ValueError: t2 = eqn_helper.make_complex(t2) try: #makes sure that if one term is a vector, both terms become vectors if type(t2) == type(Vector()) and type(t1) != type(Vector()): t1 = Vector(t1) if operator == '+': return t1 + t2 if operator == '-': return t1 - t2 if operator == '*': return t1 * t2 if operator == '/': return t1 / t2 if operator == '**': return t1 ** t2 if operator == '*-': return t1 * -t2 if operator == '/-': return t1 / -t2 if operator == '**-': return 1 / t1 ** t2 if operator == 'e': return t1 * 10 ** t2 if operator == 'e-': return t1 * 10 ** -t2 if operator == 'dot': return t1.dot(t2) if operator == 'cross': return t1.cross(t2) if operator == '%': return t1 % t2 except OverflowError: print('OverflowError. Value too large.') return 0
def evaluate_numbers(phrase): """creates an evaluator for a phrase and automatically evaluates it.""" temp = RawEvaluator(phrase).evaluate() if type(temp) != type(''): return temp else: try: #FIX THIS return eval(temp) except (ValueError, TypeError): try: return complex(temp) except (TypeError, ValueError): try: return eqn_helper.make_complex(temp) except (TypeError, ValueError): return Vector(temp)