Как правильно писать код на Python?

Часто используется пятиуровневая шкала критичности: «Блокирующий», «Критический», «Значительный», «Незначительный», «Тривиальный». <br/>
  • 22 февраля 2026 г. 12:01
Ответы на вопрос 3
Коротко и по делу — как правильно писать код на Python и как классифицировать баги по пятиуровневой шкале.

Основные принципы
- Читаемость важнее «умности». Следуйте Zen of Python (import this): простота, явность, понятность.
- Соблюдайте PEP 8 (стиль) и PEP 257 (docstrings).
- Делайте функции короткими: одна ответственность — одна функция/класс.
- Используйте понятные имена (snake_case для функций/переменных, CamelCase для классов).
- Пишите типы (type hints) — mypy/pyright помогают ловить ошибки на этапе разработки.
- Документируйте публичный API: docstrings + краткая документация.
- Пишите тесты (pytest): unit, integration, edge-cases. Поддерживайте минимальный охват для критичных модулей.
- Автоматизируйте: linters (flake8/pylint), форматирование (black, isort), pre-commit, CI (GitHub Actions/GitLab CI).
- Ловите и логируйте ошибки корректно (logging), не подавляйте исключения без причины.
- Не используйте изменяемые значения по умолчанию в сигнатурах функций.
- Предпочитайте контекстные менеджеры (with), генераторы и итераторы для памяти/производительности.
- Избегайте глобального состояния и побочных эффектов.
- Пишите маленькие, частые коммиты с понятными сообщениями; используйте ветки/PR и ревью.
- Обращайте внимание на безопасность: валидация входа, избегайте exec/eval, своевременное обновление зависимостей.

Некоторые «правильные» паттерны (примеры)
- f-strings:
  name = "Иван"
  greeting = f"Привет, {name}!"
- Контекстный менеджер для файлов:
  with open(path, "r", encoding="utf-8") as f:
      data = f.read()
- Избегать mutable default:
  def append_item(item, lst=None):
      if lst is None:
          lst = []
      lst.append(item)
      return lst
- Использовать dataclass для простых моделей:
  from dataclasses import dataclass
  @dataclass
  class User:
      id: int
      name: str

Инструменты, которые стоит включить в workflow
- Black, isort — автоматическое форматирование.
- flake8/pylint — стиль и потенциальные ошибки.
- mypy/pyright — статическая типизация.
- pytest — тесты, pytest-cov — покрытие.
- pre-commit — запуск линтеров/форматтеров при коммите.
- Dependabot/renovate — обновление зависимостей.
- CI — автоматический запуск тестов/лотинга при PR.

Как классифицировать баги (пятиуровневая шкала)
Разница между «важностью» (priority) и «критичностью» (severity). Ниже — шаблон определения severity и примерные действия.

1) Блокирующий (Blocker)
- Что это: система/функция не запускается вообще; невозможность работать; потеря данных для всех пользователей; критический security hole с эксплойтом.
- Примеры: приложение падает на старте; миграции базы данных испортили данные; утечка секретов.
- Действие: горячий фикс (hotfix), релиз немедленно, обходные пути не существуют, максимальный приоритет.

2) Критический (Critical)
- Что это: серьезная ошибка, влияющая на ключевые функции значительной части пользователей; данные искажаются; безопасность под угрозой, но есть временные меры.
- Примеры: расчет чека неверен для важных сценариев; API возвращает 5xx для большинства запросов.
- Действие: исправление в ближайшем релизе/быстрая коррекция, возможно временный rollback/фича-флаг.

3) Значительный (Major / Significant)
- Что это: функциональная ошибка, мешающая использованию фичи, но есть обходные пути; багы в больших сценариях.
- Примеры: фильтрация не работает в одном важном сценарии; крупные UI-ошибки в основной функциональности.
- Действие: планируется в ближайший спринт/релиз, высокий приоритет в разработке.

4) Незначительный (Minor)
- Что это: баги, не критичные для операций; незначительные функциональные или визуальные дефекты.
- Примеры: некорректная валидация в редком кейсе; производительность ухудшилась, но сервис остается работоспособным.
- Действие: может быть выполнено в обычном порядке; низкий приоритет.

5) Тривиальный (Trivial)
- Что это: косметические проблемы, опечатки, стилистика кода, небольшие улучшения.
- Примеры: опечатка в тексте, мелкий рефакторинг, несоблюдение PEP8.
- Действие: поправить в любой момент; иногда закрывают как «won’t fix» если несущественно.

Практическая рубрика для тикетов (чтобы всем было понятно)
- Заголовок: кратко и ясно.
- Описание: шаги воспроизведения, ожидаемое поведение, фактическое поведение.
- Важно: логи, трассировки стека, версия, окружение, приоритет и предложенная severity по шкале.
- Шаблон severity -> SLA:
  - Blocker: 0–4 ч на triage + immediate fix
  - Critical: 4–24 ч triage + hotfix within 1–2 days
  - Significant: 1–3 days triage + fix in next sprint
  - Minor: next sprint/backlog
  - Trivial: backlog / cosmetic

Советы по внедрению в команду
- Вводите pre-commit + CI, чтобы многие ошибки не попадали в main.
- Определите в команде четкие критерии для каждой severity (примеры в репозитории).
- Требуйте тесты для багфикс-коммитов (regression tests).
- Делайте код-ревью; это помогает стандартизировать стиль и качество.

Если хотите — могу:
- подготовить чеклист для PR (lint, tests, docs, type hints),
- привести конфигурацию pre-commit + black + flake8 + mypy,
- или составить шаблон тикета с полями для severity/SLA.

Напишите, что из этого вам нужнее — и я подготовлю конкретные примеры/файлы.
<blockquote>используя переменную severity_len</blockquote>
Как и указал <a href="https://qna.habr.com/user/Rsa97" rel="nofollow">Rsa97</a> , вы используете не ту переменную. Должно быть что-то вроде этого: <br/> <pre><code class="python">severity_list = ['Блокирующий', 'Критический', 'Значительный', 'Незначительный', 'Тривиальный']
severity_len = len(severity_list)
print(severity_list[severity_len - 1])</code></pre>
Похожие вопросы