54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Точка входа: интерактивный CLI-калькулятор.
|
|
|
|
Читает выражения из stdin до ключевых слов «выход» / "exit".
|
|
Можно запускать:
|
|
python cli.py
|
|
python cli.py "2 + 2" "3 * (4 - 1)" # аргументы — как входные строки
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
|
|
from calculator import is_exit_command, try_evaluate
|
|
|
|
|
|
def repl(exprs: list[str] | None) -> int:
|
|
"""Запускает цикл ввода/вычисления."""
|
|
if exprs is not None:
|
|
# режим «пакетного» запуска (аргументы строки выражений)
|
|
for expr in exprs:
|
|
if is_exit_command(expr):
|
|
break
|
|
print(try_evaluate(expr))
|
|
return 0
|
|
|
|
# интерактивный режим: читаем весь stdin целиком
|
|
# (детерминированное поведение в pipe/файле)
|
|
try:
|
|
data = sys.stdin.read()
|
|
except (EOFError, KeyboardInterrupt):
|
|
print()
|
|
return 0
|
|
|
|
print("Калькулятор. Введите выражение, 'выход'/'exit' — для завершения.")
|
|
print("Пример: 2 + 3 * (4 - 1) % 100")
|
|
for line in data.splitlines():
|
|
expr = line.strip()
|
|
if not expr:
|
|
continue
|
|
if is_exit_command(expr):
|
|
print("Пока!")
|
|
return 0
|
|
print(try_evaluate(expr))
|
|
return 0
|
|
|
|
|
|
def main(argv: list[str] | None = None) -> int:
|
|
argv = list(sys.argv[1:] if argv is None else argv)
|
|
return repl(argv)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|