Домашка: парсер ревью

Домашка

Промпт ревьюера собирается, модель отвечает JSON-ом — «почти». Присказки, заборы, гуляющие поля: сегодня вы напишете для devbuddy слой, который превращает «почти JSON» в чистые типизированные замечания. Этот парсер переживёт всё, что модель придумает, и станет фундаментом ревьюера из третьего модуля.

Описание задачи

Файл review_parser.py с датаклассом и функцией.

Основная функциональность

  • ReviewComment — dataclass с полями file: str, line: int, severity: str, message: str.

  • parse_review(raw: str) -> list[ReviewComment] — принимает сырой ответ модели и возвращает список замечаний. Порядок обработки:

    1. если в ответе есть ```json-забор — работать с его содержимым;

    2. иначе взять срез от первого [ до последнего ];

    3. распарсить JSON; если на выходе не список — ValueError;

    4. каждый элемент провалидировать:

      • file — непустая строка;

      • line — целое число ≥ 1 (не bool!);

      • severity — одно из "info", "warning", "critical";

      • message — непустая строка;

    5. при любой проблеме — ValueError с текстом, в котором есть индекс элемента и что именно не так.

Дополнительные условия

  • Только стандартная библиотека (json, dataclasses).

  • Ошибки парсинга JSON (json.JSONDecodeError) наружу не просачиваются: любое некорректное сырьё означает ValueError с понятным сообщением.

Как проверить себя

test_review_parser.py, запуск python -m pytest test_review_parser.py -v:

Обратите внимание на test_bool_is_not_a_line: True в питоне — это int, и ленивая проверка isinstance(line, int) его пропустит. type(line) is int — честная.

Пример работы программы

python
>>> from review_parser import parse_review
>>> parse_review('Держите: [{"file": "calc.py", "line": 7, "severity": "critical", "message": "деление на ноль"}]')
[ReviewComment(file='calc.py', line=7, severity='critical', message='деление на ноль')]
>>> parse_review('{"status": "всё ок, замечаний нет"}')
Traceback (most recent call last):
    ...
ValueError: в ответе нет JSON-массива: '{"status": "всё ок, замечаний нет"}'

Критерии готовности

  • Восемь тестов зелёные.

  • json.JSONDecodeError наружу не торчит — только ValueError с понятным текстом.

  • Коммит: review_parser.py и test_review_parser.py.

Проверьте на живой модели (необязательно)

Соберите промпт прошлой домашки, отправьте настоящей модели через LLMClient и прогоните ответ через parse_review. Поэкспериментируйте: уберите из промпта few-shot пример — и посмотрите, как часто парсеру придётся спасать ситуацию. Обычно после этого эксперимента роль примера в шаблоне перестаёт быть абстрактной.

  • theory icon

    Как устроены LLM: токены, контекст, цена

    10 мин

  • homework icon

    Домашка: токен-калькулятор

    4 мин

  • quiz icon

    Квиз: Как устроены LLM: токены, контекст, цена

    8 мин

  • theory icon

    Промпты как код: шаблоны и переменные

    8 мин

  • homework icon

    Домашка: промпт ревьюера

    3 мин

  • quiz icon

    Квиз: Промпты как код: шаблоны и переменные

    7 мин

  • theory icon

    Структурированный вывод: JSON вместо прозы

    6 мин

  • homework icon

    Домашка: парсер ревью

    3 мин

  • quiz icon

    Квиз: Структурированный вывод: JSON вместо прозы

    7 мин

  • theory icon

    Выбор модели: GPT, Claude, открытые

    7 мин

  • homework icon

    Домашка: бенчмарк вслепую

    4 мин

  • quiz icon

    Квиз: Выбор модели: GPT, Claude, открытые

    7 мин

  • homework icon

    HARD-задача: смета агента

    3 мин

  • theory icon

    Локальная модель: Ollama по-настоящему

    8 мин

  • quiz icon

    Квиз: Локальная модель: Ollama по-настоящему

    6 мин

🎯
Тренажёр собеседованияЗакрепите знания перед интервью