mirror of
https://github.com/octocat/Hello-World.git
synced 2026-07-01 23:37:49 +00:00
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
This commit is contained in:
parent
7fd1a60b01
commit
bde60ad530
4 changed files with 48 additions and 0 deletions
22
calc/engine/evaluator.py
Normal file
22
calc/engine/evaluator.py
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue