Hello-World/calc/engine/evaluator.py
rajjagirdar-root bde60ad530 Add safe expression evaluator (calc/engine/evaluator.py + builtins.py)
- evaluator.evaluate(expr, extra_names) returns (result_str, is_error)
- blocks __builtins__ to prevent arbitrary code execution
- handles ZeroDivisionError, ValueError, NameError with friendly messages
- builtins.SAFE_NAMES covers trig, hyperbolic, log, exp, rounding, constants
2026-05-13 11:24:44 -04:00

23 lines
682 B
Python

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