Тренажёр по code review на Python. Находите реальные проблемы в коде — баги, уязвимости, антипаттерны производительности, ошибки async/await и ООП.
Логические ошибки и неожиданное поведение: mutable defaults, замыкания в циклах, сравнение объектов, мутация коллекций при итерации
Неэффективные паттерны: конкатенация строк в цикле, O(n²) поиск в списке, лишние вычисления, загрузка всего файла в память
Уязвимости: SQL injection, shell injection, небезопасная десериализация, хардкод секретов, path traversal
Blocking calls в корутинах, отсутствие await, последовательные запросы вместо параллельных, fire-and-forget без обработки ошибок
Изменяемые атрибуты класса, God class, нарушение LSP, отсутствие вызова super().__init__
Bare except, проглатывание ошибок, потеря цепочки исключений, слишком широкий перехват при retry
В каждом упражнении — фрагмент реального Python-кода с несколькими правдоподобными вариантами проблем: часть из них настоящие, часть — дистракторы. Задача — выбрать именно реальные проблемы, а не переписать код заново. Разделы группируются по типам:
Логические ошибки и неожиданное поведение: mutable defaults, замыкания в циклах, сравнение объектов, мутация коллекций при итерации.
Уязвимости: SQL injection, shell injection, небезопасная десериализация, хардкод секретов, path traversal.
Неэффективные паттерны: конкатенация строк в цикле, O(n²) поиск в списке, лишние вычисления, загрузка всего файла в память.
Blocking calls в корутинах, отсутствие await, последовательные запросы вместо параллельных, fire-and-forget без обработки ошибок.
Изменяемые атрибуты класса, God class, нарушение LSP, отсутствие вызова super().__init__.
Bare except, проглатывание ошибок, потеря цепочки исключений, слишком широкий перехват при retry.
Вы видите блок кода и отмечаете строки, которые считаете проблемными. После отправки ответа — сразу оценка, объяснение по каждой отмеченной и пропущенной проблеме и исправленная версия кода. Конкретные ответы заранее не раскрываются — в этом смысл практики код-ревью.
Упражнения размечены по уровням Junior, Middle и Senior. С ростом уровня растёт не только тонкость самой проблемы, но и правдоподобность дистракторов — на Senior-уровне отличить реальную проблему от похожего, но корректного кода, заметно сложнее.