Программирование с ИИ
ENRU
3.12

Приём — примеры вход → выход

два примера вместо абзаца описания

Что это

Вместо того чтобы описывать словами, что должна делать функция, покажи пару «что пришло → что должно получиться». Два примера снимают больше неясности, чем абзац объяснений, и проверяются мгновенно.

Приём особенно силён там, где словами описывать долго и неточно: разбор текста, форматы, преобразования данных, граничные случаи.

Как выглядит в коде

Словами

Не так
Напиши функцию, которая нормализует номер телефона
в международный формат

Что такое «нормализует»? Какие форматы на входе? Что с пробелами и скобками? Что делать с номером без кода страны? Все эти развилки ИИ закроет сам.

Примерами

Лучше
Функция normalize_phone(raw: str) -> str | None.
Примеры:

"+47 912 34 567"   -> "+4791234567"
"47-912-34-567"    -> "+4791234567"
"912 34 567"       -> "+4791234567"   (нет кода — считаем норвежским)
"+7 999 123-45-67" -> "+79991234567"
"не телефон"       -> None
""                 -> None

Код страны по умолчанию передаётся аргументом default_cc="47".

Шесть строк закрывают всё: формат вывода, что делать с разделителями, поведение без кода страны, обработку мусора. Словами на то же ушло бы полстраницы, и что-нибудь всё равно осталось бы недосказанным.

Примеры заодно становятся тестами

Запрос
Сделай из этих примеров параметризованный тест pytest.

Один запрос — и проверка готова. Примеры, которыми ты объяснял задачу, превращаются в то, чем она проверяется. Это самый дешёвый способ получить тесты из статьи 3.9.

Как сказать ИИ

Сколько примеров нужно

Три-пять. Один показывает удачный случай и ничего не говорит о границах. Десять — избыточны и начинают противоречить друг другу.

Обязательно включи:

  • обычный случай — то, ради чего всё делается;
  • граничный — пустая строка, ноль, одна запись, максимальная длина;
  • неудачный — мусор на входе, и что при этом должно произойти.

Третий пункт пропускают чаще всего, а он решает больше всех: именно он говорит ИИ, возвращать None, кидать исключение или подставлять значение по умолчанию.

Формат записи

Стрелка и выравнивание читаются лучше прозы:

измерено
вход              -> выход

Если выход сложный — покажи его как есть, со структурой:

Запрос
Вход:  {"cod": "404", "message": "city not found"}
Выход: None

Вход:  {"main": {"temp": 4.2}, "weather": [{"main": "Rain"}]}
Выход: ("Rain", 4.2)

Где приём не подходит

Там, где результат нельзя записать строкой: интерфейс, архитектура, «сделай красиво». Для таких задач работают план (3.10) и вопросы (3.11).

На что смотреть

Код подогнан под примеры. Самая коварная ошибка: функция содержит if raw == "+47 912 34 567": return .... Выглядит рабочей, проходит все твои примеры и разваливается на седьмом входе. Прочитай код, а не только результат.

Примеры противоречат друг другу. Бывает, когда их много и писались они второпях. ИИ выберет какой-то один вариант молча. Если заметил противоречие в ответе — чини примеры, а не код.

Граничные случаи придуманы за тебя. Если ты не сказал, что делать с пустой строкой, в коде появится решение, которого ты не принимал. Проверь, какое.

Шпаргалка

  • Два-три примера «вход → выход» вместо абзаца описания.

  • Обязательно: обычный случай, граничный, неудачный.

  • Неудачный случай решает, что будет при мусоре на входе.

  • Примеры превращаются в тест одним запросом.

  • Проверь, что код решает задачу, а не подогнан под примеры.

  • Для задач без строкового результата приём не годится.