OPERATORS = {'+': (1, lambda x, y: x + y), '-': (1, lambda x, y: x - y), '*': (2, lambda x, y: x * y), '/': (2, lambda x, y: x / y), 'x': (2, lambda x, y: x * y),'^': (2, lambda x, y: x ** y)} last two operators
def eval_(formula): def parse(formula_string): number = '' for s in formula_string: if s in '1234567890.': number += s elif number: yield float(number) number = '' if s in OPERATORS or s in "()": yield s if number: yield float(number) def shunting_yard(parsed_formula): stack = [] for token in parsed_formula: if token in OPERATORS: while stack and stack[-1] != "(" and OPERATORS[token][0] <= OPERATORS[stack[-1]][0]: yield stack.pop() stack.append(token) elif token == ")": while stack: x = stack.pop() if x == "(": break yield x elif token == "(": stack.append(token) else: yield token while stack: yield stack.pop() def calc(polish): stack = [] for token in polish: if token in OPERATORS: y, x = stack.pop(), stack.pop() stack.append(OPERATORS[token][1](x, y)) else: stack.append(token) return stack[0] return calc(shunting_yard(parse(formula))) in the dictionary, operators of 5 pieces when used in formulas work fine, '**', '+', '/', '-', '*' for example
print (eval ("2 ** 4")) - 16
the rest work strangely or do not work at all '^' - '^': (2, lambda x, y: x ** y)
print (eval ("2 ^ 4")) - 6?
print (eval ("2x4")) - does not work at all
if s in OPERATORS or s in "()": yield s I think the problem is in this place, but I do not understand why it works with 4 characters and does not want it with the others.
the parser itself is from here, just tried a bit to extend the functionality
evalfunction. For the built-inevalthe^operator is XOR, i.e.2 ^ 4 = 0b0010 ^ 0b0100 = 0b0110 = 6. Naturally, the built-inevalknows nothing about yourxoperator. - insolor