mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-04 07:12:33 +01:00 
			
		
		
		
	You can now use `qmk info` to get information about keyboards and keymaps. Co-authored-by: Erovia <Erovia@users.noreply.github.com>
		
			
				
	
	
		
			34 lines
		
	
	
		
			973 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			973 B
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Parse arbitrary math equations in a safe way.
 | 
						|
 | 
						|
Gratefully copied from https://stackoverflow.com/a/9558001
 | 
						|
"""
 | 
						|
import ast
 | 
						|
import operator as op
 | 
						|
 | 
						|
# supported operators
 | 
						|
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}
 | 
						|
 | 
						|
 | 
						|
def compute(expr):
 | 
						|
    """Parse a mathematical expression and return the answer.
 | 
						|
 | 
						|
    >>> compute('2^6')
 | 
						|
    4
 | 
						|
    >>> compute('2**6')
 | 
						|
    64
 | 
						|
    >>> compute('1 + 2*3**(4^5) / (6 + -7)')
 | 
						|
    -5.0
 | 
						|
    """
 | 
						|
    return _eval(ast.parse(expr, mode='eval').body)
 | 
						|
 | 
						|
 | 
						|
def _eval(node):
 | 
						|
    if isinstance(node, ast.Num):  # <number>
 | 
						|
        return node.n
 | 
						|
    elif isinstance(node, ast.BinOp):  # <left> <operator> <right>
 | 
						|
        return operators[type(node.op)](_eval(node.left), _eval(node.right))
 | 
						|
    elif isinstance(node, ast.UnaryOp):  # <operator> <operand> e.g., -1
 | 
						|
        return operators[type(node.op)](_eval(node.operand))
 | 
						|
    else:
 | 
						|
        raise TypeError(node)
 |