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

Постановка задач на Python

что указывать обязательно именно здесь

Что это

Четыре части запроса из статьи 3.2 работают везде. В этой статье — то, что нужно добавлять именно для Python, потому что без этого ИИ подставит своё.

Список короткий. Пять пунктов, и все пять — одна-две строки в запросе.

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

1. Версия Python

Не только библиотек (статья 2.11), но и самого языка. Между версиями меняется синтаксис:

ЧтоС какой версии
str | None вместо Optional[str]3.10
list[str] вместо List[str]3.9
match3.10
tomllib в стандартной библиотеке3.11
Группы исключений, except*3.11

Код с str | None на Python 3.9 падает с TypeError при импорте. Узнать свою версию:

python3 --version

2. Синхронно или асинхронно

Решается один раз и меняется потом дорого: синхронную функцию нельзя вызвать из асинхронной без обёртки, и наоборот.

Запрос
Проект асинхронный: aiogram 3, aiosqlite. Все функции,
которые ходят в сеть или базу, — async.

3. Что уже есть в проекте

Самый выгодный пункт из всех (статья 3.1, причина 2):

Запрос
Подключение к базе — через get_conn() из db.py.
Логирование — через log = logging.getLogger(__name__).
Свои варианты не изобретай.

4. Сигнатура

Для Python она работает особенно хорошо, потому что сразу задаёт и типы, и поведение при отсутствии данных:

Запрос
def find_city(name: str) -> str | None

Одна строка говорит: принимает строку, может не найти, и вызывающий обязан это проверить. Словами на то же ушёл бы абзац (статья 6.3).

5. Границы по стилю

Запрос
Пиши просто: обычные циклы вместо вложенных включений,
без walrus-оператора. Типы обязательно, mypy --strict
должен проходить.

Готовый шаблон

Лучше
Контекст: Python 3.12, aiogram 3.13, aiosqlite.
Проект асинхронный. Подключение к базе — get_conn() из db.py,
логирование — logging.getLogger(__name__).

Задача: функция в storage.py

    async def find_subs(user_id: int) -> list[str]

Возвращает список городов, на которые подписан пользователь.
Если подписок нет — пустой список, не None.

Границы: только эта функция, остальное не трогай.
Новых зависимостей не добавляй.

Готово, когда: mypy --strict проходит, и на пользователе
без подписок возвращается [].

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

Версия Python не названа. Самая дешёвая строка в запросе и одна из самых полезных.

Смешение синхронного и асинхронного. ИИ может выдать синхронную функцию в асинхронный проект — она заблокирует цикл (статья 6.4).

Своё подключение к базе. Признак того, что пункт 3 пропущен: в функции появился свой sqlite3.connect вместо get_conn().

Сигнатура без | None. Если функция может не найти результат, это обязано быть в типе. Иначе проверку забудут — и ты, и ИИ.

Шпаргалка

  • Пять пунктов: версия Python · sync или async · что уже есть · сигнатура · границы по стилю.

  • Версия языка важна не меньше версии библиотек.

  • Сигнатура с | None заменяет абзац объяснений.

  • «Подключение через get_conn(), свои варианты не изобретай».

  • «Готово, когда mypy --strict проходит» — проверяемый критерий.

  • Постоянные пункты вынеси в файл контекста проекта.