qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

math_ops.py (982B)


      1 """Parse arbitrary math equations in a safe way.
      2 
      3 Gratefully copied from https://stackoverflow.com/a/9558001
      4 """
      5 import ast
      6 import operator as op
      7 
      8 # supported operators
      9 operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul, ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor, ast.USub: op.neg}
     10 
     11 
     12 def compute(expr):
     13     """Parse a mathematical expression and return the answer.
     14 
     15     >>> compute('2^6')
     16     4
     17     >>> compute('2**6')
     18     64
     19     >>> compute('1 + 2*3**(4^5) / (6 + -7)')
     20     -5.0
     21     """
     22     return _eval(ast.parse(expr, mode='eval').body)
     23 
     24 
     25 def _eval(node):
     26     if isinstance(node, ast.Constant):  # <number>
     27         return node.value
     28     elif isinstance(node, ast.BinOp):  # <left> <operator> <right>
     29         return operators[type(node.op)](_eval(node.left), _eval(node.right))
     30     elif isinstance(node, ast.UnaryOp):  # <operator> <operand> e.g., -1
     31         return operators[type(node.op)](_eval(node.operand))
     32     else:
     33         raise TypeError(node)