test_bot / tools /calculator.py
rohitchandra's picture
tract pdfs with git lfs
d6ea378
import re
from typing import Union
class Calculator:
"""A simple calculator tool for evaluating basic arithmetic expressions."""
@staticmethod
def evaluate_expression(expression: str) -> Union[float, str]:
"""Evaluate a basic arithmetic expression.
Supports only basic arithmetic operations (+, -, *, /) and parentheses.
Returns an error message if the expression is invalid or cannot be
evaluated safely.
Args:
expression: A string containing a mathematical expression
e.g. "5 + 3" or "10 * (2 + 3)"
Returns:
Union[float, str]: The result of the evaluation, or an error message
if the expression is invalid
Examples:
>>> Calculator.evaluate_expression("5 + 3")
8.0
>>> Calculator.evaluate_expression("10 * (2 + 3)")
50.0
>>> Calculator.evaluate_expression("15 / 3")
5.0
"""
try:
# Clean up the expression
expression = expression.strip()
# Only allow safe characters (digits, basic operators, parentheses, spaces)
if not re.match(r'^[\d\s\+\-\*\/\(\)\.]*$', expression):
return "Error: Invalid characters in expression"
# Evaluate the expression
result = eval(expression, {"__builtins__": {}})
# Convert to float and handle division by zero
return float(result)
except ZeroDivisionError:
return "Error: Division by zero"
except (SyntaxError, TypeError, NameError):
return "Error: Invalid expression"
except Exception as e:
return f"Error: {str(e)}"