# Создано: 2026-04-10 # Изменено: 2026-03-23 — упрощён до поля ввода выражения (демонстрация деплоя). # Принимает произвольное математическое выражение: "2+2*(3-1)", "(10/3)**2" и т.д. # GET → HTML страница с формой; POST с {expr} → вычисление через безопасный eval. # Безопасность eval: __builtins__=None, только math-функции в locals. import math _PAGE = """ Калькулятор — Python 3.11

Калькулятор

Python 3.11 · runtime: sless
""" # Разрешённые math-функции в eval — без __builtins__ нет доступа к exec/open/etc. _MATH_LOCALS = {k: getattr(math, k) for k in dir(math) if not k.startswith('_')} def handler(event): if event.get('_method') == 'POST': expr = str(event.get('expr', '')).strip() return _compute(expr) # GET → HTML страница return _PAGE def _compute(expr): if not expr: return {'error': 'Введите выражение'} try: result = eval(expr, {'__builtins__': None}, _MATH_LOCALS) # noqa: S307 if not isinstance(result, (int, float)): return {'error': 'Результат не является числом'} return {'expr': expr, 'result': result} except ZeroDivisionError: return {'error': 'Деление на ноль'} except Exception as exc: return {'error': f'Ошибка: {exc}'} def _esc(s): # Экранируем HTML-спецсимволы — безопасный вывод в атрибут и тело. return s.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"')