pages-mirror/calc/engine/evaluator.py

23 lines
682 B
Python
Raw Normal View History

from calc.engine.builtins import SAFE_NAMES
def evaluate(expr: str, extra_names: dict = None) -> tuple[str, bool]:
"""
Evaluate a math expression safely.
Returns (result_string, is_error).
"""
namespace = dict(SAFE_NAMES)
if extra_names:
namespace.update(extra_names)
try:
result = eval(expr, {"__builtins__": {}}, namespace)
return str(result), False
except ZeroDivisionError:
return "Error: Division by zero", True
except ValueError as err:
return f"Error: {err}", True
except NameError as err:
return f"Error: {err}", True
except Exception as err:
return f"Error: {err}", True